diff --git a/.github/workflows/manual-sol-artifacts.yaml b/.github/workflows/manual-sol-artifacts.yaml index 0ae918cf..f7a45bbb 100644 --- a/.github/workflows/manual-sol-artifacts.yaml +++ b/.github/workflows/manual-sol-artifacts.yaml @@ -7,23 +7,44 @@ on: required: true type: choice options: + # =================================================================== + # V4 (rain.vats 0.1.6 — audited build). Deploy these in the listed + # order; later entries reference earlier ones via dependency pointers + # so an out-of-order run trips the dep-codehash check. + # =================================================================== # 1. Implementations (no dependencies, deploy first) - - stox-receipt - - stox-receipt-vault - - stox-wrapped-token-vault - # 2. Beacon (depends on stox-wrapped-token-vault) - - stox-wrapped-token-vault-beacon + - stox-receipt-v4 + - stox-receipt-vault-v4 + - stox-wrapped-token-vault-v4 + # 2. Beacon (depends on stox-wrapped-token-vault-v4) + - stox-wrapped-token-vault-beacon-v4 # 3. Deployers (depend on their beacons/implementations) - - stox-wrapped-token-vault-beacon-set-deployer - - stox-offchain-asset-receipt-vault-beacon-set-deployer - # 4. Unified deployer (no on-chain dependencies) - - stox-unified-deployer + - stox-wrapped-token-vault-beacon-set-deployer-v4 + - stox-offchain-asset-receipt-vault-beacon-set-deployer-v4 + # 4. Unified deployer (depends on the two set-deployers above) + - stox-unified-deployer-v4 # 5. Authorizers (no on-chain dependencies) - - stox-offchain-asset-receipt-vault-authorizer-v1 - - stox-offchain-asset-receipt-vault-payment-mint-authorizer-v1 + - stox-offchain-asset-receipt-vault-authorizer-v1-v4 + - stox-offchain-asset-receipt-vault-payment-mint-authorizer-v1-v4 + # 6. Corporate-actions facet (no on-chain dependencies — the + # receipt-vault impl hardcodes its address but doesn't link to it + # at deploy time). + - stox-corporate-actions-facet-v4 jobs: deploy: uses: rainlanguage/rainix/.github/workflows/rainix-manual-sol-artifacts.yaml@main with: suite: ${{ inputs.suite }} - secrets: inherit + # The reusable workflow lives in a different org (rainlanguage), so + # `secrets: inherit` does not forward this repo's secrets to it — they must + # be passed explicitly. Only the secrets this repo actually holds are + # listed; the reusable workflow declares the full set as optional and falls + # back to `|| vars.* || ''` for any it isn't given. + secrets: + PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} + RPC_URL_ARBITRUM_FORK: ${{ secrets.RPC_URL_ARBITRUM_FORK }} + RPC_URL_BASE_FORK: ${{ secrets.RPC_URL_BASE_FORK }} + RPC_URL_BASE_SEPOLIA_FORK: ${{ secrets.RPC_URL_BASE_SEPOLIA_FORK }} + RPC_URL_FLARE_FORK: ${{ secrets.RPC_URL_FLARE_FORK }} + RPC_URL_POLYGON_FORK: ${{ secrets.RPC_URL_POLYGON_FORK }} + CI_DEPLOY_BASE_ETHERSCAN_API_KEY: ${{ secrets.CI_DEPLOY_BASE_ETHERSCAN_API_KEY }} diff --git a/CLAUDE.md b/CLAUDE.md index 6707eb51..d46c0a3d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -228,14 +228,15 @@ this stack. - Solidity 0.8.25 (exact pin `=0.8.25` in contracts, `^0.8.25` in libraries) - EVM target: Cancun -- Optimizer: 24483 runs — empirically the highest value where `StoxReceiptVault` - runtime stays under EIP-170 (24,576 bytes). The setting is a runtime-gas vs +- Optimizer: 5000 runs — `StoxReceiptVault` is the contract that binds against + EIP-170 (24,576-byte runtime limit), and 5000 keeps it under the limit while + the rest of the suite stays well clear. The setting is a runtime-gas vs deploy-bytecode tradeoff (high values inline aggressively for fast runtime at - the cost of deployed bytecode size); we pin the highest value that keeps the - vault deployable to mainnet chains. 500-byte margin at this value — sensitive - to vault source changes and dependency-tree bytecode shifts. Re-run the binary - search if the vault size approaches the limit again. The corresponding - `foundry.toml` comment block flags this; both must stay in sync. + the cost of deployed bytecode size). The margin is thin and sensitive to vault + source changes and dependency-tree bytecode shifts — re-check + `StoxReceiptVault`'s `forge build --sizes` runtime margin on any such change. + The corresponding `foundry.toml` comment block flags this; both must stay in + sync. - `via_ir` is OFF. IR was tried (#144) and made the vault larger for our inheritance shape, opposite of the goal. Don't enable without a measurement showing it now helps. @@ -270,23 +271,31 @@ library. When making changes to contract source: ## Deployment `script/Deploy.sol` dispatches based on `DEPLOYMENT_SUITE` env var. One contract -per suite to avoid Zoltu factory nonce issues: - -- `stox-receipt` — deploys StoxReceipt -- `stox-receipt-vault` — deploys StoxReceiptVault -- `stox-wrapped-token-vault` — deploys StoxWrappedTokenVault -- `stox-wrapped-token-vault-beacon` — deploys StoxWrappedTokenVaultBeacon +per suite to avoid Zoltu factory nonce issues. Every suite targets the +`LibProdDeployV4` (rain.vats 0.1.6) pins and deploys to Base; the frozen pre-V4 +deployments live in `LibProdDeployV1` / `LibProdDeployV2` as an audit trail and +are not redeployable from the current source. + +- `stox-receipt-v4` — deploys StoxReceipt +- `stox-receipt-vault-v4` — deploys StoxReceiptVault +- `stox-wrapped-token-vault-v4` — deploys StoxWrappedTokenVault +- `stox-wrapped-token-vault-beacon-v4` — deploys StoxWrappedTokenVaultBeacon (depends on StoxWrappedTokenVault) -- `stox-wrapped-token-vault-beacon-set-deployer` — deploys +- `stox-wrapped-token-vault-beacon-set-deployer-v4` — deploys StoxWrappedTokenVaultBeaconSetDeployer (depends on beacon) -- `stox-offchain-asset-receipt-vault-beacon-set-deployer` — deploys +- `stox-offchain-asset-receipt-vault-beacon-set-deployer-v4` — deploys StoxOffchainAssetReceiptVaultBeaconSetDeployer (depends on StoxReceipt, StoxReceiptVault) -- `stox-unified-deployer` — deploys StoxUnifiedDeployer -- `stox-corporate-actions-facet` — deploys StoxCorporateActionsFacet - -Manual deployment via GitHub Actions workflow (`manual-sol-artifacts.yaml`) -supports multiple networks. +- `stox-unified-deployer-v4` — deploys StoxUnifiedDeployer (depends on both + beacon-set deployers) +- `stox-offchain-asset-receipt-vault-authorizer-v1-v4` — deploys + StoxOffchainAssetReceiptVaultAuthorizerV1 +- `stox-offchain-asset-receipt-vault-payment-mint-authorizer-v1-v4` — deploys + StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1 +- `stox-corporate-actions-facet-v4` — deploys StoxCorporateActionsFacet + +Manual deployment runs via the GitHub Actions workflow +(`manual-sol-artifacts.yaml`), which deploys to Base. ## Naming Conventions diff --git a/foundry.toml b/foundry.toml index 55f108ea..a0fae94e 100644 --- a/foundry.toml +++ b/foundry.toml @@ -5,15 +5,15 @@ libs = ['dependencies'] solc = "0.8.25" optimizer = true -# `optimizer_runs` is a runtime-gas vs deploy-bytecode tradeoff: high values -# inline aggressively for fast runtime at the cost of deployed bytecode size. -# StoxReceiptVault is at the EIP-170 24,576-byte limit. 24483 is the highest -# value found by empirical binary search (legacy pipeline; via_ir was tried -# in #144 and made the vault larger) where StoxReceiptVault stays under -# EIP-170. 24484 trips the limit. Re-run the search if vault source changes -# or the dependency tree's bytecode shifts under us; the boundary is -# sensitive and not stable across compiler versions or refactors. -optimizer_runs = 24483 +# `optimizer_runs` is a runtime-gas vs deploy-bytecode tradeoff: higher values +# inline aggressively for faster runtime at the cost of larger deployed +# bytecode. StoxReceiptVault is the contract that binds against the EIP-170 +# 24,576-byte runtime limit; 5000 keeps it under the limit while the rest of +# the suite stays well clear. The margin is thin and sensitive to vault source +# changes and dependency-tree bytecode shifts — re-check StoxReceiptVault's +# `forge build --sizes` runtime margin on any such change. via_ir is OFF (tried +# in #144, made the vault larger for this inheritance shape). +optimizer_runs = 5000 evm_version = "cancun" @@ -40,7 +40,7 @@ remappings = [ forge-std = "1.16.1" "@openzeppelin-contracts" = "5.6.1" "@openzeppelin-contracts-upgradeable" = "5.6.1" -"rain-deploy" = "0.1.3" +"rain-deploy" = "0.1.4" "rain-extrospection" = "0.1.1" "rain-factory" = "0.1.1" "rain-math-fixedpoint" = "0.2.0" diff --git a/remappings.txt b/remappings.txt index ed1a0130..51d38713 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1,7 +1,7 @@ @openzeppelin-contracts-5.6.1/=dependencies/@openzeppelin-contracts-5.6.1/ @openzeppelin-contracts-upgradeable-5.6.1/=dependencies/@openzeppelin-contracts-upgradeable-5.6.1/ forge-std-1.16.1/=dependencies/forge-std-1.16.1/ -rain-deploy-0.1.3/=dependencies/rain-deploy-0.1.3/ +rain-deploy-0.1.4/=dependencies/rain-deploy-0.1.4/ rain-extrospection-0.1.1/=dependencies/rain-extrospection-0.1.1/ rain-factory-0.1.1/=dependencies/rain-factory-0.1.1/ rain-math-fixedpoint-0.2.0/=dependencies/rain-math-fixedpoint-0.2.0/ diff --git a/script/BuildPointers.sol b/script/BuildPointers.sol index d8bad35f..62ca5ada 100644 --- a/script/BuildPointers.sol +++ b/script/BuildPointers.sol @@ -5,7 +5,7 @@ pragma solidity =0.8.25; import {Script} from "forge-std-1.16.1/src/Script.sol"; import {LibCodeGen} from "rain-sol-codegen-0.1.0/src/lib/LibCodeGen.sol"; import {LibFs} from "rain-sol-codegen-0.1.0/src/lib/LibFs.sol"; -import {LibRainDeploy} from "rain-deploy-0.1.3/src/lib/LibRainDeploy.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; import {StoxReceipt} from "../src/concrete/StoxReceipt.sol"; import {StoxReceiptVault} from "../src/concrete/StoxReceiptVault.sol"; import {StoxCorporateActionsFacet} from "../src/concrete/StoxCorporateActionsFacet.sol"; diff --git a/script/Deploy.sol b/script/Deploy.sol index 9304ddc4..14820464 100644 --- a/script/Deploy.sol +++ b/script/Deploy.sol @@ -4,9 +4,9 @@ pragma solidity =0.8.25; import {Script, console2} from "forge-std-1.16.1/src/Script.sol"; -import {LibRainDeploy} from "rain-deploy-0.1.3/src/lib/LibRainDeploy.sol"; -import {LibProdDeployV2} from "../src/lib/LibProdDeployV2.sol"; -import {LibProdDeployV3} from "../src/lib/LibProdDeployV3.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; +import {LibProdDeployV4} from "../src/lib/LibProdDeployV4.sol"; +import {LibStoxDeployNetworks} from "../src/lib/LibStoxDeployNetworks.sol"; import {StoxReceipt} from "../src/concrete/StoxReceipt.sol"; import {StoxReceiptVault} from "../src/concrete/StoxReceiptVault.sol"; import {StoxWrappedTokenVault} from "../src/concrete/StoxWrappedTokenVault.sol"; @@ -31,29 +31,33 @@ import {StoxCorporateActionsFacet} from "../src/concrete/StoxCorporateActionsFac error UnknownDeploymentSuite(bytes32 suite); // One suite per contract to avoid Zoltu factory nonce issues. +// +// V4 (rain.vats 0.1.6 — audited build) suite ids. Each suite asserts against the +// corresponding `LibProdDeployV4` pin so a mid-deploy bytecode drift trips the +// codehash check before broadcast. The frozen pre-V4 deployments live in +// `LibProdDeployV1` / `LibProdDeployV2` as an audit trail and are not +// redeployable from the current source. -bytes32 constant DEPLOYMENT_SUITE_STOX_RECEIPT = keccak256("stox-receipt"); -bytes32 constant DEPLOYMENT_SUITE_STOX_RECEIPT_VAULT = keccak256("stox-receipt-vault"); -bytes32 constant DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT = keccak256("stox-wrapped-token-vault"); -bytes32 constant DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_BEACON = keccak256("stox-wrapped-token-vault-beacon"); -bytes32 constant DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER = - keccak256("stox-wrapped-token-vault-beacon-set-deployer"); -bytes32 constant DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER = - keccak256("stox-offchain-asset-receipt-vault-beacon-set-deployer"); -bytes32 constant DEPLOYMENT_SUITE_STOX_UNIFIED_DEPLOYER = keccak256("stox-unified-deployer"); -bytes32 constant DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1 = - keccak256("stox-offchain-asset-receipt-vault-authorizer-v1"); -bytes32 constant DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1 = - keccak256("stox-offchain-asset-receipt-vault-payment-mint-authorizer-v1"); -bytes32 constant DEPLOYMENT_SUITE_STOX_CORPORATE_ACTIONS_FACET = keccak256("stox-corporate-actions-facet"); +bytes32 constant DEPLOYMENT_SUITE_STOX_RECEIPT_V4 = keccak256("stox-receipt-v4"); +bytes32 constant DEPLOYMENT_SUITE_STOX_RECEIPT_VAULT_V4 = keccak256("stox-receipt-vault-v4"); +bytes32 constant DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_V4 = keccak256("stox-wrapped-token-vault-v4"); +bytes32 constant DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_BEACON_V4 = keccak256("stox-wrapped-token-vault-beacon-v4"); +bytes32 constant DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_V4 = + keccak256("stox-wrapped-token-vault-beacon-set-deployer-v4"); +bytes32 constant DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_V4 = + keccak256("stox-offchain-asset-receipt-vault-beacon-set-deployer-v4"); +bytes32 constant DEPLOYMENT_SUITE_STOX_UNIFIED_DEPLOYER_V4 = keccak256("stox-unified-deployer-v4"); +bytes32 constant DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_V4 = + keccak256("stox-offchain-asset-receipt-vault-authorizer-v1-v4"); +bytes32 constant DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_V4 = + keccak256("stox-offchain-asset-receipt-vault-payment-mint-authorizer-v1-v4"); +bytes32 constant DEPLOYMENT_SUITE_STOX_CORPORATE_ACTIONS_FACET_V4 = keccak256("stox-corporate-actions-facet-v4"); contract Deploy is Script { - mapping(string => mapping(address => bytes32)) internal depCodeHashes; - - /// @dev Deploys a single contract via the Zoltu deterministic deployer - /// across all supported networks. Reads `DEPLOYMENT_KEY` from the - /// environment, logs diagnostic information (expected address, codehash, - /// dependency state), then delegates to `LibRainDeploy.deployAndBroadcast`. + /// @dev Deploys a single contract via the Zoltu deterministic deployer on + /// Base. Reads `DEPLOYMENT_KEY` from the environment, logs diagnostic + /// information (expected address, codehash, dependency state), then + /// delegates to `LibRainDeploy.deployAndBroadcast`. /// @param creationCode The creation bytecode of the contract to deploy. /// @param contractPath Fully qualified contract path /// (e.g. "src/concrete/StoxReceipt.sol:StoxReceipt"). @@ -70,7 +74,7 @@ contract Deploy is Script { bytes32 expectedCodeHash, address[] memory dependencies ) internal { - string[] memory networks = LibRainDeploy.supportedNetworks(); + string[] memory networks = LibStoxDeployNetworks.supportedNetworks(); uint256 deployerPrivateKey = vm.envUint("DEPLOYMENT_KEY"); console2.log("Suite deploying:", contractPath); @@ -95,108 +99,107 @@ contract Deploy is Script { contractPath, expectedAddress, expectedCodeHash, - dependencies, - depCodeHashes + dependencies ); } /// @notice Entry point for the deployment script. /// @dev Requires env vars: /// - `DEPLOYMENT_KEY`: private key for the deployer account. - /// - `DEPLOYMENT_SUITE`: which contract to deploy (e.g. "stox-receipt", - /// "stox-wrapped-token-vault-beacon", etc.). One contract per run. + /// - `DEPLOYMENT_SUITE`: which contract to deploy (e.g. "stox-receipt-v4", + /// "stox-wrapped-token-vault-beacon-v4", etc.). One contract per run. function run() public { bytes32 suite = keccak256(bytes(vm.envString("DEPLOYMENT_SUITE"))); address[] memory noDeps = new address[](0); - if (suite == DEPLOYMENT_SUITE_STOX_RECEIPT) { + if (suite == DEPLOYMENT_SUITE_STOX_RECEIPT_V4) { deploySuite( type(StoxReceipt).creationCode, "src/concrete/StoxReceipt.sol:StoxReceipt", - LibProdDeployV2.STOX_RECEIPT, - LibProdDeployV2.STOX_RECEIPT_CODEHASH, + LibProdDeployV4.STOX_RECEIPT_RAIN_VATS_0_1_6, + LibProdDeployV4.STOX_RECEIPT_CODEHASH_RAIN_VATS_0_1_6, noDeps ); - } else if (suite == DEPLOYMENT_SUITE_STOX_RECEIPT_VAULT) { + } else if (suite == DEPLOYMENT_SUITE_STOX_RECEIPT_VAULT_V4) { deploySuite( type(StoxReceiptVault).creationCode, "src/concrete/StoxReceiptVault.sol:StoxReceiptVault", - LibProdDeployV2.STOX_RECEIPT_VAULT, - LibProdDeployV2.STOX_RECEIPT_VAULT_CODEHASH, + LibProdDeployV4.STOX_RECEIPT_VAULT_RAIN_VATS_0_1_6, + LibProdDeployV4.STOX_RECEIPT_VAULT_CODEHASH_RAIN_VATS_0_1_6, noDeps ); - } else if (suite == DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT) { + } else if (suite == DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_V4) { deploySuite( type(StoxWrappedTokenVault).creationCode, "src/concrete/StoxWrappedTokenVault.sol:StoxWrappedTokenVault", - LibProdDeployV2.STOX_WRAPPED_TOKEN_VAULT, - LibProdDeployV2.STOX_WRAPPED_TOKEN_VAULT_CODEHASH, + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_RAIN_VATS_0_1_6, + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_CODEHASH_RAIN_VATS_0_1_6, noDeps ); - } else if (suite == DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_BEACON) { + } else if (suite == DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_BEACON_V4) { address[] memory deps = new address[](1); - deps[0] = LibProdDeployV2.STOX_WRAPPED_TOKEN_VAULT; + deps[0] = LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_RAIN_VATS_0_1_6; deploySuite( type(StoxWrappedTokenVaultBeacon).creationCode, "src/concrete/StoxWrappedTokenVaultBeacon.sol:StoxWrappedTokenVaultBeacon", - LibProdDeployV2.STOX_WRAPPED_TOKEN_VAULT_BEACON, - LibProdDeployV2.STOX_WRAPPED_TOKEN_VAULT_BEACON_CODEHASH, + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_0_1_6, + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_CODEHASH_RAIN_VATS_0_1_6, deps ); - } else if (suite == DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER) { + } else if (suite == DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_V4) { address[] memory deps = new address[](1); - deps[0] = LibProdDeployV2.STOX_WRAPPED_TOKEN_VAULT_BEACON; + deps[0] = LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_0_1_6; deploySuite( type(StoxWrappedTokenVaultBeaconSetDeployer).creationCode, "src/concrete/deploy/StoxWrappedTokenVaultBeaconSetDeployer.sol:StoxWrappedTokenVaultBeaconSetDeployer", - LibProdDeployV2.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER, - LibProdDeployV2.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_CODEHASH, + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6, + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_CODEHASH_RAIN_VATS_0_1_6, deps ); - } else if (suite == DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER) { + } else if (suite == DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_V4) { address[] memory deps = new address[](2); - deps[0] = LibProdDeployV2.STOX_RECEIPT; - deps[1] = LibProdDeployV2.STOX_RECEIPT_VAULT; + deps[0] = LibProdDeployV4.STOX_RECEIPT_RAIN_VATS_0_1_6; + deps[1] = LibProdDeployV4.STOX_RECEIPT_VAULT_RAIN_VATS_0_1_6; deploySuite( type(StoxOffchainAssetReceiptVaultBeaconSetDeployer).creationCode, "src/concrete/deploy/StoxOffchainAssetReceiptVaultBeaconSetDeployer.sol:StoxOffchainAssetReceiptVaultBeaconSetDeployer", - LibProdDeployV2.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER, - LibProdDeployV2.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CODEHASH, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CODEHASH_RAIN_VATS_0_1_6, deps ); - } else if (suite == DEPLOYMENT_SUITE_STOX_UNIFIED_DEPLOYER) { + } else if (suite == DEPLOYMENT_SUITE_STOX_UNIFIED_DEPLOYER_V4) { address[] memory deps = new address[](2); - deps[0] = LibProdDeployV2.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER; - deps[1] = LibProdDeployV2.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER; + deps[0] = LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6; + deps[1] = LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6; deploySuite( type(StoxUnifiedDeployer).creationCode, "src/concrete/deploy/StoxUnifiedDeployer.sol:StoxUnifiedDeployer", - LibProdDeployV2.STOX_UNIFIED_DEPLOYER, - LibProdDeployV2.STOX_UNIFIED_DEPLOYER_CODEHASH, + LibProdDeployV4.STOX_UNIFIED_DEPLOYER_RAIN_VATS_0_1_6, + LibProdDeployV4.STOX_UNIFIED_DEPLOYER_CODEHASH_RAIN_VATS_0_1_6, deps ); - } else if (suite == DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1) { + } else if (suite == DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_V4) { deploySuite( type(StoxOffchainAssetReceiptVaultAuthorizerV1).creationCode, "src/concrete/authorize/StoxOffchainAssetReceiptVaultAuthorizerV1.sol:StoxOffchainAssetReceiptVaultAuthorizerV1", - LibProdDeployV2.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1, - LibProdDeployV2.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_CODEHASH, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_RAIN_VATS_0_1_6, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_CODEHASH_RAIN_VATS_0_1_6, noDeps ); - } else if (suite == DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1) { + } else if (suite == DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_V4) { deploySuite( type(StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1).creationCode, "src/concrete/authorize/StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1.sol:StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1", - LibProdDeployV2.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1, - LibProdDeployV2.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_CODEHASH, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_RAIN_VATS_0_1_6, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_CODEHASH_RAIN_VATS_0_1_6, noDeps ); - } else if (suite == DEPLOYMENT_SUITE_STOX_CORPORATE_ACTIONS_FACET) { + } else if (suite == DEPLOYMENT_SUITE_STOX_CORPORATE_ACTIONS_FACET_V4) { deploySuite( type(StoxCorporateActionsFacet).creationCode, "src/concrete/StoxCorporateActionsFacet.sol:StoxCorporateActionsFacet", - LibProdDeployV3.STOX_CORPORATE_ACTIONS_FACET, - LibProdDeployV3.STOX_CORPORATE_ACTIONS_FACET_CODEHASH, + LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_RAIN_VATS_0_1_6, + LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_CODEHASH_RAIN_VATS_0_1_6, noDeps ); } else { diff --git a/slither.config.json b/slither.config.json index 4aa7e69b..7259bc29 100644 --- a/slither.config.json +++ b/slither.config.json @@ -1,4 +1,4 @@ { - "detectors_to_exclude": "solc-version,block-timestamp,unused-imports,different-pragma-directives-are-used,assembly-usage,unindexed-event-address", + "detectors_to_exclude": "solc-version,block-timestamp,unused-imports,different-pragma-directives-are-used,assembly-usage,unindexed-event-address,too-many-digits", "filter_paths": "dependencies/" } diff --git a/soldeer.lock b/soldeer.lock index 85ce259d..33997070 100644 --- a/soldeer.lock +++ b/soldeer.lock @@ -21,10 +21,10 @@ integrity = "60e55d10150354ca4a1e2985c5456c834b92b82ef85ab0e1d92a7786cddbd219" [[dependencies]] name = "rain-deploy" -version = "0.1.3" -url = "https://soldeer-revisions.s3.amazonaws.com/rain-deploy/0_1_3_20-05-2026_13:02:35_rain.zip" -checksum = "6e9a7a1562ee2766a1cc3a4a077b853ec628a3070b282e6e9102a252f2a6a5b5" -integrity = "10bff708d9e5d8b77655b8a8fc0c755cef8e3fc876cc3ff100425d27b08294a0" +version = "0.1.4" +url = "https://soldeer-revisions.s3.amazonaws.com/rain-deploy/0_1_4_29-06-2026_12:21:08_rain.zip" +checksum = "9b31431aec1f2fa6b7ea54e237f231449aeb38a98058d5b4042702857920646e" +integrity = "b02bcfad421df925d73e2bb86e57565d267d80924b07530350bdf3020e6850fb" [[dependencies]] name = "rain-extrospection" diff --git a/src/concrete/StoxReceiptVault.sol b/src/concrete/StoxReceiptVault.sol index 845fa525..3bd37bd0 100644 --- a/src/concrete/StoxReceiptVault.sol +++ b/src/concrete/StoxReceiptVault.sol @@ -9,7 +9,7 @@ import {LibCorporateAction, SCHEDULE_CORPORATE_ACTION, CANCEL_CORPORATE_ACTION} import {LibRebase} from "../lib/LibRebase.sol"; import {LibTotalSupply} from "../lib/LibTotalSupply.sol"; import {LibERC20Storage} from "../lib/LibERC20Storage.sol"; -import {LibProdDeployV3} from "../lib/LibProdDeployV3.sol"; +import {LibProdDeployV4} from "../lib/LibProdDeployV4.sol"; import {AuthorizerMissingCorporateActionAdmin} from "../error/ErrCorporateAction.sol"; /// @title StoxReceiptVault @@ -157,7 +157,7 @@ contract StoxReceiptVault is OffchainAssetReceiptVault { /// @notice Routes calls with non-matching selectors to the corporate actions /// facet via delegatecall. The facet address is hardcoded to its - /// deterministic Zoltu deploy address from `LibProdDeployV3`. + /// deterministic Zoltu deploy address from `LibProdDeployV4`. /// /// @dev Baking the facet address into the vault implementation bytecode /// means upgrading the facet requires upgrading the vault implementation @@ -178,7 +178,7 @@ contract StoxReceiptVault is OffchainAssetReceiptVault { /// per-function comments for the per-method argument that the /// linked-list and cursor writes remain consistent under re-entry. fallback() external payable virtual override { - address facet = LibProdDeployV3.STOX_CORPORATE_ACTIONS_FACET; + address facet = LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_RAIN_VATS_0_1_6; assembly ("memory-safe") { calldatacopy(0, 0, calldatasize()) let success := delegatecall(gas(), facet, 0, calldatasize(), 0, 0) diff --git a/src/concrete/StoxWrappedTokenVaultBeacon.sol b/src/concrete/StoxWrappedTokenVaultBeacon.sol index b39fbb9f..1ca64988 100644 --- a/src/concrete/StoxWrappedTokenVaultBeacon.sol +++ b/src/concrete/StoxWrappedTokenVaultBeacon.sol @@ -3,13 +3,13 @@ pragma solidity =0.8.25; import {UpgradeableBeacon} from "@openzeppelin-contracts-5.6.1/proxy/beacon/UpgradeableBeacon.sol"; -import {LibProdDeployV3} from "../lib/LibProdDeployV3.sol"; +import {LibProdDeployV4} from "../lib/LibProdDeployV4.sol"; /// @title StoxWrappedTokenVaultBeacon /// @notice An UpgradeableBeacon with hardcoded owner and implementation, /// enabling deterministic deployment via the Zoltu factory. -/// @dev Constructor passes `LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT` as the -/// beacon implementation and `LibProdDeployV3.BEACON_INITIAL_OWNER` as the +/// @dev Constructor passes `LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_RAIN_VATS_0_1_6` as the +/// beacon implementation and `LibProdDeployV4.BEACON_INITIAL_OWNER` as the /// initial owner. The owner can upgrade the implementation via `upgradeTo` or /// transfer ownership via `transferOwnership`. /// @@ -24,5 +24,5 @@ import {LibProdDeployV3} from "../lib/LibProdDeployV3.sol"; /// before this beacon is deployed, because the `UpgradeableBeacon` constructor /// validates that the implementation address has code. contract StoxWrappedTokenVaultBeacon is - UpgradeableBeacon(LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT, LibProdDeployV3.BEACON_INITIAL_OWNER) + UpgradeableBeacon(LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_RAIN_VATS_0_1_6, LibProdDeployV4.BEACON_INITIAL_OWNER) {} diff --git a/src/concrete/deploy/StoxOffchainAssetReceiptVaultBeaconSetDeployer.sol b/src/concrete/deploy/StoxOffchainAssetReceiptVaultBeaconSetDeployer.sol index 5dbbdb38..31b0dc22 100644 --- a/src/concrete/deploy/StoxOffchainAssetReceiptVaultBeaconSetDeployer.sol +++ b/src/concrete/deploy/StoxOffchainAssetReceiptVaultBeaconSetDeployer.sol @@ -6,16 +6,16 @@ import { OffchainAssetReceiptVaultBeaconSetDeployer, OffchainAssetReceiptVaultBeaconSetDeployerConfig } from "rain-vats-0.1.6/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol"; -import {LibProdDeployV3} from "../../lib/LibProdDeployV3.sol"; +import {LibProdDeployV4} from "../../lib/LibProdDeployV4.sol"; /// @title StoxOffchainAssetReceiptVaultBeaconSetDeployer /// @notice Inherits OffchainAssetReceiptVaultBeaconSetDeployer with a -/// parameterless constructor that hardcodes the config from LibProdDeployV3. +/// parameterless constructor that hardcodes the config from LibProdDeployV4. /// This makes the contract Zoltu-deployable. contract StoxOffchainAssetReceiptVaultBeaconSetDeployer is OffchainAssetReceiptVaultBeaconSetDeployer(OffchainAssetReceiptVaultBeaconSetDeployerConfig({ - initialOwner: LibProdDeployV3.BEACON_INITIAL_OWNER, - initialReceiptImplementation: LibProdDeployV3.STOX_RECEIPT, - initialOffchainAssetReceiptVaultImplementation: LibProdDeployV3.STOX_RECEIPT_VAULT + initialOwner: LibProdDeployV4.BEACON_INITIAL_OWNER, + initialReceiptImplementation: LibProdDeployV4.STOX_RECEIPT_RAIN_VATS_0_1_6, + initialOffchainAssetReceiptVaultImplementation: LibProdDeployV4.STOX_RECEIPT_VAULT_RAIN_VATS_0_1_6 })) {} diff --git a/src/concrete/deploy/StoxUnifiedDeployer.sol b/src/concrete/deploy/StoxUnifiedDeployer.sol index 4e49b4e1..f0fccf56 100644 --- a/src/concrete/deploy/StoxUnifiedDeployer.sol +++ b/src/concrete/deploy/StoxUnifiedDeployer.sol @@ -9,7 +9,7 @@ import { } from "rain-vats-0.1.6/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol"; import {IERC165} from "@openzeppelin-contracts-5.6.1/utils/introspection/IERC165.sol"; import {StoxWrappedTokenVaultBeaconSetDeployer} from "./StoxWrappedTokenVaultBeaconSetDeployer.sol"; -import {LibProdDeployV3} from "../../lib/LibProdDeployV3.sol"; +import {LibProdDeployV4} from "../../lib/LibProdDeployV4.sol"; import {StoxWrappedTokenVault} from "../StoxWrappedTokenVault.sol"; import {IStoxUnifiedDeployerV1} from "../../interface/IStoxUnifiedDeployerV1.sol"; @@ -41,10 +41,10 @@ contract StoxUnifiedDeployer is IERC165, IStoxUnifiedDeployerV1 { // slither-disable-next-line reentrancy-events function newTokenAndWrapperVault(OffchainAssetReceiptVaultConfigV2 memory config) external { OffchainAssetReceiptVault asset = OffchainAssetReceiptVaultBeaconSetDeployer( - LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newOffchainAssetReceiptVault(config); StoxWrappedTokenVault wrappedTokenVault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); emit Deployment(msg.sender, address(asset), address(wrappedTokenVault)); diff --git a/src/concrete/deploy/StoxWrappedTokenVaultBeaconSetDeployer.sol b/src/concrete/deploy/StoxWrappedTokenVaultBeaconSetDeployer.sol index a479094e..cf4d88c6 100644 --- a/src/concrete/deploy/StoxWrappedTokenVaultBeaconSetDeployer.sol +++ b/src/concrete/deploy/StoxWrappedTokenVaultBeaconSetDeployer.sol @@ -6,7 +6,7 @@ import {BeaconProxy} from "@openzeppelin-contracts-5.6.1/proxy/beacon/BeaconProx import {IERC165} from "@openzeppelin-contracts-5.6.1/utils/introspection/IERC165.sol"; import {StoxWrappedTokenVault} from "../StoxWrappedTokenVault.sol"; import {ICLONEABLE_V2_SUCCESS} from "rain-factory-0.1.1/src/interface/ICloneableV2.sol"; -import {LibProdDeployV3} from "../../lib/LibProdDeployV3.sol"; +import {LibProdDeployV4} from "../../lib/LibProdDeployV4.sol"; import {IStoxWrappedTokenVaultBeaconSetDeployerV1} from "../../interface/IStoxWrappedTokenVaultBeaconSetDeployerV1.sol"; /// @dev Error raised when the StoxWrappedTokenVault initialization fails. @@ -49,8 +49,9 @@ contract StoxWrappedTokenVaultBeaconSetDeployer is IERC165, IStoxWrappedTokenVau revert ZeroVaultAsset(); } - StoxWrappedTokenVault stoxWrappedTokenVault = - StoxWrappedTokenVault(address(new BeaconProxy(LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON, ""))); + StoxWrappedTokenVault stoxWrappedTokenVault = StoxWrappedTokenVault( + address(new BeaconProxy(LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_0_1_6, "")) + ); emit Deployment(msg.sender, address(stoxWrappedTokenVault)); diff --git a/src/generated/StoxCorporateActionsFacet.pointers.sol b/src/generated/StoxCorporateActionsFacet.pointers.sol index e4a51bf5..a7169c16 100644 --- a/src/generated/StoxCorporateActionsFacet.pointers.sol +++ b/src/generated/StoxCorporateActionsFacet.pointers.sol @@ -10,16 +10,16 @@ pragma solidity ^0.8.25; // file needs the contract to exist so that it can be compiled. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x90ace0ac65308dca37ec165bab1fd33aef0e2d88fd1a1eadd58a377f10f0c3c2); +bytes32 constant BYTECODE_HASH = bytes32(0x2a67c52129dff74d956bb7dcde1aac598c28dd29685237aca56dccb1d49bd6f8); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xDb479091164A15f1Ba29dE513776fFFbb4A9F0aF); +address constant DEPLOYED_ADDRESS = address(0x51f78B77EdffDB62b8AeB753066C318a46D05D74); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"60a0604052348015600e575f80fd5b503060805260805161221261005c5f395f8181610177015281816101fe015281816102f401528181610370015281816103fb015281816105dc0152818161065901526107a901526122125ff3fe608060405234801561000f575f80fd5b5060043610610085575f3560e01c8063b21a249411610058578063b21a249414610101578063bb7bb45a14610121578063dad601be14610137578063e388df491461014a575f80fd5b80631cb5642f14610089578063358116b9146100c65780634e6c280e146100db57806379ba4305146100ee575b5f80fd5b61009c610097366004611c4f565b61015d565b60408051938452602084019290925267ffffffffffffffff16908201526060015b60405180910390f35b6100d96100d4366004611c79565b6101e7565b005b61009c6100e9366004611c4f565b6102da565b61009c6100fc366004611c90565b610356565b61011461010f366004611c79565b6103e2565b6040516100bd9190611d0e565b6101296105c4565b6040519081526020016100bd565b610129610145366004611d20565b610641565b61009c610158366004611c90565b61078f565b5f808073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036101cf576040517f09e815f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101d9858561080c565b9250925092505b9250925092565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610256576040517f09e815f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6102a2337f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e78360405160200161028e91815260200190565b60405160208183030381529060405261083a565b6102ab81610934565b604051819033907f94041431cee1a4c20be97117d396e73eb1e601e124b48fbc5dc07397c31d5f8a905f90a350565b5f808073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016300361034c576040517f09e815f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101d98585610b11565b5f808073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036103c8576040517f09e815f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103d3868686610b21565b92509250925093509350939050565b606073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610453576040517f09e815f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61045c610b4f565b600281015490915083106104a4576040517f029c6c35000000000000000000000000000000000000000000000000000000008152600481018490526024015b60405180910390fd5b8060020183815481106104b9576104b9611da8565b5f918252602082206001600590920201015467ffffffffffffffff169003610510576040517f029c6c350000000000000000000000000000000000000000000000000000000081526004810184905260240161049b565b80600201838154811061052557610525611da8565b905f5260205f209060050201600401805461053f90611dd5565b80601f016020809104026020016040519081016040528092919081815260200182805461056b90611dd5565b80156105b65780601f1061058d576101008083540402835291602001916105b6565b820191905f5260205f20905b81548152906001019060200180831161059957829003601f168201915b50505050509150505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610634576040517f09e815f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61063c610bec565b905090565b5f73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036106b1576040517f09e815f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106ed337ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f898787878760405160200161028e9493929190611e20565b5f6106f9868585610c47565b90505f61073c828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610cf992505050565b6040805184815267ffffffffffffffff89166020820152919250829133917fa9c7784142e419f4660627c0c145b3873c2a415ce062f5c81bc19e6850f873d8910160405180910390a39695505050505050565b5f808073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610801576040517f09e815f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103d3868686610e13565b5f805f8061081c5f198787610e1e565b90505f8061082983610f26565b939650945091925050509250925092565b5f3073ffffffffffffffffffffffffffffffffffffffff1663d09edf316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610884573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a89190611e84565b6040517f59f89dda00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8216906359f89dda9061090190879087908790600401611eb7565b5f604051808303815f87803b158015610918575f80fd5b505af115801561092a573d5f803e3d5ffd5b5050505050505050565b5f61093d610b4f565b60028101549091508210610980576040517f029c6c350000000000000000000000000000000000000000000000000000000081526004810183905260240161049b565b5f81600201838154811061099657610996611da8565b5f9182526020822060016005909202019081015490925067ffffffffffffffff1690036109f2576040517f029c6c350000000000000000000000000000000000000000000000000000000081526004810184905260240161049b565b60018101544267ffffffffffffffff90911611610a3e576040517f99fa8c690000000000000000000000000000000000000000000000000000000081526004810184905260240161049b565b600281015460038201545f198214610a7e5780846002018381548110610a6657610a66611da8565b905f5260205f20906005020160030181905550610a82565b8084555b5f198114610ab85781846002018281548110610aa057610aa0611da8565b905f5260205f20906005020160020181905550610ac0565b600184018290555b5f196002840181905560038401556001830180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690555f808455610b0a906004850190611bef565b5050505050565b5f805f8061081c5f198787610f84565b5f805f80610b30878787610f84565b90505f80610b3d83610f26565b939a9099509297509195505050505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00610b9d60017f2f8f8ecf1b7a1a3ceda8d15a9a2247a2377b3434535a87f1728021c13fec2e71611f18565b604051602001610baf91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101201692915050565b5f610bf5610b4f565b600201545f03610c0457505f90565b60065f80610c155f19846001610f84565b90505b5f198114610c405781610c2a81611f2b565b925050610c3981846001610f84565b9050610c18565b5092915050565b5f7f4548e57ae2f1604df75a3d17fecaff7dd11ad7a93d9f8a0dc05e7144f46f3f7c8403610cbd57610cb5610cb084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061107692505050565b611091565b506002610cf2565b6040517ff17c1d460000000000000000000000000000000000000000000000000000000081526004810185905260240161049b565b9392505050565b5f428367ffffffffffffffff1611610d4f576040517fc0851c8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015242602482015260440161049b565b5f610d58610b4f565b9050610d6381611191565b60028101805460019081018083555f928352610d7f9190611f18565b90505f826002018281548110610d9757610d97611da8565b5f91825260209091206005909102018781556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8916179055905060048101610def8682611fb9565b505f19600282018190556003820155610e0983838861123a565b5095945050505050565b5f805f80610b308787875b5f600783168103610e5b576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610e64610b4f565b60028101549091505f03610e7c575f19915050610cf2565b5f5f198614610eaf57816002018681548110610e9a57610e9a611da8565b905f5260205f20906005020160020154610eb5565b81600101545b90506001846002811115610ecb57610ecb612093565b03610eed57610ee482610ede8484611384565b876113fe565b92505050610cf2565b6002846002811115610f0157610f01612093565b03610f1157610ee4828287611456565b610f1c8282876113fe565b9695505050505050565b5f805f198303610f3a57505f928392509050565b5f610f43610b4f565b6002018481548110610f5757610f57611da8565b5f91825260209091206005909102018054600190910154909567ffffffffffffffff909116945092505050565b5f600783168103610fc1576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610fca610b4f565b60028101549091505f03610fe2575f19915050610cf2565b5f5f1986146110155781600201868154811061100057611000611da8565b905f5260205f20906005020160030154611018565b81545b9050600284600281111561102e5761102e612093565b0361104757610ee48261104184846114c2565b87611537565b600184600281111561105b5761105b612093565b0361106b57610ee4828287611585565b610f1c828287611537565b5f8180602001905181019061108b91906120c0565b92915050565b61109b815f6115f2565b156110d2576040517f018d151200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6110dc30611642565b90505f6110ea6001836116ec565b90506110f68382611710565b15611130576040517f06c327120000000000000000000000000000000000000000000000000000000081526004810184905260240161049b565b5f61114561113f84600a6121b7565b5f6116ec565b9050611151848261175f565b1561118b576040517fd24a8af10000000000000000000000000000000000000000000000000000000081526004810185905260240161049b565b50505050565b60028101541561119e5750565b6002810180546001018082555f828152919082906111be576111be611da8565b5f9182526020909120600160059092020181815590810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555f19600282018190556003820155905061121f6117ae565b5f808052600484016020526040902055505f19600590910155565b5f83600201838154811061125057611250611da8565b905f5260205f20906005020190505f846001015490505b5f198114610b0a578267ffffffffffffffff1685600201828154811061128f5761128f611da8565b5f91825260209091206001600590920201015467ffffffffffffffff1611611358575f8560020182815481106112c7576112c7611da8565b905f5260205f209060050201600301549050848660020183815481106112ef576112ef611da8565b5f918252602090912060036005909202018101919091556002840183905583018190555f198114611348578486600201828154811061133057611330611da8565b905f5260205f20906005020160020181905550611350565b600186018590555b505050505050565b84600201818154811061136d5761136d611da8565b905f5260205f209060050201600201549050611267565b5f5b5f1982141580156113c75750428360020183815481106113a8576113a8611da8565b5f91825260209091206001600590920201015467ffffffffffffffff16115b156113f8578260020182815481106113e1576113e1611da8565b905f5260205f209060050201600201549150611386565b50919050565b5f5b5f19831461144c575f84600201848154811061141e5761141e611da8565b905f5260205f209060050201905082815f0154165f146114415783915050610cf2565b600201549250611400565b505f199392505050565b5f5b5f19831461144c575f84600201848154811061147657611476611da8565b5f918252602090912060059091020160018101549091504267ffffffffffffffff909116116114a5575061144c565b80548316156114b75783915050610cf2565b600201549250611458565b5f5b5f1982141580156115065750428360020183815481106114e6576114e6611da8565b5f91825260209091206001600590920201015467ffffffffffffffff1611155b156113f85782600201828154811061152057611520611da8565b905f5260205f2090600502016003015491506114c4565b5f5b5f19831461144c575f84600201848154811061155757611557611da8565b905f5260205f209060050201905082815f0154165f1461157a5783915050610cf2565b600301549250611539565b5f5b5f19831461144c575f8460020184815481106115a5576115a5611da8565b5f918252602090912060059091020160018101549091504267ffffffffffffffff90911611156115d5575061144c565b80548316156115e75783915050610cf2565b600301549250611587565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6116358484848461184f565b1215979650505050505050565b5f61164b61192c565b6040517f54636d2b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af11580156116c8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061108b91906121c5565b5f805f6116f985856119d2565b915091506117078282611a36565b95945050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6117538484848461184f565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6117a28484848461184f565b12979650505050505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006117fc60017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff611f18565b60405160200161180e91815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529190528051602090910120166002015492915050565b5f80851584151781871282861218178584141780156118745786859250925050611923565b505f85841315611888575092949193919260015b8386035f8112604c82131780156118bb5782156118ad575f8994509450505050611923565b885f94509450505050611923565b600a82900a8981028a8282816118d3576118d36121e5565b05146118ff5784156118ef575f8b965096505050505050611923565b8a5f965096505050505050611923565b84156119145788965094506119239350505050565b95508794506119239350505050565b94509492505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580611983575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156119d0576040517f73e6d7b300000000000000000000000000000000000000000000000000000000815273200e12d10bb0c5e4a17e7018f0f1161919bb9389600482015260240161049b565b565b5f805f805f6119e18787611a90565b92509250925080611a28576040517fc4717966000000000000000000000000000000000000000000000000000000008152600481018490526024810183905260440161049b565b5090925090505b9250929050565b5f805f611a438585611ae9565b9150915080611a88576040517f22c9f7bb000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161049b565b509392505050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115611adb57600a860460018201600a88065f14935093509350506101e0565b8593509150600190506101e0565b5f601b83900b8314838382611b4d577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000860515611b2d57620186a0860595506005850194505b8586601b0b14611b4857600a86059550846001019450611b2d565b611b63565b855f03611b6357505f925060019150611a2f9050565b848560030b14611bbf575f851215611b8357505f9250829150611a2f9050565b6040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161049b565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b508054611bfb90611dd5565b5f825580601f10611c0a575050565b601f0160209004905f5260205f2090810190611c269190611c29565b50565b5b80821115611c3d575f8155600101611c2a565b5090565b8035600381106105bf575f80fd5b5f8060408385031215611c60575f80fd5b82359150611c7060208401611c41565b90509250929050565b5f60208284031215611c89575f80fd5b5035919050565b5f805f60608486031215611ca2575f80fd5b8335925060208401359150611cb960408501611c41565b90509250925092565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610cf26020830184611cc2565b5f805f8060608587031215611d33575f80fd5b84359350602085013567ffffffffffffffff8082168214611d52575f80fd5b90935060408601359080821115611d67575f80fd5b818701915087601f830112611d7a575f80fd5b813581811115611d88575f80fd5b886020828501011115611d99575f80fd5b95989497505060200194505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b600181811c90821680611de957607f821691505b6020821081036113f8577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b84815267ffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f60208284031215611e94575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610cf2575f80fd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6117076060830184611cc2565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561108b5761108b611eeb565b5f5f198203611f3c57611f3c611eeb565b5060010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b601f821115611fb457805f5260205f20601f840160051c81016020851015611f955750805b601f840160051c820191505b81811015610b0a575f8155600101611fa1565b505050565b815167ffffffffffffffff811115611fd357611fd3611f43565b611fe781611fe18454611dd5565b84611f70565b602080601f83116001811461201a575f84156120035750858301515b5f19600386901b1c1916600185901b178555611350565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561206657888601518255948401946001909101908401612047565b508582101561208357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082840312156120d0575f80fd5b5051919050565b600181815b8085111561211157815f19048211156120f7576120f7611eeb565b8085161561210457918102915b93841c93908002906120dc565b509250929050565b5f826121275750600161108b565b8161213357505f61108b565b816001811461214957600281146121535761216f565b600191505061108b565b60ff84111561216457612164611eeb565b50506001821b61108b565b5060208310610133831016604e8410600b8410161715612192575081810a61108b565b61219c83836120d7565b805f19048211156121af576121af611eeb565b029392505050565b5f610cf260ff841683612119565b5f602082840312156121d5575f80fd5b815160ff81168114610cf2575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd"; + hex"60a0604052348015600e575f80fd5b50306080526080516120b461005c5f395f8181610177015281816101e5015281816102c201528181610325015281816103970152818161055f015281816105c301526106fa01526120b45ff3fe608060405234801561000f575f80fd5b5060043610610085575f3560e01c8063b21a249411610058578063b21a249414610101578063bb7bb45a14610121578063dad601be14610137578063e388df491461014a575f80fd5b80631cb5642f14610089578063358116b9146100c65780634e6c280e146100db57806379ba4305146100ee575b5f80fd5b61009c610097366004611b4b565b61015d565b60408051938452602084019290925267ffffffffffffffff16908201526060015b60405180910390f35b6100d96100d4366004611b75565b6101ce565b005b61009c6100e9366004611b4b565b6102a8565b61009c6100fc366004611b8c565b61030b565b61011461010f366004611b75565b61037e565b6040516100bd9190611bec565b610129610547565b6040519081526020016100bd565b610129610145366004611bfe565b6105ab565b61009c610158366004611b8c565b6106e0565b5f808073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036101b6576040516309e815f560e01b815260040160405180910390fd5b6101c08585610744565b9250925092505b9250925092565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610224576040516309e815f560e01b815260040160405180910390fd5b610270337f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e78360405160200161025c91815260200190565b604051602081830303815290604052610772565b6102798161086c565b604051819033907f94041431cee1a4c20be97117d396e73eb1e601e124b48fbc5dc07397c31d5f8a905f90a350565b5f808073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610301576040516309e815f560e01b815260040160405180910390fd5b6101c08585610a49565b5f808073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610364576040516309e815f560e01b815260040160405180910390fd5b61036f868686610a59565b92509250925093509350939050565b606073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036103d6576040516309e815f560e01b815260040160405180910390fd5b5f6103df610a87565b60028101549091508310610427576040517f029c6c35000000000000000000000000000000000000000000000000000000008152600481018490526024015b60405180910390fd5b80600201838154811061043c5761043c611c86565b5f918252602082206001600590920201015467ffffffffffffffff169003610493576040517f029c6c350000000000000000000000000000000000000000000000000000000081526004810184905260240161041e565b8060020183815481106104a8576104a8611c86565b905f5260205f20906005020160040180546104c290611cb3565b80601f01602080910402602001604051908101604052809291908181526020018280546104ee90611cb3565b80156105395780601f1061051057610100808354040283529160200191610539565b820191905f5260205f20905b81548152906001019060200180831161051c57829003601f168201915b50505050509150505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016300361059e576040516309e815f560e01b815260040160405180910390fd5b6105a6610b06565b905090565b5f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610602576040516309e815f560e01b815260040160405180910390fd5b61063e337ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f898787878760405160200161025c9493929190611cfe565b5f61064a868585610b61565b90505f61068d828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610c1392505050565b6040805184815267ffffffffffffffff89166020820152919250829133917fa9c7784142e419f4660627c0c145b3873c2a415ce062f5c81bc19e6850f873d8910160405180910390a39695505050505050565b5f808073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610739576040516309e815f560e01b815260040160405180910390fd5b61036f868686610d2d565b5f805f806107545f198787610d38565b90505f8061076183610e40565b939650945091925050509250925092565b5f3073ffffffffffffffffffffffffffffffffffffffff1663d09edf316040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e09190611d44565b6040517f59f89dda00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8216906359f89dda9061083990879087908790600401611d77565b5f604051808303815f87803b158015610850575f80fd5b505af1158015610862573d5f803e3d5ffd5b5050505050505050565b5f610875610a87565b600281015490915082106108b8576040517f029c6c350000000000000000000000000000000000000000000000000000000081526004810183905260240161041e565b5f8160020183815481106108ce576108ce611c86565b5f9182526020822060016005909202019081015490925067ffffffffffffffff16900361092a576040517f029c6c350000000000000000000000000000000000000000000000000000000081526004810184905260240161041e565b60018101544267ffffffffffffffff90911611610976576040517f99fa8c690000000000000000000000000000000000000000000000000000000081526004810184905260240161041e565b600281015460038201545f1982146109b6578084600201838154811061099e5761099e611c86565b905f5260205f209060050201600301819055506109ba565b8084555b5f1981146109f057818460020182815481106109d8576109d8611c86565b905f5260205f209060050201600201819055506109f8565b600184018290555b5f196002840181905560038401556001830180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690555f808455610a42906004850190611aeb565b5050505050565b5f805f806107545f198787610e9e565b5f805f80610a68878787610e9e565b90505f80610a7583610e40565b939a9099509297509195505050505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00610ad560017f2f8f8ecf1b7a1a3ceda8d15a9a2247a2377b3434535a87f1728021c13fec2e71611dd8565b604051602001610ae791815260200190565b60408051601f1981840301815291905280516020909101201692915050565b5f610b0f610a87565b600201545f03610b1e57505f90565b60065f80610b2f5f19846001610e9e565b90505b5f198114610b5a5781610b4481611deb565b925050610b5381846001610e9e565b9050610b32565b5092915050565b5f7f4548e57ae2f1604df75a3d17fecaff7dd11ad7a93d9f8a0dc05e7144f46f3f7c8403610bd757610bcf610bca84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610f9092505050565b610fab565b506002610c0c565b6040517ff17c1d460000000000000000000000000000000000000000000000000000000081526004810185905260240161041e565b9392505050565b5f428367ffffffffffffffff1611610c69576040517fc0851c8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015242602482015260440161041e565b5f610c72610a87565b9050610c7d816110ab565b60028101805460019081018083555f928352610c999190611dd8565b90505f826002018281548110610cb157610cb1611c86565b5f91825260209091206005909102018781556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8916179055905060048101610d098682611e79565b505f19600282018190556003820155610d23838388611154565b5095945050505050565b5f805f80610a688787875b5f600783168103610d75576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610d7e610a87565b60028101549091505f03610d96575f19915050610c0c565b5f5f198614610dc957816002018681548110610db457610db4611c86565b905f5260205f20906005020160020154610dcf565b81600101545b90506001846002811115610de557610de5611f35565b03610e0757610dfe82610df8848461129e565b87611318565b92505050610c0c565b6002846002811115610e1b57610e1b611f35565b03610e2b57610dfe828287611370565b610e36828287611318565b9695505050505050565b5f805f198303610e5457505f928392509050565b5f610e5d610a87565b6002018481548110610e7157610e71611c86565b5f91825260209091206005909102018054600190910154909567ffffffffffffffff909116945092505050565b5f600783168103610edb576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610ee4610a87565b60028101549091505f03610efc575f19915050610c0c565b5f5f198614610f2f57816002018681548110610f1a57610f1a611c86565b905f5260205f20906005020160030154610f32565b81545b90506002846002811115610f4857610f48611f35565b03610f6157610dfe82610f5b84846113dc565b87611451565b6001846002811115610f7557610f75611f35565b03610f8557610dfe82828761149f565b610e36828287611451565b5f81806020019051810190610fa59190611f62565b92915050565b610fb5815f61150c565b15610fec576040517f018d151200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610ff63061155c565b90505f611004600183611606565b9050611010838261162a565b1561104a576040517f06c327120000000000000000000000000000000000000000000000000000000081526004810184905260240161041e565b5f61105f61105984600a612059565b5f611606565b905061106b8482611679565b156110a5576040517fd24a8af10000000000000000000000000000000000000000000000000000000081526004810185905260240161041e565b50505050565b6002810154156110b85750565b6002810180546001018082555f828152919082906110d8576110d8611c86565b5f9182526020909120600160059092020181815590810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555f1960028201819055600382015590506111396116c8565b5f808052600484016020526040902055505f19600590910155565b5f83600201838154811061116a5761116a611c86565b905f5260205f20906005020190505f846001015490505b5f198114610a42578267ffffffffffffffff168560020182815481106111a9576111a9611c86565b5f91825260209091206001600590920201015467ffffffffffffffff1611611272575f8560020182815481106111e1576111e1611c86565b905f5260205f2090600502016003015490508486600201838154811061120957611209611c86565b5f918252602090912060036005909202018101919091556002840183905583018190555f198114611262578486600201828154811061124a5761124a611c86565b905f5260205f2090600502016002018190555061126a565b600186018590555b505050505050565b84600201818154811061128757611287611c86565b905f5260205f209060050201600201549050611181565b5f5b5f1982141580156112e15750428360020183815481106112c2576112c2611c86565b5f91825260209091206001600590920201015467ffffffffffffffff16115b15611312578260020182815481106112fb576112fb611c86565b905f5260205f2090600502016002015491506112a0565b50919050565b5f5b5f198314611366575f84600201848154811061133857611338611c86565b905f5260205f209060050201905082815f0154165f1461135b5783915050610c0c565b60020154925061131a565b505f199392505050565b5f5b5f198314611366575f84600201848154811061139057611390611c86565b5f918252602090912060059091020160018101549091504267ffffffffffffffff909116116113bf5750611366565b80548316156113d15783915050610c0c565b600201549250611372565b5f5b5f19821415801561142057504283600201838154811061140057611400611c86565b5f91825260209091206001600590920201015467ffffffffffffffff1611155b156113125782600201828154811061143a5761143a611c86565b905f5260205f2090600502016003015491506113de565b5f5b5f198314611366575f84600201848154811061147157611471611c86565b905f5260205f209060050201905082815f0154165f146114945783915050610c0c565b600301549250611453565b5f5b5f198314611366575f8460020184815481106114bf576114bf611c86565b5f918252602090912060059091020160018101549091504267ffffffffffffffff90911611156114ef5750611366565b80548316156115015783915050610c0c565b6003015492506114a1565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61154f8484848461174b565b1215979650505050505050565b5f611565611828565b6040517f54636d2b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af11580156115e2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fa59190612067565b5f805f61161385856118ce565b915091506116218282611932565b95945050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61166d8484848461174b565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6116bc8484848461174b565b12979650505050505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0061171660017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff611dd8565b60405160200161172891815260200190565b60408051808303601f190181529190528051602090910120166002015492915050565b5f8085158415178187128286121817858414178015611770578685925092505061181f565b505f85841315611784575092949193919260015b8386035f8112604c82131780156117b75782156117a9575f899450945050505061181f565b885f9450945050505061181f565b600a82900a8981028a8282816117cf576117cf612087565b05146117fb5784156117eb575f8b96509650505050505061181f565b8a5f96509650505050505061181f565b841561181057889650945061181f9350505050565b955087945061181f9350505050565b94509492505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b158061187f575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156118cc576040517f73e6d7b300000000000000000000000000000000000000000000000000000000815273200e12d10bb0c5e4a17e7018f0f1161919bb9389600482015260240161041e565b565b5f805f805f6118dd878761198c565b92509250925080611924576040517fc4717966000000000000000000000000000000000000000000000000000000008152600481018490526024810183905260440161041e565b5090925090505b9250929050565b5f805f61193f85856119e5565b9150915080611984576040517f22c9f7bb000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161041e565b509392505050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156119d757600a860460018201600a88065f14935093509350506101c7565b8593509150600190506101c7565b5f601b83900b8314838382611a49577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000860515611a2957620186a0860595506005850194505b8586601b0b14611a4457600a86059550846001019450611a29565b611a5f565b855f03611a5f57505f92506001915061192b9050565b848560030b14611abb575f851215611a7f57505f925082915061192b9050565b6040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161041e565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b508054611af790611cb3565b5f825580601f10611b06575050565b601f0160209004905f5260205f2090810190611b229190611b25565b50565b5b80821115611b39575f8155600101611b26565b5090565b803560038110610542575f80fd5b5f8060408385031215611b5c575f80fd5b82359150611b6c60208401611b3d565b90509250929050565b5f60208284031215611b85575f80fd5b5035919050565b5f805f60608486031215611b9e575f80fd5b8335925060208401359150611bb560408501611b3d565b90509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610c0c6020830184611bbe565b5f805f8060608587031215611c11575f80fd5b84359350602085013567ffffffffffffffff8082168214611c30575f80fd5b90935060408601359080821115611c45575f80fd5b818701915087601f830112611c58575f80fd5b813581811115611c66575f80fd5b886020828501011115611c77575f80fd5b95989497505060200194505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b600181811c90821680611cc757607f821691505b602082108103611312577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b84815267ffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f60208284031215611d54575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610c0c575f80fd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6116216060830184611bbe565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610fa557610fa5611dab565b5f5f198203611dfc57611dfc611dab565b5060010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b601f821115611e7457805f5260205f20601f840160051c81016020851015611e555750805b601f840160051c820191505b81811015610a42575f8155600101611e61565b505050565b815167ffffffffffffffff811115611e9357611e93611e03565b611ea781611ea18454611cb3565b84611e30565b602080601f831160018114611eda575f8415611ec35750858301515b5f19600386901b1c1916600185901b17855561126a565b5f85815260208120601f198616915b82811015611f0857888601518255948401946001909101908401611ee9565b5085821015611f2557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60208284031215611f72575f80fd5b5051919050565b600181815b80851115611fb357815f1904821115611f9957611f99611dab565b80851615611fa657918102915b93841c9390800290611f7e565b509250929050565b5f82611fc957506001610fa5565b81611fd557505f610fa5565b8160018114611feb5760028114611ff557612011565b6001915050610fa5565b60ff84111561200657612006611dab565b50506001821b610fa5565b5060208310610133831016604e8410600b8410161715612034575081810a610fa5565b61203e8383611f79565b805f190482111561205157612051611dab565b029392505050565b5f610c0c60ff841683611fbb565b5f60208284031215612077575f80fd5b815160ff81168114610c0c575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b5060043610610085575f3560e01c8063b21a249411610058578063b21a249414610101578063bb7bb45a14610121578063dad601be14610137578063e388df491461014a575f80fd5b80631cb5642f14610089578063358116b9146100c65780634e6c280e146100db57806379ba4305146100ee575b5f80fd5b61009c610097366004611c4f565b61015d565b60408051938452602084019290925267ffffffffffffffff16908201526060015b60405180910390f35b6100d96100d4366004611c79565b6101e7565b005b61009c6100e9366004611c4f565b6102da565b61009c6100fc366004611c90565b610356565b61011461010f366004611c79565b6103e2565b6040516100bd9190611d0e565b6101296105c4565b6040519081526020016100bd565b610129610145366004611d20565b610641565b61009c610158366004611c90565b61078f565b5f808073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000db479091164a15f1ba29de513776fffbb4a9f0af1630036101cf576040517f09e815f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101d9858561080c565b9250925092505b9250925092565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000db479091164a15f1ba29de513776fffbb4a9f0af163003610256576040517f09e815f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6102a2337f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e78360405160200161028e91815260200190565b60405160208183030381529060405261083a565b6102ab81610934565b604051819033907f94041431cee1a4c20be97117d396e73eb1e601e124b48fbc5dc07397c31d5f8a905f90a350565b5f808073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000db479091164a15f1ba29de513776fffbb4a9f0af16300361034c576040517f09e815f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101d98585610b11565b5f808073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000db479091164a15f1ba29de513776fffbb4a9f0af1630036103c8576040517f09e815f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103d3868686610b21565b92509250925093509350939050565b606073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000db479091164a15f1ba29de513776fffbb4a9f0af163003610453576040517f09e815f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61045c610b4f565b600281015490915083106104a4576040517f029c6c35000000000000000000000000000000000000000000000000000000008152600481018490526024015b60405180910390fd5b8060020183815481106104b9576104b9611da8565b5f918252602082206001600590920201015467ffffffffffffffff169003610510576040517f029c6c350000000000000000000000000000000000000000000000000000000081526004810184905260240161049b565b80600201838154811061052557610525611da8565b905f5260205f209060050201600401805461053f90611dd5565b80601f016020809104026020016040519081016040528092919081815260200182805461056b90611dd5565b80156105b65780601f1061058d576101008083540402835291602001916105b6565b820191905f5260205f20905b81548152906001019060200180831161059957829003601f168201915b50505050509150505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000db479091164a15f1ba29de513776fffbb4a9f0af163003610634576040517f09e815f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61063c610bec565b905090565b5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000db479091164a15f1ba29de513776fffbb4a9f0af1630036106b1576040517f09e815f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106ed337ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f898787878760405160200161028e9493929190611e20565b5f6106f9868585610c47565b90505f61073c828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610cf992505050565b6040805184815267ffffffffffffffff89166020820152919250829133917fa9c7784142e419f4660627c0c145b3873c2a415ce062f5c81bc19e6850f873d8910160405180910390a39695505050505050565b5f808073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000db479091164a15f1ba29de513776fffbb4a9f0af163003610801576040517f09e815f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103d3868686610e13565b5f805f8061081c5f198787610e1e565b90505f8061082983610f26565b939650945091925050509250925092565b5f3073ffffffffffffffffffffffffffffffffffffffff1663d09edf316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610884573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a89190611e84565b6040517f59f89dda00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8216906359f89dda9061090190879087908790600401611eb7565b5f604051808303815f87803b158015610918575f80fd5b505af115801561092a573d5f803e3d5ffd5b5050505050505050565b5f61093d610b4f565b60028101549091508210610980576040517f029c6c350000000000000000000000000000000000000000000000000000000081526004810183905260240161049b565b5f81600201838154811061099657610996611da8565b5f9182526020822060016005909202019081015490925067ffffffffffffffff1690036109f2576040517f029c6c350000000000000000000000000000000000000000000000000000000081526004810184905260240161049b565b60018101544267ffffffffffffffff90911611610a3e576040517f99fa8c690000000000000000000000000000000000000000000000000000000081526004810184905260240161049b565b600281015460038201545f198214610a7e5780846002018381548110610a6657610a66611da8565b905f5260205f20906005020160030181905550610a82565b8084555b5f198114610ab85781846002018281548110610aa057610aa0611da8565b905f5260205f20906005020160020181905550610ac0565b600184018290555b5f196002840181905560038401556001830180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690555f808455610b0a906004850190611bef565b5050505050565b5f805f8061081c5f198787610f84565b5f805f80610b30878787610f84565b90505f80610b3d83610f26565b939a9099509297509195505050505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00610b9d60017f2f8f8ecf1b7a1a3ceda8d15a9a2247a2377b3434535a87f1728021c13fec2e71611f18565b604051602001610baf91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101201692915050565b5f610bf5610b4f565b600201545f03610c0457505f90565b60065f80610c155f19846001610f84565b90505b5f198114610c405781610c2a81611f2b565b925050610c3981846001610f84565b9050610c18565b5092915050565b5f7f4548e57ae2f1604df75a3d17fecaff7dd11ad7a93d9f8a0dc05e7144f46f3f7c8403610cbd57610cb5610cb084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061107692505050565b611091565b506002610cf2565b6040517ff17c1d460000000000000000000000000000000000000000000000000000000081526004810185905260240161049b565b9392505050565b5f428367ffffffffffffffff1611610d4f576040517fc0851c8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015242602482015260440161049b565b5f610d58610b4f565b9050610d6381611191565b60028101805460019081018083555f928352610d7f9190611f18565b90505f826002018281548110610d9757610d97611da8565b5f91825260209091206005909102018781556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8916179055905060048101610def8682611fb9565b505f19600282018190556003820155610e0983838861123a565b5095945050505050565b5f805f80610b308787875b5f600783168103610e5b576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610e64610b4f565b60028101549091505f03610e7c575f19915050610cf2565b5f5f198614610eaf57816002018681548110610e9a57610e9a611da8565b905f5260205f20906005020160020154610eb5565b81600101545b90506001846002811115610ecb57610ecb612093565b03610eed57610ee482610ede8484611384565b876113fe565b92505050610cf2565b6002846002811115610f0157610f01612093565b03610f1157610ee4828287611456565b610f1c8282876113fe565b9695505050505050565b5f805f198303610f3a57505f928392509050565b5f610f43610b4f565b6002018481548110610f5757610f57611da8565b5f91825260209091206005909102018054600190910154909567ffffffffffffffff909116945092505050565b5f600783168103610fc1576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610fca610b4f565b60028101549091505f03610fe2575f19915050610cf2565b5f5f1986146110155781600201868154811061100057611000611da8565b905f5260205f20906005020160030154611018565b81545b9050600284600281111561102e5761102e612093565b0361104757610ee48261104184846114c2565b87611537565b600184600281111561105b5761105b612093565b0361106b57610ee4828287611585565b610f1c828287611537565b5f8180602001905181019061108b91906120c0565b92915050565b61109b815f6115f2565b156110d2576040517f018d151200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6110dc30611642565b90505f6110ea6001836116ec565b90506110f68382611710565b15611130576040517f06c327120000000000000000000000000000000000000000000000000000000081526004810184905260240161049b565b5f61114561113f84600a6121b7565b5f6116ec565b9050611151848261175f565b1561118b576040517fd24a8af10000000000000000000000000000000000000000000000000000000081526004810185905260240161049b565b50505050565b60028101541561119e5750565b6002810180546001018082555f828152919082906111be576111be611da8565b5f9182526020909120600160059092020181815590810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555f19600282018190556003820155905061121f6117ae565b5f808052600484016020526040902055505f19600590910155565b5f83600201838154811061125057611250611da8565b905f5260205f20906005020190505f846001015490505b5f198114610b0a578267ffffffffffffffff1685600201828154811061128f5761128f611da8565b5f91825260209091206001600590920201015467ffffffffffffffff1611611358575f8560020182815481106112c7576112c7611da8565b905f5260205f209060050201600301549050848660020183815481106112ef576112ef611da8565b5f918252602090912060036005909202018101919091556002840183905583018190555f198114611348578486600201828154811061133057611330611da8565b905f5260205f20906005020160020181905550611350565b600186018590555b505050505050565b84600201818154811061136d5761136d611da8565b905f5260205f209060050201600201549050611267565b5f5b5f1982141580156113c75750428360020183815481106113a8576113a8611da8565b5f91825260209091206001600590920201015467ffffffffffffffff16115b156113f8578260020182815481106113e1576113e1611da8565b905f5260205f209060050201600201549150611386565b50919050565b5f5b5f19831461144c575f84600201848154811061141e5761141e611da8565b905f5260205f209060050201905082815f0154165f146114415783915050610cf2565b600201549250611400565b505f199392505050565b5f5b5f19831461144c575f84600201848154811061147657611476611da8565b5f918252602090912060059091020160018101549091504267ffffffffffffffff909116116114a5575061144c565b80548316156114b75783915050610cf2565b600201549250611458565b5f5b5f1982141580156115065750428360020183815481106114e6576114e6611da8565b5f91825260209091206001600590920201015467ffffffffffffffff1611155b156113f85782600201828154811061152057611520611da8565b905f5260205f2090600502016003015491506114c4565b5f5b5f19831461144c575f84600201848154811061155757611557611da8565b905f5260205f209060050201905082815f0154165f1461157a5783915050610cf2565b600301549250611539565b5f5b5f19831461144c575f8460020184815481106115a5576115a5611da8565b5f918252602090912060059091020160018101549091504267ffffffffffffffff90911611156115d5575061144c565b80548316156115e75783915050610cf2565b600301549250611587565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6116358484848461184f565b1215979650505050505050565b5f61164b61192c565b6040517f54636d2b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af11580156116c8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061108b91906121c5565b5f805f6116f985856119d2565b915091506117078282611a36565b95945050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6117538484848461184f565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6117a28484848461184f565b12979650505050505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006117fc60017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff611f18565b60405160200161180e91815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529190528051602090910120166002015492915050565b5f80851584151781871282861218178584141780156118745786859250925050611923565b505f85841315611888575092949193919260015b8386035f8112604c82131780156118bb5782156118ad575f8994509450505050611923565b885f94509450505050611923565b600a82900a8981028a8282816118d3576118d36121e5565b05146118ff5784156118ef575f8b965096505050505050611923565b8a5f965096505050505050611923565b84156119145788965094506119239350505050565b95508794506119239350505050565b94509492505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580611983575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156119d0576040517f73e6d7b300000000000000000000000000000000000000000000000000000000815273200e12d10bb0c5e4a17e7018f0f1161919bb9389600482015260240161049b565b565b5f805f805f6119e18787611a90565b92509250925080611a28576040517fc4717966000000000000000000000000000000000000000000000000000000008152600481018490526024810183905260440161049b565b5090925090505b9250929050565b5f805f611a438585611ae9565b9150915080611a88576040517f22c9f7bb000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161049b565b509392505050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115611adb57600a860460018201600a88065f14935093509350506101e0565b8593509150600190506101e0565b5f601b83900b8314838382611b4d577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000860515611b2d57620186a0860595506005850194505b8586601b0b14611b4857600a86059550846001019450611b2d565b611b63565b855f03611b6357505f925060019150611a2f9050565b848560030b14611bbf575f851215611b8357505f9250829150611a2f9050565b6040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161049b565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b508054611bfb90611dd5565b5f825580601f10611c0a575050565b601f0160209004905f5260205f2090810190611c269190611c29565b50565b5b80821115611c3d575f8155600101611c2a565b5090565b8035600381106105bf575f80fd5b5f8060408385031215611c60575f80fd5b82359150611c7060208401611c41565b90509250929050565b5f60208284031215611c89575f80fd5b5035919050565b5f805f60608486031215611ca2575f80fd5b8335925060208401359150611cb960408501611c41565b90509250925092565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610cf26020830184611cc2565b5f805f8060608587031215611d33575f80fd5b84359350602085013567ffffffffffffffff8082168214611d52575f80fd5b90935060408601359080821115611d67575f80fd5b818701915087601f830112611d7a575f80fd5b813581811115611d88575f80fd5b886020828501011115611d99575f80fd5b95989497505060200194505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b600181811c90821680611de957607f821691505b6020821081036113f8577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b84815267ffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f60208284031215611e94575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610cf2575f80fd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6117076060830184611cc2565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561108b5761108b611eeb565b5f5f198203611f3c57611f3c611eeb565b5060010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b601f821115611fb457805f5260205f20601f840160051c81016020851015611f955750805b601f840160051c820191505b81811015610b0a575f8155600101611fa1565b505050565b815167ffffffffffffffff811115611fd357611fd3611f43565b611fe781611fe18454611dd5565b84611f70565b602080601f83116001811461201a575f84156120035750858301515b5f19600386901b1c1916600185901b178555611350565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561206657888601518255948401946001909101908401612047565b508582101561208357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f602082840312156120d0575f80fd5b5051919050565b600181815b8085111561211157815f19048211156120f7576120f7611eeb565b8085161561210457918102915b93841c93908002906120dc565b509250929050565b5f826121275750600161108b565b8161213357505f61108b565b816001811461214957600281146121535761216f565b600191505061108b565b60ff84111561216457612164611eeb565b50506001821b61108b565b5060208310610133831016604e8410600b8410161715612192575081810a61108b565b61219c83836120d7565b805f19048211156121af576121af611eeb565b029392505050565b5f610cf260ff841683612119565b5f602082840312156121d5575f80fd5b815160ff81168114610cf2575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd"; + hex"608060405234801561000f575f80fd5b5060043610610085575f3560e01c8063b21a249411610058578063b21a249414610101578063bb7bb45a14610121578063dad601be14610137578063e388df491461014a575f80fd5b80631cb5642f14610089578063358116b9146100c65780634e6c280e146100db57806379ba4305146100ee575b5f80fd5b61009c610097366004611b4b565b61015d565b60408051938452602084019290925267ffffffffffffffff16908201526060015b60405180910390f35b6100d96100d4366004611b75565b6101ce565b005b61009c6100e9366004611b4b565b6102a8565b61009c6100fc366004611b8c565b61030b565b61011461010f366004611b75565b61037e565b6040516100bd9190611bec565b610129610547565b6040519081526020016100bd565b610129610145366004611bfe565b6105ab565b61009c610158366004611b8c565b6106e0565b5f808073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000051f78b77edffdb62b8aeb753066c318a46d05d741630036101b6576040516309e815f560e01b815260040160405180910390fd5b6101c08585610744565b9250925092505b9250925092565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000051f78b77edffdb62b8aeb753066c318a46d05d74163003610224576040516309e815f560e01b815260040160405180910390fd5b610270337f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e78360405160200161025c91815260200190565b604051602081830303815290604052610772565b6102798161086c565b604051819033907f94041431cee1a4c20be97117d396e73eb1e601e124b48fbc5dc07397c31d5f8a905f90a350565b5f808073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000051f78b77edffdb62b8aeb753066c318a46d05d74163003610301576040516309e815f560e01b815260040160405180910390fd5b6101c08585610a49565b5f808073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000051f78b77edffdb62b8aeb753066c318a46d05d74163003610364576040516309e815f560e01b815260040160405180910390fd5b61036f868686610a59565b92509250925093509350939050565b606073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000051f78b77edffdb62b8aeb753066c318a46d05d741630036103d6576040516309e815f560e01b815260040160405180910390fd5b5f6103df610a87565b60028101549091508310610427576040517f029c6c35000000000000000000000000000000000000000000000000000000008152600481018490526024015b60405180910390fd5b80600201838154811061043c5761043c611c86565b5f918252602082206001600590920201015467ffffffffffffffff169003610493576040517f029c6c350000000000000000000000000000000000000000000000000000000081526004810184905260240161041e565b8060020183815481106104a8576104a8611c86565b905f5260205f20906005020160040180546104c290611cb3565b80601f01602080910402602001604051908101604052809291908181526020018280546104ee90611cb3565b80156105395780601f1061051057610100808354040283529160200191610539565b820191905f5260205f20905b81548152906001019060200180831161051c57829003601f168201915b50505050509150505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000051f78b77edffdb62b8aeb753066c318a46d05d7416300361059e576040516309e815f560e01b815260040160405180910390fd5b6105a6610b06565b905090565b5f73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000051f78b77edffdb62b8aeb753066c318a46d05d74163003610602576040516309e815f560e01b815260040160405180910390fd5b61063e337ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f898787878760405160200161025c9493929190611cfe565b5f61064a868585610b61565b90505f61068d828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610c1392505050565b6040805184815267ffffffffffffffff89166020820152919250829133917fa9c7784142e419f4660627c0c145b3873c2a415ce062f5c81bc19e6850f873d8910160405180910390a39695505050505050565b5f808073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000051f78b77edffdb62b8aeb753066c318a46d05d74163003610739576040516309e815f560e01b815260040160405180910390fd5b61036f868686610d2d565b5f805f806107545f198787610d38565b90505f8061076183610e40565b939650945091925050509250925092565b5f3073ffffffffffffffffffffffffffffffffffffffff1663d09edf316040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e09190611d44565b6040517f59f89dda00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8216906359f89dda9061083990879087908790600401611d77565b5f604051808303815f87803b158015610850575f80fd5b505af1158015610862573d5f803e3d5ffd5b5050505050505050565b5f610875610a87565b600281015490915082106108b8576040517f029c6c350000000000000000000000000000000000000000000000000000000081526004810183905260240161041e565b5f8160020183815481106108ce576108ce611c86565b5f9182526020822060016005909202019081015490925067ffffffffffffffff16900361092a576040517f029c6c350000000000000000000000000000000000000000000000000000000081526004810184905260240161041e565b60018101544267ffffffffffffffff90911611610976576040517f99fa8c690000000000000000000000000000000000000000000000000000000081526004810184905260240161041e565b600281015460038201545f1982146109b6578084600201838154811061099e5761099e611c86565b905f5260205f209060050201600301819055506109ba565b8084555b5f1981146109f057818460020182815481106109d8576109d8611c86565b905f5260205f209060050201600201819055506109f8565b600184018290555b5f196002840181905560038401556001830180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001690555f808455610a42906004850190611aeb565b5050505050565b5f805f806107545f198787610e9e565b5f805f80610a68878787610e9e565b90505f80610a7583610e40565b939a9099509297509195505050505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00610ad560017f2f8f8ecf1b7a1a3ceda8d15a9a2247a2377b3434535a87f1728021c13fec2e71611dd8565b604051602001610ae791815260200190565b60408051601f1981840301815291905280516020909101201692915050565b5f610b0f610a87565b600201545f03610b1e57505f90565b60065f80610b2f5f19846001610e9e565b90505b5f198114610b5a5781610b4481611deb565b925050610b5381846001610e9e565b9050610b32565b5092915050565b5f7f4548e57ae2f1604df75a3d17fecaff7dd11ad7a93d9f8a0dc05e7144f46f3f7c8403610bd757610bcf610bca84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610f9092505050565b610fab565b506002610c0c565b6040517ff17c1d460000000000000000000000000000000000000000000000000000000081526004810185905260240161041e565b9392505050565b5f428367ffffffffffffffff1611610c69576040517fc0851c8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015242602482015260440161041e565b5f610c72610a87565b9050610c7d816110ab565b60028101805460019081018083555f928352610c999190611dd8565b90505f826002018281548110610cb157610cb1611c86565b5f91825260209091206005909102018781556001810180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8916179055905060048101610d098682611e79565b505f19600282018190556003820155610d23838388611154565b5095945050505050565b5f805f80610a688787875b5f600783168103610d75576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610d7e610a87565b60028101549091505f03610d96575f19915050610c0c565b5f5f198614610dc957816002018681548110610db457610db4611c86565b905f5260205f20906005020160020154610dcf565b81600101545b90506001846002811115610de557610de5611f35565b03610e0757610dfe82610df8848461129e565b87611318565b92505050610c0c565b6002846002811115610e1b57610e1b611f35565b03610e2b57610dfe828287611370565b610e36828287611318565b9695505050505050565b5f805f198303610e5457505f928392509050565b5f610e5d610a87565b6002018481548110610e7157610e71611c86565b5f91825260209091206005909102018054600190910154909567ffffffffffffffff909116945092505050565b5f600783168103610edb576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610ee4610a87565b60028101549091505f03610efc575f19915050610c0c565b5f5f198614610f2f57816002018681548110610f1a57610f1a611c86565b905f5260205f20906005020160030154610f32565b81545b90506002846002811115610f4857610f48611f35565b03610f6157610dfe82610f5b84846113dc565b87611451565b6001846002811115610f7557610f75611f35565b03610f8557610dfe82828761149f565b610e36828287611451565b5f81806020019051810190610fa59190611f62565b92915050565b610fb5815f61150c565b15610fec576040517f018d151200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610ff63061155c565b90505f611004600183611606565b9050611010838261162a565b1561104a576040517f06c327120000000000000000000000000000000000000000000000000000000081526004810184905260240161041e565b5f61105f61105984600a612059565b5f611606565b905061106b8482611679565b156110a5576040517fd24a8af10000000000000000000000000000000000000000000000000000000081526004810185905260240161041e565b50505050565b6002810154156110b85750565b6002810180546001018082555f828152919082906110d8576110d8611c86565b5f9182526020909120600160059092020181815590810180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff161790555f1960028201819055600382015590506111396116c8565b5f808052600484016020526040902055505f19600590910155565b5f83600201838154811061116a5761116a611c86565b905f5260205f20906005020190505f846001015490505b5f198114610a42578267ffffffffffffffff168560020182815481106111a9576111a9611c86565b5f91825260209091206001600590920201015467ffffffffffffffff1611611272575f8560020182815481106111e1576111e1611c86565b905f5260205f2090600502016003015490508486600201838154811061120957611209611c86565b5f918252602090912060036005909202018101919091556002840183905583018190555f198114611262578486600201828154811061124a5761124a611c86565b905f5260205f2090600502016002018190555061126a565b600186018590555b505050505050565b84600201818154811061128757611287611c86565b905f5260205f209060050201600201549050611181565b5f5b5f1982141580156112e15750428360020183815481106112c2576112c2611c86565b5f91825260209091206001600590920201015467ffffffffffffffff16115b15611312578260020182815481106112fb576112fb611c86565b905f5260205f2090600502016002015491506112a0565b50919050565b5f5b5f198314611366575f84600201848154811061133857611338611c86565b905f5260205f209060050201905082815f0154165f1461135b5783915050610c0c565b60020154925061131a565b505f199392505050565b5f5b5f198314611366575f84600201848154811061139057611390611c86565b5f918252602090912060059091020160018101549091504267ffffffffffffffff909116116113bf5750611366565b80548316156113d15783915050610c0c565b600201549250611372565b5f5b5f19821415801561142057504283600201838154811061140057611400611c86565b5f91825260209091206001600590920201015467ffffffffffffffff1611155b156113125782600201828154811061143a5761143a611c86565b905f5260205f2090600502016003015491506113de565b5f5b5f198314611366575f84600201848154811061147157611471611c86565b905f5260205f209060050201905082815f0154165f146114945783915050610c0c565b600301549250611453565b5f5b5f198314611366575f8460020184815481106114bf576114bf611c86565b5f918252602090912060059091020160018101549091504267ffffffffffffffff90911611156114ef5750611366565b80548316156115015783915050610c0c565b6003015492506114a1565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61154f8484848461174b565b1215979650505050505050565b5f611565611828565b6040517f54636d2b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af11580156115e2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fa59190612067565b5f805f61161385856118ce565b915091506116218282611932565b95945050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d61166d8484848461174b565b13979650505050505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d6116bc8484848461174b565b12979650505050505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0061171660017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff611dd8565b60405160200161172891815260200190565b60408051808303601f190181529190528051602090910120166002015492915050565b5f8085158415178187128286121817858414178015611770578685925092505061181f565b505f85841315611784575092949193919260015b8386035f8112604c82131780156117b75782156117a9575f899450945050505061181f565b885f9450945050505061181f565b600a82900a8981028a8282816117cf576117cf612087565b05146117fb5784156117eb575f8b96509650505050505061181f565b8a5f96509650505050505061181f565b841561181057889650945061181f9350505050565b955087945061181f9350505050565b94509492505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b158061187f575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156118cc576040517f73e6d7b300000000000000000000000000000000000000000000000000000000815273200e12d10bb0c5e4a17e7018f0f1161919bb9389600482015260240161041e565b565b5f805f805f6118dd878761198c565b92509250925080611924576040517fc4717966000000000000000000000000000000000000000000000000000000008152600481018490526024810183905260440161041e565b5090925090505b9250929050565b5f805f61193f85856119e5565b9150915080611984576040517f22c9f7bb000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161041e565b509392505050565b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156119d757600a860460018201600a88065f14935093509350506101c7565b8593509150600190506101c7565b5f601b83900b8314838382611a49577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000860515611a2957620186a0860595506005850194505b8586601b0b14611a4457600a86059550846001019450611a29565b611a5f565b855f03611a5f57505f92506001915061192b9050565b848560030b14611abb575f851215611a7f57505f925082915061192b9050565b6040517fd556b111000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161041e565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b508054611af790611cb3565b5f825580601f10611b06575050565b601f0160209004905f5260205f2090810190611b229190611b25565b50565b5b80821115611b39575f8155600101611b26565b5090565b803560038110610542575f80fd5b5f8060408385031215611b5c575f80fd5b82359150611b6c60208401611b3d565b90509250929050565b5f60208284031215611b85575f80fd5b5035919050565b5f805f60608486031215611b9e575f80fd5b8335925060208401359150611bb560408501611b3d565b90509250925092565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610c0c6020830184611bbe565b5f805f8060608587031215611c11575f80fd5b84359350602085013567ffffffffffffffff8082168214611c30575f80fd5b90935060408601359080821115611c45575f80fd5b818701915087601f830112611c58575f80fd5b813581811115611c66575f80fd5b886020828501011115611c77575f80fd5b95989497505060200194505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b600181811c90821680611cc757607f821691505b602082108103611312577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b84815267ffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f60208284031215611d54575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610c0c575f80fd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6116216060830184611bbe565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610fa557610fa5611dab565b5f5f198203611dfc57611dfc611dab565b5060010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b601f821115611e7457805f5260205f20601f840160051c81016020851015611e555750805b601f840160051c820191505b81811015610a42575f8155600101611e61565b505050565b815167ffffffffffffffff811115611e9357611e93611e03565b611ea781611ea18454611cb3565b84611e30565b602080601f831160018114611eda575f8415611ec35750858301515b5f19600386901b1c1916600185901b17855561126a565b5f85815260208120601f198616915b82811015611f0857888601518255948401946001909101908401611ee9565b5085821015611f2557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60208284031215611f72575f80fd5b5051919050565b600181815b80851115611fb357815f1904821115611f9957611f99611dab565b80851615611fa657918102915b93841c9390800290611f7e565b509250929050565b5f82611fc957506001610fa5565b81611fd557505f610fa5565b8160018114611feb5760028114611ff557612011565b6001915050610fa5565b60ff84111561200657612006611dab565b50506001821b610fa5565b5060208310610133831016604e8410600b8410161715612034575081810a610fa5565b61203e8383611f79565b805f190482111561205157612051611dab565b029392505050565b5f610c0c60ff841683611fbb565b5f60208284031215612077575f80fd5b815160ff81168114610c0c575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd"; diff --git a/src/generated/StoxOffchainAssetReceiptVaultAuthorizerV1.pointers.sol b/src/generated/StoxOffchainAssetReceiptVaultAuthorizerV1.pointers.sol index 94ebb725..e161c73a 100644 --- a/src/generated/StoxOffchainAssetReceiptVaultAuthorizerV1.pointers.sol +++ b/src/generated/StoxOffchainAssetReceiptVaultAuthorizerV1.pointers.sol @@ -10,16 +10,16 @@ pragma solidity ^0.8.25; // file needs the contract to exist so that it can be compiled. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xaf9f471789bc889b5c3b0a0454cbc18aaa7041fddf42167d775043a016deec64); +bytes32 constant BYTECODE_HASH = bytes32(0xf8a1d9b2fa068bae3c1a607434db48364a5cdab3020bd7e315ed2662a3b35b5f); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xd20B8066ad1E7F93B4828e849522BbF698B107eC); +address constant DEPLOYED_ADDRESS = address(0x2EA0d35d0B1F57C42e6130f298930228bCbFDe9b); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6117a0806100d65f395ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c8063439fab911161007257806391d148541161005857806391d1485414610168578063a217fddf146101cc578063d547741f146101d3575f80fd5b8063439fab911461014257806359f89dda14610155575f80fd5b806301ffc9a7146100a3578063248a9ca3146100cb5780632f2ff15d1461011a57806336568abe1461012f575b5f80fd5b6100b66100b13660046112aa565b6101e6565b60405190151581526020015b60405180910390f35b61010c6100d93660046112f0565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b6040519081526020016100c2565b61012d610128366004611328565b6102d9565b005b61012d61013d366004611328565b610322565b61010c610150366004611485565b610380565b61012d6101633660046114bf565b6106a0565b6100b6610176366004611328565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61010c5f81565b61012d6101e1366004611328565b610a49565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda00000000000000000000000000000000000000000000000000000000148061027857507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b806102c457507fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000145b806102d357506102d382610a8c565b92915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461031281610b22565b61031c8383610b2f565b50505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610371576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61037b8282610c4d565b505050565b5f8061038a610d29565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156103b65750825b90505f8267ffffffffffffffff1660011480156103d25750303b155b9050811580156103e0575080155b15610417576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156104785784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f8780602001905181019061048d9190611514565b90505f61049982610d51565b90507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc381146104cb5796506106359050565b6105157ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f897fd6075ca92e18a15ce0e8ecaaae57a112072844045d11beeb264aac5f85e0daf26110f9565b61053f7fd6075ca92e18a15ce0e8ecaaae57a112072844045d11beeb264aac5f85e0daf2806110f9565b6105897f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e77fe25ff801c3c463dad5f8999289b7b43090e0f6f5039ae7c220cbb762fe8ff3736110f9565b6105b37fe25ff801c3c463dad5f8999289b7b43090e0f6f5039ae7c220cbb762fe8ff373806110f9565b6105e07fd6075ca92e18a15ce0e8ecaaae57a112072844045d11beeb264aac5f85e0daf2835f0151610b2f565b5061060e7fe25ff801c3c463dad5f8999289b7b43090e0f6f5039ae7c220cbb762fe8ff373835f0151610b2f565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3975050505b83156106965784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a8214806106ed57507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4882145b156109b6575f805f7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a850361074d575f848060200190518101906107319190611572565b9050805f01519350806020015192508060600151915050610779565b5f848060200190518101906107629190611667565b805160208201516080909201519095509093509150505b80156109ae5773ffffffffffffffffffffffffffffffffffffffff83161580156107e6575073ffffffffffffffffffffffffffffffffffffffff82165f9081527f96f78a99f93d631b75bc050854c9b764642c10564e41ed27c197a36ddabb1df9602052604090205460ff165b80610853575073ffffffffffffffffffffffffffffffffffffffff8216158015610853575073ffffffffffffffffffffffffffffffffffffffff83165f9081527f3907f76fa0fb1e5d0f263c5c4fe4316026052cf960c55a1c768106d8b9701c10602052604090205460ff165b1561086057505050505050565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a851480156108d2575073ffffffffffffffffffffffffffffffffffffffff86165f9081527f6ba48721fcbb2613af13d8285fe9ee4a081f7995464037bb5ea27397912881d2602052604090205460ff165b8061094a57507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a488514801561094a575073ffffffffffffffffffffffffffffffffffffffff86165f9081527f29e42896fa6edf5a5d7ff0bcd00acffbece6eb6cc7b44d0807bfd84929cc6e1b602052604090205460ff165b1561095757505050505050565b6040517ffe720f7800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8085166004830152831660248201526044015b60405180910390fd5b505050505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915290205460ff1615610a1157505050565b8282826040517f3ae4063b0000000000000000000000000000000000000000000000000000000081526004016109a593929190611729565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610a8281610b22565b61031c8383610c4d565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806102d357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102d3565b610b2c813361119a565b50565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff16610c44575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610be03390565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506102d3565b5f9150506102d3565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff1615610c44575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506102d3565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102d3565b5f610d5a611244565b815173ffffffffffffffffffffffffffffffffffffffff16610da8576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610df27f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d0533917f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b6110f9565b610e1c7f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b806110f9565b610e667f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e37f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d6110f9565b610e907f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d806110f9565b610eda7f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed7fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c6110f9565b610f047fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c806110f9565b610f4e7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8217f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc026110f9565b610f787f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02806110f9565b610fc27f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828697fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d36110f9565b610fec7fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3806110f9565b6110197f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b835f0151610b2f565b506110477f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d835f0151610b2f565b506110757fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c835f0151610b2f565b506110a37f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02835f0151610b2f565b506110d17fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3835f0151610b2f565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc392915050565b7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268005f611152845f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16611240576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044016109a5565b5050565b61124c61124e565b565b61125661128c565b61124c576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611295610d29565b5468010000000000000000900460ff16919050565b5f602082840312156112ba575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146112e9575f80fd5b9392505050565b5f60208284031215611300575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610b2c575f80fd5b5f8060408385031215611339575f80fd5b82359150602083013561134b81611307565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160a0810167ffffffffffffffff811182821017156113a6576113a6611356565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156113f3576113f3611356565b604052919050565b5f82601f83011261140a575f80fd5b813567ffffffffffffffff81111561142457611424611356565b61145560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016113ac565b818152846020838601011115611469575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611495575f80fd5b813567ffffffffffffffff8111156114ab575f80fd5b6114b7848285016113fb565b949350505050565b5f805f606084860312156114d1575f80fd5b83356114dc81611307565b925060208401359150604084013567ffffffffffffffff8111156114fe575f80fd5b61150a868287016113fb565b9150509250925092565b5f60208284031215611524575f80fd5b6040516020810181811067ffffffffffffffff8211171561154757611547611356565b604052825161155581611307565b81529392505050565b8051801515811461156d575f80fd5b919050565b5f60808284031215611582575f80fd5b6040516080810181811067ffffffffffffffff821117156115a5576115a5611356565b60405282516115b381611307565b815260208301516115c381611307565b6020820152604083810151908201526115de6060840161155e565b60608201529392505050565b5f82601f8301126115f9575f80fd5b8151602067ffffffffffffffff82111561161557611615611356565b8160051b6116248282016113ac565b928352848101820192828101908785111561163d575f80fd5b83870192505b8483101561165c57825182529183019190830190611643565b979650505050505050565b5f60208284031215611677575f80fd5b815167ffffffffffffffff8082111561168e575f80fd5b9083019060a082860312156116a1575f80fd5b6116a9611383565b82516116b481611307565b815260208301516116c481611307565b60208201526040830151828111156116da575f80fd5b6116e6878286016115ea565b6040830152506060830151828111156116fd575f80fd5b611709878286016115ea565b60608301525061171b6080840161155e565b608082015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f82518060608401528060208501608085015e5f6080828501015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505094935050505056"; + hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b611746806100d65f395ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c8063439fab911161007257806391d148541161005857806391d1485414610168578063a217fddf146101cc578063d547741f146101d3575f80fd5b8063439fab911461014257806359f89dda14610155575f80fd5b806301ffc9a7146100a3578063248a9ca3146100cb5780632f2ff15d1461011a57806336568abe1461012f575b5f80fd5b6100b66100b13660046112aa565b6101e6565b60405190151581526020015b60405180910390f35b61010c6100d93660046112f0565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b6040519081526020016100c2565b61012d610128366004611328565b6102d9565b005b61012d61013d366004611328565b610322565b61010c610150366004611449565b610380565b61012d610163366004611483565b6106a0565b6100b6610176366004611328565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61010c5f81565b61012d6101e1366004611328565b610a49565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda00000000000000000000000000000000000000000000000000000000148061027857507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b806102c457507fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000145b806102d357506102d382610a8c565b92915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461031281610b22565b61031c8383610b2f565b50505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610371576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61037b8282610c4d565b505050565b5f8061038a610d29565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156103b65750825b90505f8267ffffffffffffffff1660011480156103d25750303b155b9050811580156103e0575080155b15610417576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156104785784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f8780602001905181019061048d91906114d8565b90505f61049982610d51565b90507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc381146104cb5796506106359050565b6105157ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f897fd6075ca92e18a15ce0e8ecaaae57a112072844045d11beeb264aac5f85e0daf26110f9565b61053f7fd6075ca92e18a15ce0e8ecaaae57a112072844045d11beeb264aac5f85e0daf2806110f9565b6105897f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e77fe25ff801c3c463dad5f8999289b7b43090e0f6f5039ae7c220cbb762fe8ff3736110f9565b6105b37fe25ff801c3c463dad5f8999289b7b43090e0f6f5039ae7c220cbb762fe8ff373806110f9565b6105e07fd6075ca92e18a15ce0e8ecaaae57a112072844045d11beeb264aac5f85e0daf2835f0151610b2f565b5061060e7fe25ff801c3c463dad5f8999289b7b43090e0f6f5039ae7c220cbb762fe8ff373835f0151610b2f565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3975050505b83156106965784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a8214806106ed57507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4882145b156109b6575f805f7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a850361074d575f848060200190518101906107319190611536565b9050805f01519350806020015192508060600151915050610779565b5f84806020019051810190610762919061162b565b805160208201516080909201519095509093509150505b80156109ae5773ffffffffffffffffffffffffffffffffffffffff83161580156107e6575073ffffffffffffffffffffffffffffffffffffffff82165f9081527f96f78a99f93d631b75bc050854c9b764642c10564e41ed27c197a36ddabb1df9602052604090205460ff165b80610853575073ffffffffffffffffffffffffffffffffffffffff8216158015610853575073ffffffffffffffffffffffffffffffffffffffff83165f9081527f3907f76fa0fb1e5d0f263c5c4fe4316026052cf960c55a1c768106d8b9701c10602052604090205460ff165b1561086057505050505050565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a851480156108d2575073ffffffffffffffffffffffffffffffffffffffff86165f9081527f6ba48721fcbb2613af13d8285fe9ee4a081f7995464037bb5ea27397912881d2602052604090205460ff165b8061094a57507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a488514801561094a575073ffffffffffffffffffffffffffffffffffffffff86165f9081527f29e42896fa6edf5a5d7ff0bcd00acffbece6eb6cc7b44d0807bfd84929cc6e1b602052604090205460ff165b1561095757505050505050565b6040517ffe720f7800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8085166004830152831660248201526044015b60405180910390fd5b505050505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915290205460ff1615610a1157505050565b8282826040517f3ae4063b0000000000000000000000000000000000000000000000000000000081526004016109a5939291906116ed565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610a8281610b22565b61031c8383610c4d565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806102d357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102d3565b610b2c813361119a565b50565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff16610c44575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610be03390565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506102d3565b5f9150506102d3565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff1615610c44575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506102d3565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102d3565b5f610d5a611244565b815173ffffffffffffffffffffffffffffffffffffffff16610da8576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610df27f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d0533917f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b6110f9565b610e1c7f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b806110f9565b610e667f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e37f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d6110f9565b610e907f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d806110f9565b610eda7f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed7fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c6110f9565b610f047fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c806110f9565b610f4e7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8217f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc026110f9565b610f787f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02806110f9565b610fc27f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828697fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d36110f9565b610fec7fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3806110f9565b6110197f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b835f0151610b2f565b506110477f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d835f0151610b2f565b506110757fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c835f0151610b2f565b506110a37f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02835f0151610b2f565b506110d17fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3835f0151610b2f565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc392915050565b7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268005f611152845f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16611240576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044016109a5565b5050565b61124c61124e565b565b61125661128c565b61124c576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611295610d29565b5468010000000000000000900460ff16919050565b5f602082840312156112ba575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146112e9575f80fd5b9392505050565b5f60208284031215611300575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610b2c575f80fd5b5f8060408385031215611339575f80fd5b82359150602083013561134b81611307565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160a0810167ffffffffffffffff811182821017156113a6576113a6611356565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156113d5576113d5611356565b604052919050565b5f82601f8301126113ec575f80fd5b813567ffffffffffffffff81111561140657611406611356565b6114196020601f19601f840116016113ac565b81815284602083860101111561142d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611459575f80fd5b813567ffffffffffffffff81111561146f575f80fd5b61147b848285016113dd565b949350505050565b5f805f60608486031215611495575f80fd5b83356114a081611307565b925060208401359150604084013567ffffffffffffffff8111156114c2575f80fd5b6114ce868287016113dd565b9150509250925092565b5f602082840312156114e8575f80fd5b6040516020810181811067ffffffffffffffff8211171561150b5761150b611356565b604052825161151981611307565b81529392505050565b80518015158114611531575f80fd5b919050565b5f60808284031215611546575f80fd5b6040516080810181811067ffffffffffffffff8211171561156957611569611356565b604052825161157781611307565b8152602083015161158781611307565b6020820152604083810151908201526115a260608401611522565b60608201529392505050565b5f82601f8301126115bd575f80fd5b8151602067ffffffffffffffff8211156115d9576115d9611356565b8160051b6115e88282016113ac565b9283528481018201928281019087851115611601575f80fd5b83870192505b8483101561162057825182529183019190830190611607565b979650505050505050565b5f6020828403121561163b575f80fd5b815167ffffffffffffffff80821115611652575f80fd5b9083019060a08286031215611665575f80fd5b61166d611383565b825161167881611307565b8152602083015161168881611307565b602082015260408301518281111561169e575f80fd5b6116aa878286016115ae565b6040830152506060830151828111156116c1575f80fd5b6116cd878286016115ae565b6060830152506116df60808401611522565b608082015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f82518060608401528060208501608085015e5f608082850101526080601f19601f83011684010191505094935050505056"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b506004361061009f575f3560e01c8063439fab911161007257806391d148541161005857806391d1485414610168578063a217fddf146101cc578063d547741f146101d3575f80fd5b8063439fab911461014257806359f89dda14610155575f80fd5b806301ffc9a7146100a3578063248a9ca3146100cb5780632f2ff15d1461011a57806336568abe1461012f575b5f80fd5b6100b66100b13660046112aa565b6101e6565b60405190151581526020015b60405180910390f35b61010c6100d93660046112f0565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b6040519081526020016100c2565b61012d610128366004611328565b6102d9565b005b61012d61013d366004611328565b610322565b61010c610150366004611485565b610380565b61012d6101633660046114bf565b6106a0565b6100b6610176366004611328565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61010c5f81565b61012d6101e1366004611328565b610a49565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda00000000000000000000000000000000000000000000000000000000148061027857507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b806102c457507fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000145b806102d357506102d382610a8c565b92915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461031281610b22565b61031c8383610b2f565b50505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610371576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61037b8282610c4d565b505050565b5f8061038a610d29565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156103b65750825b90505f8267ffffffffffffffff1660011480156103d25750303b155b9050811580156103e0575080155b15610417576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156104785784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f8780602001905181019061048d9190611514565b90505f61049982610d51565b90507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc381146104cb5796506106359050565b6105157ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f897fd6075ca92e18a15ce0e8ecaaae57a112072844045d11beeb264aac5f85e0daf26110f9565b61053f7fd6075ca92e18a15ce0e8ecaaae57a112072844045d11beeb264aac5f85e0daf2806110f9565b6105897f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e77fe25ff801c3c463dad5f8999289b7b43090e0f6f5039ae7c220cbb762fe8ff3736110f9565b6105b37fe25ff801c3c463dad5f8999289b7b43090e0f6f5039ae7c220cbb762fe8ff373806110f9565b6105e07fd6075ca92e18a15ce0e8ecaaae57a112072844045d11beeb264aac5f85e0daf2835f0151610b2f565b5061060e7fe25ff801c3c463dad5f8999289b7b43090e0f6f5039ae7c220cbb762fe8ff373835f0151610b2f565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3975050505b83156106965784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a8214806106ed57507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4882145b156109b6575f805f7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a850361074d575f848060200190518101906107319190611572565b9050805f01519350806020015192508060600151915050610779565b5f848060200190518101906107629190611667565b805160208201516080909201519095509093509150505b80156109ae5773ffffffffffffffffffffffffffffffffffffffff83161580156107e6575073ffffffffffffffffffffffffffffffffffffffff82165f9081527f96f78a99f93d631b75bc050854c9b764642c10564e41ed27c197a36ddabb1df9602052604090205460ff165b80610853575073ffffffffffffffffffffffffffffffffffffffff8216158015610853575073ffffffffffffffffffffffffffffffffffffffff83165f9081527f3907f76fa0fb1e5d0f263c5c4fe4316026052cf960c55a1c768106d8b9701c10602052604090205460ff165b1561086057505050505050565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a851480156108d2575073ffffffffffffffffffffffffffffffffffffffff86165f9081527f6ba48721fcbb2613af13d8285fe9ee4a081f7995464037bb5ea27397912881d2602052604090205460ff165b8061094a57507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a488514801561094a575073ffffffffffffffffffffffffffffffffffffffff86165f9081527f29e42896fa6edf5a5d7ff0bcd00acffbece6eb6cc7b44d0807bfd84929cc6e1b602052604090205460ff165b1561095757505050505050565b6040517ffe720f7800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8085166004830152831660248201526044015b60405180910390fd5b505050505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915290205460ff1615610a1157505050565b8282826040517f3ae4063b0000000000000000000000000000000000000000000000000000000081526004016109a593929190611729565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610a8281610b22565b61031c8383610c4d565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806102d357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102d3565b610b2c813361119a565b50565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff16610c44575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610be03390565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506102d3565b5f9150506102d3565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff1615610c44575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506102d3565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102d3565b5f610d5a611244565b815173ffffffffffffffffffffffffffffffffffffffff16610da8576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610df27f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d0533917f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b6110f9565b610e1c7f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b806110f9565b610e667f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e37f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d6110f9565b610e907f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d806110f9565b610eda7f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed7fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c6110f9565b610f047fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c806110f9565b610f4e7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8217f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc026110f9565b610f787f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02806110f9565b610fc27f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828697fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d36110f9565b610fec7fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3806110f9565b6110197f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b835f0151610b2f565b506110477f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d835f0151610b2f565b506110757fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c835f0151610b2f565b506110a37f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02835f0151610b2f565b506110d17fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3835f0151610b2f565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc392915050565b7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268005f611152845f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16611240576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044016109a5565b5050565b61124c61124e565b565b61125661128c565b61124c576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611295610d29565b5468010000000000000000900460ff16919050565b5f602082840312156112ba575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146112e9575f80fd5b9392505050565b5f60208284031215611300575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610b2c575f80fd5b5f8060408385031215611339575f80fd5b82359150602083013561134b81611307565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160a0810167ffffffffffffffff811182821017156113a6576113a6611356565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156113f3576113f3611356565b604052919050565b5f82601f83011261140a575f80fd5b813567ffffffffffffffff81111561142457611424611356565b61145560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016113ac565b818152846020838601011115611469575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611495575f80fd5b813567ffffffffffffffff8111156114ab575f80fd5b6114b7848285016113fb565b949350505050565b5f805f606084860312156114d1575f80fd5b83356114dc81611307565b925060208401359150604084013567ffffffffffffffff8111156114fe575f80fd5b61150a868287016113fb565b9150509250925092565b5f60208284031215611524575f80fd5b6040516020810181811067ffffffffffffffff8211171561154757611547611356565b604052825161155581611307565b81529392505050565b8051801515811461156d575f80fd5b919050565b5f60808284031215611582575f80fd5b6040516080810181811067ffffffffffffffff821117156115a5576115a5611356565b60405282516115b381611307565b815260208301516115c381611307565b6020820152604083810151908201526115de6060840161155e565b60608201529392505050565b5f82601f8301126115f9575f80fd5b8151602067ffffffffffffffff82111561161557611615611356565b8160051b6116248282016113ac565b928352848101820192828101908785111561163d575f80fd5b83870192505b8483101561165c57825182529183019190830190611643565b979650505050505050565b5f60208284031215611677575f80fd5b815167ffffffffffffffff8082111561168e575f80fd5b9083019060a082860312156116a1575f80fd5b6116a9611383565b82516116b481611307565b815260208301516116c481611307565b60208201526040830151828111156116da575f80fd5b6116e6878286016115ea565b6040830152506060830151828111156116fd575f80fd5b611709878286016115ea565b60608301525061171b6080840161155e565b608082015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f82518060608401528060208501608085015e5f6080828501015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505094935050505056"; + hex"608060405234801561000f575f80fd5b506004361061009f575f3560e01c8063439fab911161007257806391d148541161005857806391d1485414610168578063a217fddf146101cc578063d547741f146101d3575f80fd5b8063439fab911461014257806359f89dda14610155575f80fd5b806301ffc9a7146100a3578063248a9ca3146100cb5780632f2ff15d1461011a57806336568abe1461012f575b5f80fd5b6100b66100b13660046112aa565b6101e6565b60405190151581526020015b60405180910390f35b61010c6100d93660046112f0565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b6040519081526020016100c2565b61012d610128366004611328565b6102d9565b005b61012d61013d366004611328565b610322565b61010c610150366004611449565b610380565b61012d610163366004611483565b6106a0565b6100b6610176366004611328565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61010c5f81565b61012d6101e1366004611328565b610a49565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda00000000000000000000000000000000000000000000000000000000148061027857507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b806102c457507fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000145b806102d357506102d382610a8c565b92915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461031281610b22565b61031c8383610b2f565b50505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610371576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61037b8282610c4d565b505050565b5f8061038a610d29565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156103b65750825b90505f8267ffffffffffffffff1660011480156103d25750303b155b9050811580156103e0575080155b15610417576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156104785784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f8780602001905181019061048d91906114d8565b90505f61049982610d51565b90507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc381146104cb5796506106359050565b6105157ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f897fd6075ca92e18a15ce0e8ecaaae57a112072844045d11beeb264aac5f85e0daf26110f9565b61053f7fd6075ca92e18a15ce0e8ecaaae57a112072844045d11beeb264aac5f85e0daf2806110f9565b6105897f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e77fe25ff801c3c463dad5f8999289b7b43090e0f6f5039ae7c220cbb762fe8ff3736110f9565b6105b37fe25ff801c3c463dad5f8999289b7b43090e0f6f5039ae7c220cbb762fe8ff373806110f9565b6105e07fd6075ca92e18a15ce0e8ecaaae57a112072844045d11beeb264aac5f85e0daf2835f0151610b2f565b5061060e7fe25ff801c3c463dad5f8999289b7b43090e0f6f5039ae7c220cbb762fe8ff373835f0151610b2f565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3975050505b83156106965784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a8214806106ed57507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4882145b156109b6575f805f7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a850361074d575f848060200190518101906107319190611536565b9050805f01519350806020015192508060600151915050610779565b5f84806020019051810190610762919061162b565b805160208201516080909201519095509093509150505b80156109ae5773ffffffffffffffffffffffffffffffffffffffff83161580156107e6575073ffffffffffffffffffffffffffffffffffffffff82165f9081527f96f78a99f93d631b75bc050854c9b764642c10564e41ed27c197a36ddabb1df9602052604090205460ff165b80610853575073ffffffffffffffffffffffffffffffffffffffff8216158015610853575073ffffffffffffffffffffffffffffffffffffffff83165f9081527f3907f76fa0fb1e5d0f263c5c4fe4316026052cf960c55a1c768106d8b9701c10602052604090205460ff165b1561086057505050505050565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a851480156108d2575073ffffffffffffffffffffffffffffffffffffffff86165f9081527f6ba48721fcbb2613af13d8285fe9ee4a081f7995464037bb5ea27397912881d2602052604090205460ff165b8061094a57507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a488514801561094a575073ffffffffffffffffffffffffffffffffffffffff86165f9081527f29e42896fa6edf5a5d7ff0bcd00acffbece6eb6cc7b44d0807bfd84929cc6e1b602052604090205460ff165b1561095757505050505050565b6040517ffe720f7800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8085166004830152831660248201526044015b60405180910390fd5b505050505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915290205460ff1615610a1157505050565b8282826040517f3ae4063b0000000000000000000000000000000000000000000000000000000081526004016109a5939291906116ed565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610a8281610b22565b61031c8383610c4d565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806102d357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102d3565b610b2c813361119a565b50565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff16610c44575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610be03390565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506102d3565b5f9150506102d3565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff1615610c44575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506102d3565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102d3565b5f610d5a611244565b815173ffffffffffffffffffffffffffffffffffffffff16610da8576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610df27f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d0533917f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b6110f9565b610e1c7f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b806110f9565b610e667f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e37f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d6110f9565b610e907f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d806110f9565b610eda7f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed7fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c6110f9565b610f047fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c806110f9565b610f4e7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8217f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc026110f9565b610f787f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02806110f9565b610fc27f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828697fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d36110f9565b610fec7fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3806110f9565b6110197f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b835f0151610b2f565b506110477f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d835f0151610b2f565b506110757fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c835f0151610b2f565b506110a37f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02835f0151610b2f565b506110d17fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3835f0151610b2f565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc392915050565b7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268005f611152845f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16611240576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044016109a5565b5050565b61124c61124e565b565b61125661128c565b61124c576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611295610d29565b5468010000000000000000900460ff16919050565b5f602082840312156112ba575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146112e9575f80fd5b9392505050565b5f60208284031215611300575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610b2c575f80fd5b5f8060408385031215611339575f80fd5b82359150602083013561134b81611307565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160a0810167ffffffffffffffff811182821017156113a6576113a6611356565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156113d5576113d5611356565b604052919050565b5f82601f8301126113ec575f80fd5b813567ffffffffffffffff81111561140657611406611356565b6114196020601f19601f840116016113ac565b81815284602083860101111561142d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215611459575f80fd5b813567ffffffffffffffff81111561146f575f80fd5b61147b848285016113dd565b949350505050565b5f805f60608486031215611495575f80fd5b83356114a081611307565b925060208401359150604084013567ffffffffffffffff8111156114c2575f80fd5b6114ce868287016113dd565b9150509250925092565b5f602082840312156114e8575f80fd5b6040516020810181811067ffffffffffffffff8211171561150b5761150b611356565b604052825161151981611307565b81529392505050565b80518015158114611531575f80fd5b919050565b5f60808284031215611546575f80fd5b6040516080810181811067ffffffffffffffff8211171561156957611569611356565b604052825161157781611307565b8152602083015161158781611307565b6020820152604083810151908201526115a260608401611522565b60608201529392505050565b5f82601f8301126115bd575f80fd5b8151602067ffffffffffffffff8211156115d9576115d9611356565b8160051b6115e88282016113ac565b9283528481018201928281019087851115611601575f80fd5b83870192505b8483101561162057825182529183019190830190611607565b979650505050505050565b5f6020828403121561163b575f80fd5b815167ffffffffffffffff80821115611652575f80fd5b9083019060a08286031215611665575f80fd5b61166d611383565b825161167881611307565b8152602083015161168881611307565b602082015260408301518281111561169e575f80fd5b6116aa878286016115ae565b6040830152506060830151828111156116c1575f80fd5b6116cd878286016115ae565b6060830152506116df60808401611522565b608082015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f82518060608401528060208501608085015e5f608082850101526080601f19601f83011684010191505094935050505056"; diff --git a/src/generated/StoxOffchainAssetReceiptVaultBeaconSetDeployer.pointers.sol b/src/generated/StoxOffchainAssetReceiptVaultBeaconSetDeployer.pointers.sol index 63a5b541..084be0fb 100644 --- a/src/generated/StoxOffchainAssetReceiptVaultBeaconSetDeployer.pointers.sol +++ b/src/generated/StoxOffchainAssetReceiptVaultBeaconSetDeployer.pointers.sol @@ -10,16 +10,16 @@ pragma solidity ^0.8.25; // file needs the contract to exist so that it can be compiled. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xebe5d9e38fbf28ee2759863ed3e071045ef104d9aabe06a2d1ae90be356cb55a); +bytes32 constant BYTECODE_HASH = bytes32(0x621c1edbd850939acba8bcd999812a83999b5680d4ca6804e1995b95f138b9e5); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x278897319b6969BF84C59882403925EF214513A1); +address constant DEPLOYED_ADDRESS = address(0xd64246e6b25F745f005E6233e050C9B879E660Dc); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"60c060405234801561000f575f80fd5b5060408051606081018252738e4bdeec7ceb9570d440676345da1dce10329f5b80825273636178081c59a458b34c6226dee79c7567a4f542602083018190527393545768d43a723fe8e07d9381edc56341e76a258385015292519192916100759061010b565b6001600160a01b03928316815291166020820152604001604051809103905ff0801580156100a5573d5f803e3d5ffd5b506001600160a01b0316608052604080820151825191519091906100c89061010b565b6001600160a01b03928316815291166020820152604001604051809103905ff0801580156100f8573d5f803e3d5ffd5b506001600160a01b031660a05250610118565b6104f780610fd783390190565b60805160a051610e926101455f395f818160c701526102d801525f8181607b01526102630152610e925ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301ffc9a71461004e5780632c9b7f40146100765780632f77a1c1146100c25780634904fab3146100e9575b5f80fd5b61006161005c3660046105d0565b6100fc565b60405190151581526020015b60405180910390f35b61009d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161006d565b61009d7f000000000000000000000000000000000000000000000000000000000000000081565b61009d6100f736600461075e565b610194565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4ae8243200000000000000000000000000000000000000000000000000000000148061018e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6020810151606001515f9073ffffffffffffffffffffffffffffffffffffffff1615610212576020820151606001516040517ffc47d97600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240160405180910390fd5b815173ffffffffffffffffffffffffffffffffffffffff16610260576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000060405161028e906105c3565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff0801580156102d2573d5f803e3d5ffd5b5090505f7f0000000000000000000000000000000000000000000000000000000000000000604051610303906105c3565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff080158015610347573d5f803e3d5ffd5b506040805173ffffffffffffffffffffffffffffffffffffffff80841660208301529293507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc39285169163439fab9191016040516020818303038152906040526040518263ffffffff1660e01b81526004016103c39190610894565b6020604051808303815f875af11580156103df573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040391906108a6565b1461043a576040517f0219069c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8184602001516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc38173ffffffffffffffffffffffffffffffffffffffff1663439fab91866040516020016104c491906108bd565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016104ef9190610894565b6020604051808303815f875af115801561050b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052f91906108a6565b14610566576040517f09c5931500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805133815273ffffffffffffffffffffffffffffffffffffffff838116602083015284168183015290517fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b9181900360600190a19392505050565b61052f8061096383390190565b5f602082840312156105e0575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461060f575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561066657610666610616565b60405290565b6040516080810167ffffffffffffffff8111828210171561066657610666610616565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b2575f80fd5b919050565b5f82601f8301126106c6575f80fd5b813567ffffffffffffffff808211156106e1576106e1610616565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561072757610727610616565b8160405283815286602085880101111561073f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561076e575f80fd5b813567ffffffffffffffff80821115610785575f80fd5b9083019060408286031215610798575f80fd5b6107a0610643565b6107a98361068f565b81526020830135828111156107bc575f80fd5b9290920191608083870312156107d0575f80fd5b6107d861066c565b6107e18461068f565b81526020840135838111156107f4575f80fd5b610800888287016106b7565b602083015250604084013583811115610817575f80fd5b610823888287016106b7565b6040830152506108356060850161068f565b6060820152602082015295945050505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61060f6020830184610848565b5f602082840312156108b6575f80fd5b5051919050565b602081525f73ffffffffffffffffffffffffffffffffffffffff8084511660208401526020840151604080850152818151166060850152602081015160808086015261090c60e0860182610848565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a08701526109478282610848565b9150508260608301511660c08601528093505050509291505056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056608060405234801561000f575f80fd5b506040516104f73803806104f783398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f80fd5b919050565b5f8060408385031215610170575f80fd5b61017983610144565b915061018760208401610144565b90509250929050565b61035a8061019d5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063715018a61161004d578063715018a6146100c05780638da5cb5b146100c8578063f2fde38b146100e5575f80fd5b80633659cfe6146100685780635c60da1b1461007d575b5f80fd5b61007b610076366004610320565b6100f8565b005b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b61010c565b5f5473ffffffffffffffffffffffffffffffffffffffff16610097565b61007b6100f3366004610320565b61011f565b610100610184565b610109816101d6565b50565b610114610184565b61011d5f6102ac565b565b610127610184565b73ffffffffffffffffffffffffffffffffffffffff811661017b576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610109816102ac565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461011d576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610172565b8073ffffffffffffffffffffffffffffffffffffffff163b5f0361023e576040517f847ac56400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610172565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610330575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610353575f80fd5b939250505056"; + hex"60c060405234801561000f575f80fd5b5060408051606081018252738e4bdeec7ceb9570d440676345da1dce10329f5b808252732df5cfe6d688ef9ff1b7c59a499d254b1527b28660208301819052732bcced626566ef1e65f922dd03748c5c7aa2d7488385015292519192916100759061010b565b6001600160a01b03928316815291166020820152604001604051809103905ff0801580156100a5573d5f803e3d5ffd5b506001600160a01b0316608052604080820151825191519091906100c89061010b565b6001600160a01b03928316815291166020820152604001604051809103905ff0801580156100f8573d5f803e3d5ffd5b506001600160a01b031660a05250610118565b6104f780610fd783390190565b60805160a051610e926101455f395f818160c701526102d801525f8181607b01526102630152610e925ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301ffc9a71461004e5780632c9b7f40146100765780632f77a1c1146100c25780634904fab3146100e9575b5f80fd5b61006161005c3660046105d0565b6100fc565b60405190151581526020015b60405180910390f35b61009d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161006d565b61009d7f000000000000000000000000000000000000000000000000000000000000000081565b61009d6100f736600461075e565b610194565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4ae8243200000000000000000000000000000000000000000000000000000000148061018e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6020810151606001515f9073ffffffffffffffffffffffffffffffffffffffff1615610212576020820151606001516040517ffc47d97600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240160405180910390fd5b815173ffffffffffffffffffffffffffffffffffffffff16610260576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000060405161028e906105c3565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff0801580156102d2573d5f803e3d5ffd5b5090505f7f0000000000000000000000000000000000000000000000000000000000000000604051610303906105c3565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff080158015610347573d5f803e3d5ffd5b506040805173ffffffffffffffffffffffffffffffffffffffff80841660208301529293507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc39285169163439fab9191016040516020818303038152906040526040518263ffffffff1660e01b81526004016103c39190610894565b6020604051808303815f875af11580156103df573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040391906108a6565b1461043a576040517f0219069c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8184602001516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc38173ffffffffffffffffffffffffffffffffffffffff1663439fab91866040516020016104c491906108bd565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016104ef9190610894565b6020604051808303815f875af115801561050b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052f91906108a6565b14610566576040517f09c5931500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805133815273ffffffffffffffffffffffffffffffffffffffff838116602083015284168183015290517fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b9181900360600190a19392505050565b61052f8061096383390190565b5f602082840312156105e0575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461060f575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561066657610666610616565b60405290565b6040516080810167ffffffffffffffff8111828210171561066657610666610616565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b2575f80fd5b919050565b5f82601f8301126106c6575f80fd5b813567ffffffffffffffff808211156106e1576106e1610616565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561072757610727610616565b8160405283815286602085880101111561073f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561076e575f80fd5b813567ffffffffffffffff80821115610785575f80fd5b9083019060408286031215610798575f80fd5b6107a0610643565b6107a98361068f565b81526020830135828111156107bc575f80fd5b9290920191608083870312156107d0575f80fd5b6107d861066c565b6107e18461068f565b81526020840135838111156107f4575f80fd5b610800888287016106b7565b602083015250604084013583811115610817575f80fd5b610823888287016106b7565b6040830152506108356060850161068f565b6060820152602082015295945050505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61060f6020830184610848565b5f602082840312156108b6575f80fd5b5051919050565b602081525f73ffffffffffffffffffffffffffffffffffffffff8084511660208401526020840151604080850152818151166060850152602081015160808086015261090c60e0860182610848565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a08701526109478282610848565b9150508260608301511660c08601528093505050509291505056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056608060405234801561000f575f80fd5b506040516104f73803806104f783398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f80fd5b919050565b5f8060408385031215610170575f80fd5b61017983610144565b915061018760208401610144565b90509250929050565b61035a8061019d5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063715018a61161004d578063715018a6146100c05780638da5cb5b146100c8578063f2fde38b146100e5575f80fd5b80633659cfe6146100685780635c60da1b1461007d575b5f80fd5b61007b610076366004610320565b6100f8565b005b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b61010c565b5f5473ffffffffffffffffffffffffffffffffffffffff16610097565b61007b6100f3366004610320565b61011f565b610100610184565b610109816101d6565b50565b610114610184565b61011d5f6102ac565b565b610127610184565b73ffffffffffffffffffffffffffffffffffffffff811661017b576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610109816102ac565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461011d576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610172565b8073ffffffffffffffffffffffffffffffffffffffff163b5f0361023e576040517f847ac56400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610172565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610330575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610353575f80fd5b939250505056"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301ffc9a71461004e5780632c9b7f40146100765780632f77a1c1146100c25780634904fab3146100e9575b5f80fd5b61006161005c3660046105d0565b6100fc565b60405190151581526020015b60405180910390f35b61009d7f0000000000000000000000004cdbdced050339640581f459c5281325aa7099d681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161006d565b61009d7f00000000000000000000000040f8bb9ed1bab0490f59330d5d357b27a88facc481565b61009d6100f736600461075e565b610194565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4ae8243200000000000000000000000000000000000000000000000000000000148061018e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6020810151606001515f9073ffffffffffffffffffffffffffffffffffffffff1615610212576020820151606001516040517ffc47d97600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240160405180910390fd5b815173ffffffffffffffffffffffffffffffffffffffff16610260576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f0000000000000000000000004cdbdced050339640581f459c5281325aa7099d660405161028e906105c3565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff0801580156102d2573d5f803e3d5ffd5b5090505f7f00000000000000000000000040f8bb9ed1bab0490f59330d5d357b27a88facc4604051610303906105c3565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff080158015610347573d5f803e3d5ffd5b506040805173ffffffffffffffffffffffffffffffffffffffff80841660208301529293507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc39285169163439fab9191016040516020818303038152906040526040518263ffffffff1660e01b81526004016103c39190610894565b6020604051808303815f875af11580156103df573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040391906108a6565b1461043a576040517f0219069c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8184602001516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc38173ffffffffffffffffffffffffffffffffffffffff1663439fab91866040516020016104c491906108bd565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016104ef9190610894565b6020604051808303815f875af115801561050b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052f91906108a6565b14610566576040517f09c5931500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805133815273ffffffffffffffffffffffffffffffffffffffff838116602083015284168183015290517fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b9181900360600190a19392505050565b61052f8061096383390190565b5f602082840312156105e0575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461060f575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561066657610666610616565b60405290565b6040516080810167ffffffffffffffff8111828210171561066657610666610616565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b2575f80fd5b919050565b5f82601f8301126106c6575f80fd5b813567ffffffffffffffff808211156106e1576106e1610616565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561072757610727610616565b8160405283815286602085880101111561073f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561076e575f80fd5b813567ffffffffffffffff80821115610785575f80fd5b9083019060408286031215610798575f80fd5b6107a0610643565b6107a98361068f565b81526020830135828111156107bc575f80fd5b9290920191608083870312156107d0575f80fd5b6107d861066c565b6107e18461068f565b81526020840135838111156107f4575f80fd5b610800888287016106b7565b602083015250604084013583811115610817575f80fd5b610823888287016106b7565b6040830152506108356060850161068f565b6060820152602082015295945050505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61060f6020830184610848565b5f602082840312156108b6575f80fd5b5051919050565b602081525f73ffffffffffffffffffffffffffffffffffffffff8084511660208401526020840151604080850152818151166060850152602081015160808086015261090c60e0860182610848565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a08701526109478282610848565b9150508260608301511660c08601528093505050509291505056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056"; + hex"608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301ffc9a71461004e5780632c9b7f40146100765780632f77a1c1146100c25780634904fab3146100e9575b5f80fd5b61006161005c3660046105d0565b6100fc565b60405190151581526020015b60405180910390f35b61009d7f000000000000000000000000ace121ae30d754536863a546f41b147be11202db81565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161006d565b61009d7f00000000000000000000000024e98b8f8f951b1868df88762cef589aedbc01eb81565b61009d6100f736600461075e565b610194565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4ae8243200000000000000000000000000000000000000000000000000000000148061018e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6020810151606001515f9073ffffffffffffffffffffffffffffffffffffffff1615610212576020820151606001516040517ffc47d97600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240160405180910390fd5b815173ffffffffffffffffffffffffffffffffffffffff16610260576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000ace121ae30d754536863a546f41b147be11202db60405161028e906105c3565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff0801580156102d2573d5f803e3d5ffd5b5090505f7f00000000000000000000000024e98b8f8f951b1868df88762cef589aedbc01eb604051610303906105c3565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff080158015610347573d5f803e3d5ffd5b506040805173ffffffffffffffffffffffffffffffffffffffff80841660208301529293507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc39285169163439fab9191016040516020818303038152906040526040518263ffffffff1660e01b81526004016103c39190610894565b6020604051808303815f875af11580156103df573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040391906108a6565b1461043a576040517f0219069c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8184602001516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc38173ffffffffffffffffffffffffffffffffffffffff1663439fab91866040516020016104c491906108bd565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016104ef9190610894565b6020604051808303815f875af115801561050b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052f91906108a6565b14610566576040517f09c5931500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805133815273ffffffffffffffffffffffffffffffffffffffff838116602083015284168183015290517fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b9181900360600190a19392505050565b61052f8061096383390190565b5f602082840312156105e0575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461060f575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561066657610666610616565b60405290565b6040516080810167ffffffffffffffff8111828210171561066657610666610616565b803573ffffffffffffffffffffffffffffffffffffffff811681146106b2575f80fd5b919050565b5f82601f8301126106c6575f80fd5b813567ffffffffffffffff808211156106e1576106e1610616565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561072757610727610616565b8160405283815286602085880101111561073f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561076e575f80fd5b813567ffffffffffffffff80821115610785575f80fd5b9083019060408286031215610798575f80fd5b6107a0610643565b6107a98361068f565b81526020830135828111156107bc575f80fd5b9290920191608083870312156107d0575f80fd5b6107d861066c565b6107e18461068f565b81526020840135838111156107f4575f80fd5b610800888287016106b7565b602083015250604084013583811115610817575f80fd5b610823888287016106b7565b6040830152506108356060850161068f565b6060820152602082015295945050505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61060f6020830184610848565b5f602082840312156108b6575f80fd5b5051919050565b602081525f73ffffffffffffffffffffffffffffffffffffffff8084511660208401526020840151604080850152818151166060850152602081015160808086015261090c60e0860182610848565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a08701526109478282610848565b9150508260608301511660c08601528093505050509291505056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056"; diff --git a/src/generated/StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1.pointers.sol b/src/generated/StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1.pointers.sol index f853d11c..f343350f 100644 --- a/src/generated/StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1.pointers.sol +++ b/src/generated/StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1.pointers.sol @@ -10,16 +10,16 @@ pragma solidity ^0.8.25; // file needs the contract to exist so that it can be compiled. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x3a8b4a4ace029d507180a5de34d92c4b0bde4d4c74887c7a407b0a9bd7419cea); +bytes32 constant BYTECODE_HASH = bytes32(0x4d94318cde48f1bc20f97e00aefad84bfb7c9db15c81b882862e127b05e06e15); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xb9b78F1e7b297fede490C4b82f368Ee2CB3eD844); +address constant DEPLOYED_ADDRESS = address(0xeaD68E489Cb19453b294dc46a3A5710b0d46d17F); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b506015601f565b601b601f565b60cf565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615606e5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460cc5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b61297c806100dc5f395ff3fe608060405234801561000f575f80fd5b5060043610610115575f3560e01c806359f89dda116100ad578063a086e1751161007d578063a4c9d30011610063578063a4c9d30014610331578063d547741f14610339578063f2fde38b1461034c575f80fd5b8063a086e17514610322578063a217fddf1461032a575f80fd5b806359f89dda1461029b578063715018a6146102ae5780638da5cb5b146102b657806391d14854146102be575f80fd5b80633013ce29116100e85780633013ce29146101c8578063325cd7961461022657806336568abe14610275578063439fab9114610288575f80fd5b806301ffc9a71461011957806304a0db2014610141578063248a9ca3146101725780632f2ff15d146101b3575b5f80fd5b61012c610127366004612166565b61035f565b60405190151581526020015b60405180910390f35b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b3202545b604051908152602001610138565b6101646101803660046121a5565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b6101c66101c13660046121dd565b610452565b005b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b32015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610138565b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b32015474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610138565b6101c66102833660046121dd565b61049b565b61016461029636600461236a565b6104f9565b6101c66102a936600461239c565b610ae4565b6101c6610f0e565b610201610f21565b61012c6102cc3660046121dd565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610201610f62565b6101645f81565b6101c6610f8a565b6101c66103473660046121dd565b61106d565b6101c661035a3660046123f1565b6110b0565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda0000000000000000000000000000000000000000000000000000000014806103f157507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b8061043d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000145b8061044c575061044c82611110565b92915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461048b816111a6565b61049583836111b0565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146104ea576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104f482826112d5565b505050565b5f806105036113b1565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f8115801561052f5750825b90505f8267ffffffffffffffff16600114801561054b5750303b155b905081158015610559575080155b15610590576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156105f15784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f87806020019051810190610606919061240c565b805190915073ffffffffffffffffffffffffffffffffffffffff16610657576040517fa7d26c7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015173ffffffffffffffffffffffffffffffffffffffff166106a8576040517f364467d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604081015173ffffffffffffffffffffffffffffffffffffffff166106f9576040517f3731597600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606081015173ffffffffffffffffffffffffffffffffffffffff1661074a576040517ff10d418200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80608001515f03610787576040517f7e0eb2bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80517f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b320080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161782556020808501517f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b32038054841691861691909117905560608501517f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b320180549093169416938417909155604080517f313ce567000000000000000000000000000000000000000000000000000000008152905192935f93909263313ce56792600480820193918290030181865afa1580156108a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c9919061247d565b6001830180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000060ff84160217905560808401516002840155604084015190915061092a906113d9565b7fbf322f47f534976d35baa3292f4fd04bf379264783a734383401b0e6e51cb16d835f01518460200151856040015186606001518588608001516040516109bb9695949392919073ffffffffffffffffffffffffffffffffffffffff9687168152948616602086015292851660408501529316606083015260ff92909216608082015260a081019190915260c00190565b60405180910390a16109f46040518060200160405280856040015173ffffffffffffffffffffffffffffffffffffffff168152506113ea565b50610a237f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc0284604001516112d5565b50610a527fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d384604001516112d5565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc398505050508315610ada5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b3200805473ffffffffffffffffffffffffffffffffffffffff16338114610b65578484846040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610b5c9392919061249d565b60405180910390fd5b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8218403610efc575f83806020019051810190610ba19190612514565b600184810154608083015192935073ffffffffffffffffffffffffffffffffffffffff8116927401000000000000000000000000000000000000000090910460ff16915f91610bf1918490611792565b90505f8373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c3d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c61919061247d565b60ff169050828114610ca9576040517fe420d7af0000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610b5c565b5f8673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cf3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d179190612600565b90508760020154811115610d675760028801546040517f86529caa000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610b5c565b825f03610dc75785516040517f3ae4063b000000000000000000000000000000000000000000000000000000008152610b5c91907f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821908c9060040161249d565b8551610dec9073ffffffffffffffffffffffffffffffffffffffff8716903086611819565b600388015486516040517fdb8554fc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201524260248201525f92919091169063db8554fc90604401602060405180830381865afa158015610e67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8b9190612600565b905060028114610eee5786516040517f3ae4063b000000000000000000000000000000000000000000000000000000008152610b5c91907f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821908d9060040161249d565b505050505050505050505050565b610f07858585611875565b5050505050565b610f16611c19565b610f1f5f611c71565b565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b5473ffffffffffffffffffffffffffffffffffffffff1692915050565b5f807f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b3200610f45565b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b320061106a610fb6610f21565b60018301546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611024573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110489190612600565b600184015473ffffffffffffffffffffffffffffffffffffffff169190611d06565b50565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260409020600101546110a6816111a6565b61049583836112d5565b6110b8611c19565b73ffffffffffffffffffffffffffffffffffffffff8116611107576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610b5c565b61106a81611c71565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461044c565b61106a8133611d61565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff166112c5575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556112613390565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600191505061044c565b5f91505061044c565b5092915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff16156112c5575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4600191505061044c565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061044c565b6113e1611e0b565b61106a81611e49565b5f6113f3611e51565b815173ffffffffffffffffffffffffffffffffffffffff16611441576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148b7f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d0533917f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b611e59565b6114b57f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b80611e59565b6114ff7f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e37f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d611e59565b6115297f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d80611e59565b6115737f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed7fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c611e59565b61159d7fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c80611e59565b6115e77f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8217f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02611e59565b6116117f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc0280611e59565b61165b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828697fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3611e59565b6116857fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d380611e59565b6116b27f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b835f01516111b0565b506116e07f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d835f01516111b0565b5061170e7fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c835f01516111b0565b5061173c7f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02835f01516111b0565b5061176a7fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3835f01516111b0565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc392915050565b5f82601211156117c657601283900360018316156117bc576117b48582611efa565b915050611812565b6117b48582611f46565b601283111561180f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee83016002831615611805576117b48582611f70565b6117b48582611ffe565b50825b9392505050565b61182784848484600161202d565b610495576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610b5c565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a8214806118c257507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4882145b15611b86575f805f7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a8503611922575f84806020019051810190611906919061262b565b9050805f0151935080602001519250806060015191505061194e565b5f848060200190518101906119379190612720565b805160208201516080909201519095509093509150505b8015611b7e5773ffffffffffffffffffffffffffffffffffffffff83161580156119bb575073ffffffffffffffffffffffffffffffffffffffff82165f9081527f96f78a99f93d631b75bc050854c9b764642c10564e41ed27c197a36ddabb1df9602052604090205460ff165b80611a28575073ffffffffffffffffffffffffffffffffffffffff8216158015611a28575073ffffffffffffffffffffffffffffffffffffffff83165f9081527f3907f76fa0fb1e5d0f263c5c4fe4316026052cf960c55a1c768106d8b9701c10602052604090205460ff165b15611a3557505050505050565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a85148015611aa7575073ffffffffffffffffffffffffffffffffffffffff86165f9081527f6ba48721fcbb2613af13d8285fe9ee4a081f7995464037bb5ea27397912881d2602052604090205460ff165b80611b1f57507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4885148015611b1f575073ffffffffffffffffffffffffffffffffffffffff86165f9081527f29e42896fa6edf5a5d7ff0bcd00acffbece6eb6cc7b44d0807bfd84929cc6e1b602052604090205460ff165b15611b2c57505050505050565b6040517ffe720f7800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808516600483015283166024820152604401610b5c565b505050505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915290205460ff1615611be157505050565b8282826040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610b5c9392919061249d565b33611c22610f21565b73ffffffffffffffffffffffffffffffffffffffff1614610f1f576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610b5c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611d1383838360016120c0565b6104f4576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610b5c565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16611e07576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015260248101839052604401610b5c565b5050565b611e13612148565b610f1f576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110b8611e0b565b610f1f611e0b565b7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268005f611eb2845f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f604e8210611f1c578215611f10576001611f12565b5f5b60ff16905061044c565b600a82900a808481611f3057611f306127e2565b04915080820284146112ce575060010192915050565b5f604e821015611f685781600a0a8381611f6257611f626127e2565b04611812565b5f9392505050565b5f604e8210611fae578215611fa5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611fa7565b5f5b905061044c565b50600a81900a8281029083818381611fc857611fc86127e2565b0414611ff4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611ff6565b815b949350505050565b600a81900a61200d818461283c565b9050604e821061044c578215611f685761202882600a612971565b611812565b6040517f23b872dd000000000000000000000000000000000000000000000000000000005f81815273ffffffffffffffffffffffffffffffffffffffff8781166004528616602452604485905291602083606481808c5af1925060015f511483166120af5783831516156120a3573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000005f81815273ffffffffffffffffffffffffffffffffffffffff8616600452602485905291602083604481808b5af1925060015f5114831661213c578383151615612130573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b5f6121516113b1565b5468010000000000000000900460ff16919050565b5f60208284031215612176575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611812575f80fd5b5f602082840312156121b5575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461106a575f80fd5b5f80604083850312156121ee575f80fd5b823591506020830135612200816121bc565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160a0810167ffffffffffffffff8111828210171561225b5761225b61220b565b60405290565b60405160c0810167ffffffffffffffff8111828210171561225b5761225b61220b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156122cb576122cb61220b565b604052919050565b5f67ffffffffffffffff8211156122ec576122ec61220b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112612327575f80fd5b813561233a612335826122d3565b612284565b81815284602083860101111561234e575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6020828403121561237a575f80fd5b813567ffffffffffffffff811115612390575f80fd5b611ff684828501612318565b5f805f606084860312156123ae575f80fd5b83356123b9816121bc565b925060208401359150604084013567ffffffffffffffff8111156123db575f80fd5b6123e786828701612318565b9150509250925092565b5f60208284031215612401575f80fd5b8135611812816121bc565b5f60a0828403121561241c575f80fd5b612424612238565b825161242f816121bc565b8152602083015161243f816121bc565b60208201526040830151612452816121bc565b60408201526060830151612465816121bc565b60608201526080928301519281019290925250919050565b5f6020828403121561248d575f80fd5b815160ff81168114611812575f80fd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f82518060608401528060208501608085015e5f6080828501015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116840101915050949350505050565b5f6020808385031215612525575f80fd5b825167ffffffffffffffff8082111561253c575f80fd5b9084019060c0828703121561254f575f80fd5b612557612261565b8251612562816121bc565b815282840151612571816121bc565b80858301525060408301516040820152606083015160608201526080830151608082015260a0830151828111156125a6575f80fd5b80840193505086601f8401126125ba575f80fd5b825191506125ca612335836122d3565b82815287858486010111156125dd575f80fd5b828585018683015e5f8584830101528060a0830152508094505050505092915050565b5f60208284031215612610575f80fd5b5051919050565b80518015158114612626575f80fd5b919050565b5f6080828403121561263b575f80fd5b6040516080810181811067ffffffffffffffff8211171561265e5761265e61220b565b604052825161266c816121bc565b8152602083015161267c816121bc565b60208201526040838101519082015261269760608401612617565b60608201529392505050565b5f82601f8301126126b2575f80fd5b8151602067ffffffffffffffff8211156126ce576126ce61220b565b8160051b6126dd828201612284565b92835284810182019282810190878511156126f6575f80fd5b83870192505b84831015612715578251825291830191908301906126fc565b979650505050505050565b5f60208284031215612730575f80fd5b815167ffffffffffffffff80821115612747575f80fd5b9083019060a0828603121561275a575f80fd5b612762612238565b825161276d816121bc565b8152602083015161277d816121bc565b6020820152604083015182811115612793575f80fd5b61279f878286016126a3565b6040830152506060830151828111156127b6575f80fd5b6127c2878286016126a3565b6060830152506127d460808401612617565b608082015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761044c5761044c61280f565b600181815b808511156128ac57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156128925761289261280f565b8085161561289f57918102915b93841c9390800290612858565b509250929050565b5f826128c25750600161044c565b816128ce57505f61044c565b81600181146128e457600281146128ee5761290a565b600191505061044c565b60ff8411156128ff576128ff61280f565b50506001821b61044c565b5060208310610133831016604e8410600b841016171561292d575081810a61044c565b6129378383612853565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156129695761296961280f565b029392505050565b5f61181283836128b456"; + hex"6080604052348015600e575f80fd5b506015601f565b601b601f565b60cf565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615606e5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460cc5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b612650806100dc5f395ff3fe608060405234801561000f575f80fd5b5060043610610115575f3560e01c806359f89dda116100ad578063a086e1751161007d578063a4c9d30011610063578063a4c9d3001461030a578063d547741f14610312578063f2fde38b14610325575f80fd5b8063a086e175146102fb578063a217fddf14610303575f80fd5b806359f89dda14610281578063715018a6146102945780638da5cb5b1461029c57806391d14854146102a4575f80fd5b80633013ce29116100e85780633013ce29146101c8578063325cd7961461020c57806336568abe1461025b578063439fab911461026e575f80fd5b806301ffc9a71461011957806304a0db2014610141578063248a9ca3146101725780632f2ff15d146101b3575b5f80fd5b61012c610127366004611eec565b610338565b60405190151581526020015b60405180910390f35b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b3202545b604051908152602001610138565b610164610180366004611f2b565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b6101c66101c1366004611f56565b61042b565b005b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b3201546001600160a01b03165b6040516001600160a01b039091168152602001610138565b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b32015474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610138565b6101c6610269366004611f56565b610474565b61016461027c3660046120a7565b6104c5565b6101c661028f3660046120d9565b610a55565b6101c6610e31565b6101f4610e44565b61012c6102b2366004611f56565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6101f4610e78565b6101645f81565b6101c6610ea0565b6101c6610320366004611f56565b610f69565b6101c661033336600461212e565b610fac565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda0000000000000000000000000000000000000000000000000000000014806103ca57507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b8061041657507fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000145b80610425575061042582610fff565b92915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461046481611095565b61046e838361109f565b50505050565b6001600160a01b03811633146104b6576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104c08282611190565b505050565b5f806104cf611252565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156104fb5750825b90505f8267ffffffffffffffff1660011480156105175750303b155b905081158015610525575080155b1561055c576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156105bd5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f878060200190518101906105d29190612149565b80519091506001600160a01b0316610616576040517fa7d26c7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208101516001600160a01b031661065a576040517f364467d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408101516001600160a01b031661069e576040517f3731597600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608101516001600160a01b03166106e2576040517ff10d418200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80608001515f0361071f576040517f7e0eb2bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80517f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b320080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b039384161782556020808501517f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b32038054841691861691909117905560608501517f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b320180549093169416938417909155604080517f313ce567000000000000000000000000000000000000000000000000000000008152905192935f93909263313ce56792600480820193918290030181865afa158015610830573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085491906121ba565b6001830180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000060ff8416021790556080840151600284015560408401519091506108b59061127a565b7fbf322f47f534976d35baa3292f4fd04bf379264783a734383401b0e6e51cb16d835f0151846020015185604001518660600151858860800151604051610939969594939291906001600160a01b039687168152948616602086015292851660408501529316606083015260ff92909216608082015260a081019190915260c00190565b60405180910390a1610965604051806020016040528085604001516001600160a01b031681525061128b565b506109947f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc028460400151611190565b506109c37fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d38460400151611190565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc398505050508315610a4b5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b320080546001600160a01b0316338114610ac9578484846040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610ac0939291906121da565b60405180910390fd5b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8218403610e1f575f83806020019051810190610b059190612226565b60018481015460808301519293506001600160a01b038116927401000000000000000000000000000000000000000090910460ff16915f91610b48918490611626565b90505f836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bab91906121ba565b60ff169050828114610bf3576040517fe420d7af0000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610ac0565b5f866001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c549190612312565b90508760020154811115610ca45760028801546040517f86529caa000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610ac0565b825f03610d045785516040517f3ae4063b000000000000000000000000000000000000000000000000000000008152610ac091907f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821908c906004016121da565b8551610d1c906001600160a01b0387169030866116ad565b600388015486516040517fdb8554fc0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201524260248201525f92919091169063db8554fc90604401602060405180830381865afa158015610d8a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dae9190612312565b905060028114610e115786516040517f3ae4063b000000000000000000000000000000000000000000000000000000008152610ac091907f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821908d906004016121da565b505050505050505050505050565b610e2a8585856116fc565b5050505050565b610e39611a38565b610e425f611a83565b565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b5f807f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b3200610e68565b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b3200610f66610ecc610e44565b60018301546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610f2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f519190612312565b60018401546001600160a01b03169190611b0b565b50565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610fa281611095565b61046e8383611190565b610fb4611a38565b6001600160a01b038116610ff6576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610ac0565b610f6681611a83565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061042557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610425565b610f668133611b59565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611180575f848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556111363390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610425565b5f915050610425565b5092915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611180575f848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610425565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610425565b611282611be9565b610f6681611c27565b5f611294611c2f565b81516001600160a01b03166112d5576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61131f7f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d0533917f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b611c37565b6113497f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b80611c37565b6113937f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e37f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d611c37565b6113bd7f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d80611c37565b6114077f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed7fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c611c37565b6114317fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c80611c37565b61147b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8217f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02611c37565b6114a57f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc0280611c37565b6114ef7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828697fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3611c37565b6115197fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d380611c37565b6115467f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b835f015161109f565b506115747f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d835f015161109f565b506115a27fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c835f015161109f565b506115d07f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02835f015161109f565b506115fe7fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3835f015161109f565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc392915050565b5f826012111561165a5760128390036001831615611650576116488582611cd8565b9150506116a6565b6116488582611d24565b60128311156116a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee83016002831615611699576116488582611d4e565b6116488582611d9e565b50825b9392505050565b6116bb848484846001611dcd565b61046e576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610ac0565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a82148061174957507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4882145b156119b2575f805f7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a85036117a9575f8480602001905181019061178d919061233d565b9050805f015193508060200151925080606001519150506117d5565b5f848060200190518101906117be9190612432565b805160208201516080909201519095509093509150505b80156119aa576001600160a01b03831615801561182857506001600160a01b0382165f9081527f96f78a99f93d631b75bc050854c9b764642c10564e41ed27c197a36ddabb1df9602052604090205460ff165b8061187b57506001600160a01b03821615801561187b57506001600160a01b0383165f9081527f3907f76fa0fb1e5d0f263c5c4fe4316026052cf960c55a1c768106d8b9701c10602052604090205460ff165b1561188857505050505050565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a851480156118ed57506001600160a01b0386165f9081527f6ba48721fcbb2613af13d8285fe9ee4a081f7995464037bb5ea27397912881d2602052604090205460ff165b8061195857507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a488514801561195857506001600160a01b0386165f9081527f29e42896fa6edf5a5d7ff0bcd00acffbece6eb6cc7b44d0807bfd84929cc6e1b602052604090205460ff165b1561196557505050505050565b6040517ffe720f780000000000000000000000000000000000000000000000000000000081526001600160a01b03808516600483015283166024820152604401610ac0565b505050505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038716845290915290205460ff1615611a0057505050565b8282826040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610ac0939291906121da565b33611a41610e44565b6001600160a01b031614610e42576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610ac0565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611b188383836001611e53565b6104c0576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610ac0565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16611be5576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260248101839052604401610ac0565b5050565b611bf1611ece565b610e42576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fb4611be9565b610e42611be9565b7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268005f611c90845f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f604e8210611cfa578215611cee576001611cf0565b5f5b60ff169050610425565b600a82900a808481611d0e57611d0e6124f4565b0491508082028414611189575060010192915050565b5f604e821015611d465781600a0a8381611d4057611d406124f4565b046116a6565b5f9392505050565b5f604e8210611d6d578215611d64575f19611d66565b5f5b9050610425565b50600a81900a8281029083818381611d8757611d876124f4565b0414611d94575f19611d96565b815b949350505050565b600a81900a611dad818461254e565b9050604e8210610425578215611d4657611dc882600a612645565b6116a6565b6040517f23b872dd000000000000000000000000000000000000000000000000000000005f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316611e42578383151615611e36573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000005f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316611ec2578383151615611eb6573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b5f611ed7611252565b5468010000000000000000900460ff16919050565b5f60208284031215611efc575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146116a6575f80fd5b5f60208284031215611f3b575f80fd5b5035919050565b6001600160a01b0381168114610f66575f80fd5b5f8060408385031215611f67575f80fd5b823591506020830135611f7981611f42565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160a0810167ffffffffffffffff81118282101715611fd457611fd4611f84565b60405290565b60405160c0810167ffffffffffffffff81118282101715611fd457611fd4611f84565b604051601f8201601f1916810167ffffffffffffffff8111828210171561202657612026611f84565b604052919050565b5f67ffffffffffffffff82111561204757612047611f84565b50601f01601f191660200190565b5f82601f830112612064575f80fd5b81356120776120728261202e565b611ffd565b81815284602083860101111561208b575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156120b7575f80fd5b813567ffffffffffffffff8111156120cd575f80fd5b611d9684828501612055565b5f805f606084860312156120eb575f80fd5b83356120f681611f42565b925060208401359150604084013567ffffffffffffffff811115612118575f80fd5b61212486828701612055565b9150509250925092565b5f6020828403121561213e575f80fd5b81356116a681611f42565b5f60a08284031215612159575f80fd5b612161611fb1565b825161216c81611f42565b8152602083015161217c81611f42565b6020820152604083015161218f81611f42565b604082015260608301516121a281611f42565b60608201526080928301519281019290925250919050565b5f602082840312156121ca575f80fd5b815160ff811681146116a6575f80fd5b6001600160a01b0384168152826020820152606060408201525f82518060608401528060208501608085015e5f608082850101526080601f19601f830116840101915050949350505050565b5f6020808385031215612237575f80fd5b825167ffffffffffffffff8082111561224e575f80fd5b9084019060c08287031215612261575f80fd5b612269611fda565b825161227481611f42565b81528284015161228381611f42565b80858301525060408301516040820152606083015160608201526080830151608082015260a0830151828111156122b8575f80fd5b80840193505086601f8401126122cc575f80fd5b825191506122dc6120728361202e565b82815287858486010111156122ef575f80fd5b828585018683015e5f8584830101528060a0830152508094505050505092915050565b5f60208284031215612322575f80fd5b5051919050565b80518015158114612338575f80fd5b919050565b5f6080828403121561234d575f80fd5b6040516080810181811067ffffffffffffffff8211171561237057612370611f84565b604052825161237e81611f42565b8152602083015161238e81611f42565b6020820152604083810151908201526123a960608401612329565b60608201529392505050565b5f82601f8301126123c4575f80fd5b8151602067ffffffffffffffff8211156123e0576123e0611f84565b8160051b6123ef828201611ffd565b9283528481018201928281019087851115612408575f80fd5b83870192505b848310156124275782518252918301919083019061240e565b979650505050505050565b5f60208284031215612442575f80fd5b815167ffffffffffffffff80821115612459575f80fd5b9083019060a0828603121561246c575f80fd5b612474611fb1565b825161247f81611f42565b8152602083015161248f81611f42565b60208201526040830151828111156124a5575f80fd5b6124b1878286016123b5565b6040830152506060830151828111156124c8575f80fd5b6124d4878286016123b5565b6060830152506124e660808401612329565b608082015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761042557610425612521565b600181815b8085111561259f57815f190482111561258557612585612521565b8085161561259257918102915b93841c939080029061256a565b509250929050565b5f826125b557506001610425565b816125c157505f610425565b81600181146125d757600281146125e1576125fd565b6001915050610425565b60ff8411156125f2576125f2612521565b50506001821b610425565b5060208310610133831016604e8410600b8410161715612620575081810a610425565b61262a8383612565565b805f190482111561263d5761263d612521565b029392505050565b5f6116a683836125a756"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b5060043610610115575f3560e01c806359f89dda116100ad578063a086e1751161007d578063a4c9d30011610063578063a4c9d30014610331578063d547741f14610339578063f2fde38b1461034c575f80fd5b8063a086e17514610322578063a217fddf1461032a575f80fd5b806359f89dda1461029b578063715018a6146102ae5780638da5cb5b146102b657806391d14854146102be575f80fd5b80633013ce29116100e85780633013ce29146101c8578063325cd7961461022657806336568abe14610275578063439fab9114610288575f80fd5b806301ffc9a71461011957806304a0db2014610141578063248a9ca3146101725780632f2ff15d146101b3575b5f80fd5b61012c610127366004612166565b61035f565b60405190151581526020015b60405180910390f35b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b3202545b604051908152602001610138565b6101646101803660046121a5565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b6101c66101c13660046121dd565b610452565b005b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b32015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610138565b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b32015474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610138565b6101c66102833660046121dd565b61049b565b61016461029636600461236a565b6104f9565b6101c66102a936600461239c565b610ae4565b6101c6610f0e565b610201610f21565b61012c6102cc3660046121dd565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610201610f62565b6101645f81565b6101c6610f8a565b6101c66103473660046121dd565b61106d565b6101c661035a3660046123f1565b6110b0565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda0000000000000000000000000000000000000000000000000000000014806103f157507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b8061043d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000145b8061044c575061044c82611110565b92915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461048b816111a6565b61049583836111b0565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146104ea576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104f482826112d5565b505050565b5f806105036113b1565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f8115801561052f5750825b90505f8267ffffffffffffffff16600114801561054b5750303b155b905081158015610559575080155b15610590576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156105f15784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f87806020019051810190610606919061240c565b805190915073ffffffffffffffffffffffffffffffffffffffff16610657576040517fa7d26c7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015173ffffffffffffffffffffffffffffffffffffffff166106a8576040517f364467d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604081015173ffffffffffffffffffffffffffffffffffffffff166106f9576040517f3731597600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606081015173ffffffffffffffffffffffffffffffffffffffff1661074a576040517ff10d418200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80608001515f03610787576040517f7e0eb2bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80517f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b320080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161782556020808501517f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b32038054841691861691909117905560608501517f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b320180549093169416938417909155604080517f313ce567000000000000000000000000000000000000000000000000000000008152905192935f93909263313ce56792600480820193918290030181865afa1580156108a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c9919061247d565b6001830180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000060ff84160217905560808401516002840155604084015190915061092a906113d9565b7fbf322f47f534976d35baa3292f4fd04bf379264783a734383401b0e6e51cb16d835f01518460200151856040015186606001518588608001516040516109bb9695949392919073ffffffffffffffffffffffffffffffffffffffff9687168152948616602086015292851660408501529316606083015260ff92909216608082015260a081019190915260c00190565b60405180910390a16109f46040518060200160405280856040015173ffffffffffffffffffffffffffffffffffffffff168152506113ea565b50610a237f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc0284604001516112d5565b50610a527fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d384604001516112d5565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc398505050508315610ada5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b3200805473ffffffffffffffffffffffffffffffffffffffff16338114610b65578484846040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610b5c9392919061249d565b60405180910390fd5b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8218403610efc575f83806020019051810190610ba19190612514565b600184810154608083015192935073ffffffffffffffffffffffffffffffffffffffff8116927401000000000000000000000000000000000000000090910460ff16915f91610bf1918490611792565b90505f8373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c3d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c61919061247d565b60ff169050828114610ca9576040517fe420d7af0000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610b5c565b5f8673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cf3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d179190612600565b90508760020154811115610d675760028801546040517f86529caa000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610b5c565b825f03610dc75785516040517f3ae4063b000000000000000000000000000000000000000000000000000000008152610b5c91907f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821908c9060040161249d565b8551610dec9073ffffffffffffffffffffffffffffffffffffffff8716903086611819565b600388015486516040517fdb8554fc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201524260248201525f92919091169063db8554fc90604401602060405180830381865afa158015610e67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e8b9190612600565b905060028114610eee5786516040517f3ae4063b000000000000000000000000000000000000000000000000000000008152610b5c91907f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821908d9060040161249d565b505050505050505050505050565b610f07858585611875565b5050505050565b610f16611c19565b610f1f5f611c71565b565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b5473ffffffffffffffffffffffffffffffffffffffff1692915050565b5f807f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b3200610f45565b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b320061106a610fb6610f21565b60018301546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015611024573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110489190612600565b600184015473ffffffffffffffffffffffffffffffffffffffff169190611d06565b50565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260409020600101546110a6816111a6565b61049583836112d5565b6110b8611c19565b73ffffffffffffffffffffffffffffffffffffffff8116611107576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610b5c565b61106a81611c71565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461044c565b61106a8133611d61565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff166112c5575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556112613390565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600191505061044c565b5f91505061044c565b5092915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff16156112c5575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4600191505061044c565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061044c565b6113e1611e0b565b61106a81611e49565b5f6113f3611e51565b815173ffffffffffffffffffffffffffffffffffffffff16611441576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148b7f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d0533917f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b611e59565b6114b57f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b80611e59565b6114ff7f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e37f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d611e59565b6115297f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d80611e59565b6115737f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed7fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c611e59565b61159d7fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c80611e59565b6115e77f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8217f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02611e59565b6116117f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc0280611e59565b61165b7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828697fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3611e59565b6116857fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d380611e59565b6116b27f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b835f01516111b0565b506116e07f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d835f01516111b0565b5061170e7fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c835f01516111b0565b5061173c7f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02835f01516111b0565b5061176a7fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3835f01516111b0565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc392915050565b5f82601211156117c657601283900360018316156117bc576117b48582611efa565b915050611812565b6117b48582611f46565b601283111561180f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee83016002831615611805576117b48582611f70565b6117b48582611ffe565b50825b9392505050565b61182784848484600161202d565b610495576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610b5c565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a8214806118c257507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4882145b15611b86575f805f7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a8503611922575f84806020019051810190611906919061262b565b9050805f0151935080602001519250806060015191505061194e565b5f848060200190518101906119379190612720565b805160208201516080909201519095509093509150505b8015611b7e5773ffffffffffffffffffffffffffffffffffffffff83161580156119bb575073ffffffffffffffffffffffffffffffffffffffff82165f9081527f96f78a99f93d631b75bc050854c9b764642c10564e41ed27c197a36ddabb1df9602052604090205460ff165b80611a28575073ffffffffffffffffffffffffffffffffffffffff8216158015611a28575073ffffffffffffffffffffffffffffffffffffffff83165f9081527f3907f76fa0fb1e5d0f263c5c4fe4316026052cf960c55a1c768106d8b9701c10602052604090205460ff165b15611a3557505050505050565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a85148015611aa7575073ffffffffffffffffffffffffffffffffffffffff86165f9081527f6ba48721fcbb2613af13d8285fe9ee4a081f7995464037bb5ea27397912881d2602052604090205460ff165b80611b1f57507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4885148015611b1f575073ffffffffffffffffffffffffffffffffffffffff86165f9081527f29e42896fa6edf5a5d7ff0bcd00acffbece6eb6cc7b44d0807bfd84929cc6e1b602052604090205460ff165b15611b2c57505050505050565b6040517ffe720f7800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808516600483015283166024820152604401610b5c565b505050505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915290205460ff1615611be157505050565b8282826040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610b5c9392919061249d565b33611c22610f21565b73ffffffffffffffffffffffffffffffffffffffff1614610f1f576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610b5c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611d1383838360016120c0565b6104f4576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610b5c565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16611e07576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015260248101839052604401610b5c565b5050565b611e13612148565b610f1f576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110b8611e0b565b610f1f611e0b565b7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268005f611eb2845f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f604e8210611f1c578215611f10576001611f12565b5f5b60ff16905061044c565b600a82900a808481611f3057611f306127e2565b04915080820284146112ce575060010192915050565b5f604e821015611f685781600a0a8381611f6257611f626127e2565b04611812565b5f9392505050565b5f604e8210611fae578215611fa5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611fa7565b5f5b905061044c565b50600a81900a8281029083818381611fc857611fc86127e2565b0414611ff4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611ff6565b815b949350505050565b600a81900a61200d818461283c565b9050604e821061044c578215611f685761202882600a612971565b611812565b6040517f23b872dd000000000000000000000000000000000000000000000000000000005f81815273ffffffffffffffffffffffffffffffffffffffff8781166004528616602452604485905291602083606481808c5af1925060015f511483166120af5783831516156120a3573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000005f81815273ffffffffffffffffffffffffffffffffffffffff8616600452602485905291602083604481808b5af1925060015f5114831661213c578383151615612130573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b5f6121516113b1565b5468010000000000000000900460ff16919050565b5f60208284031215612176575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611812575f80fd5b5f602082840312156121b5575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461106a575f80fd5b5f80604083850312156121ee575f80fd5b823591506020830135612200816121bc565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160a0810167ffffffffffffffff8111828210171561225b5761225b61220b565b60405290565b60405160c0810167ffffffffffffffff8111828210171561225b5761225b61220b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156122cb576122cb61220b565b604052919050565b5f67ffffffffffffffff8211156122ec576122ec61220b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112612327575f80fd5b813561233a612335826122d3565b612284565b81815284602083860101111561234e575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6020828403121561237a575f80fd5b813567ffffffffffffffff811115612390575f80fd5b611ff684828501612318565b5f805f606084860312156123ae575f80fd5b83356123b9816121bc565b925060208401359150604084013567ffffffffffffffff8111156123db575f80fd5b6123e786828701612318565b9150509250925092565b5f60208284031215612401575f80fd5b8135611812816121bc565b5f60a0828403121561241c575f80fd5b612424612238565b825161242f816121bc565b8152602083015161243f816121bc565b60208201526040830151612452816121bc565b60408201526060830151612465816121bc565b60608201526080928301519281019290925250919050565b5f6020828403121561248d575f80fd5b815160ff81168114611812575f80fd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f82518060608401528060208501608085015e5f6080828501015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116840101915050949350505050565b5f6020808385031215612525575f80fd5b825167ffffffffffffffff8082111561253c575f80fd5b9084019060c0828703121561254f575f80fd5b612557612261565b8251612562816121bc565b815282840151612571816121bc565b80858301525060408301516040820152606083015160608201526080830151608082015260a0830151828111156125a6575f80fd5b80840193505086601f8401126125ba575f80fd5b825191506125ca612335836122d3565b82815287858486010111156125dd575f80fd5b828585018683015e5f8584830101528060a0830152508094505050505092915050565b5f60208284031215612610575f80fd5b5051919050565b80518015158114612626575f80fd5b919050565b5f6080828403121561263b575f80fd5b6040516080810181811067ffffffffffffffff8211171561265e5761265e61220b565b604052825161266c816121bc565b8152602083015161267c816121bc565b60208201526040838101519082015261269760608401612617565b60608201529392505050565b5f82601f8301126126b2575f80fd5b8151602067ffffffffffffffff8211156126ce576126ce61220b565b8160051b6126dd828201612284565b92835284810182019282810190878511156126f6575f80fd5b83870192505b84831015612715578251825291830191908301906126fc565b979650505050505050565b5f60208284031215612730575f80fd5b815167ffffffffffffffff80821115612747575f80fd5b9083019060a0828603121561275a575f80fd5b612762612238565b825161276d816121bc565b8152602083015161277d816121bc565b6020820152604083015182811115612793575f80fd5b61279f878286016126a3565b6040830152506060830151828111156127b6575f80fd5b6127c2878286016126a3565b6060830152506127d460808401612617565b608082015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761044c5761044c61280f565b600181815b808511156128ac57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156128925761289261280f565b8085161561289f57918102915b93841c9390800290612858565b509250929050565b5f826128c25750600161044c565b816128ce57505f61044c565b81600181146128e457600281146128ee5761290a565b600191505061044c565b60ff8411156128ff576128ff61280f565b50506001821b61044c565b5060208310610133831016604e8410600b841016171561292d575081810a61044c565b6129378383612853565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156129695761296961280f565b029392505050565b5f61181283836128b456"; + hex"608060405234801561000f575f80fd5b5060043610610115575f3560e01c806359f89dda116100ad578063a086e1751161007d578063a4c9d30011610063578063a4c9d3001461030a578063d547741f14610312578063f2fde38b14610325575f80fd5b8063a086e175146102fb578063a217fddf14610303575f80fd5b806359f89dda14610281578063715018a6146102945780638da5cb5b1461029c57806391d14854146102a4575f80fd5b80633013ce29116100e85780633013ce29146101c8578063325cd7961461020c57806336568abe1461025b578063439fab911461026e575f80fd5b806301ffc9a71461011957806304a0db2014610141578063248a9ca3146101725780632f2ff15d146101b3575b5f80fd5b61012c610127366004611eec565b610338565b60405190151581526020015b60405180910390f35b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b3202545b604051908152602001610138565b610164610180366004611f2b565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b6101c66101c1366004611f56565b61042b565b005b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b3201546001600160a01b03165b6040516001600160a01b039091168152602001610138565b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b32015474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610138565b6101c6610269366004611f56565b610474565b61016461027c3660046120a7565b6104c5565b6101c661028f3660046120d9565b610a55565b6101c6610e31565b6101f4610e44565b61012c6102b2366004611f56565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6101f4610e78565b6101645f81565b6101c6610ea0565b6101c6610320366004611f56565b610f69565b6101c661033336600461212e565b610fac565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda0000000000000000000000000000000000000000000000000000000014806103ca57507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b8061041657507fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000145b80610425575061042582610fff565b92915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461046481611095565b61046e838361109f565b50505050565b6001600160a01b03811633146104b6576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104c08282611190565b505050565b5f806104cf611252565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156104fb5750825b90505f8267ffffffffffffffff1660011480156105175750303b155b905081158015610525575080155b1561055c576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156105bd5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f878060200190518101906105d29190612149565b80519091506001600160a01b0316610616576040517fa7d26c7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208101516001600160a01b031661065a576040517f364467d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408101516001600160a01b031661069e576040517f3731597600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608101516001600160a01b03166106e2576040517ff10d418200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80608001515f0361071f576040517f7e0eb2bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80517f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b320080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b039384161782556020808501517f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b32038054841691861691909117905560608501517f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b320180549093169416938417909155604080517f313ce567000000000000000000000000000000000000000000000000000000008152905192935f93909263313ce56792600480820193918290030181865afa158015610830573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085491906121ba565b6001830180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000060ff8416021790556080840151600284015560408401519091506108b59061127a565b7fbf322f47f534976d35baa3292f4fd04bf379264783a734383401b0e6e51cb16d835f0151846020015185604001518660600151858860800151604051610939969594939291906001600160a01b039687168152948616602086015292851660408501529316606083015260ff92909216608082015260a081019190915260c00190565b60405180910390a1610965604051806020016040528085604001516001600160a01b031681525061128b565b506109947f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc028460400151611190565b506109c37fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d38460400151611190565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc398505050508315610a4b5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b320080546001600160a01b0316338114610ac9578484846040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610ac0939291906121da565b60405180910390fd5b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8218403610e1f575f83806020019051810190610b059190612226565b60018481015460808301519293506001600160a01b038116927401000000000000000000000000000000000000000090910460ff16915f91610b48918490611626565b90505f836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bab91906121ba565b60ff169050828114610bf3576040517fe420d7af0000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610ac0565b5f866001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c549190612312565b90508760020154811115610ca45760028801546040517f86529caa000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610ac0565b825f03610d045785516040517f3ae4063b000000000000000000000000000000000000000000000000000000008152610ac091907f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821908c906004016121da565b8551610d1c906001600160a01b0387169030866116ad565b600388015486516040517fdb8554fc0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201524260248201525f92919091169063db8554fc90604401602060405180830381865afa158015610d8a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dae9190612312565b905060028114610e115786516040517f3ae4063b000000000000000000000000000000000000000000000000000000008152610ac091907f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821908d906004016121da565b505050505050505050505050565b610e2a8585856116fc565b5050505050565b610e39611a38565b610e425f611a83565b565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b5f807f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b3200610e68565b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b3200610f66610ecc610e44565b60018301546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610f2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f519190612312565b60018401546001600160a01b03169190611b0b565b50565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040902060010154610fa281611095565b61046e8383611190565b610fb4611a38565b6001600160a01b038116610ff6576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610ac0565b610f6681611a83565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061042557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610425565b610f668133611b59565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff16611180575f848152602082815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556111363390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610425565b5f915050610425565b5092915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602081815260408084206001600160a01b038616855290915282205460ff1615611180575f848152602082815260408083206001600160a01b038716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610425565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610425565b611282611be9565b610f6681611c27565b5f611294611c2f565b81516001600160a01b03166112d5576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61131f7f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d0533917f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b611c37565b6113497f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b80611c37565b6113937f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e37f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d611c37565b6113bd7f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d80611c37565b6114077f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed7fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c611c37565b6114317fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c80611c37565b61147b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8217f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02611c37565b6114a57f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc0280611c37565b6114ef7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828697fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3611c37565b6115197fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d380611c37565b6115467f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b835f015161109f565b506115747f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d835f015161109f565b506115a27fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c835f015161109f565b506115d07f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02835f015161109f565b506115fe7fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3835f015161109f565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc392915050565b5f826012111561165a5760128390036001831615611650576116488582611cd8565b9150506116a6565b6116488582611d24565b60128311156116a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee83016002831615611699576116488582611d4e565b6116488582611d9e565b50825b9392505050565b6116bb848484846001611dcd565b61046e576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610ac0565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a82148061174957507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4882145b156119b2575f805f7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a85036117a9575f8480602001905181019061178d919061233d565b9050805f015193508060200151925080606001519150506117d5565b5f848060200190518101906117be9190612432565b805160208201516080909201519095509093509150505b80156119aa576001600160a01b03831615801561182857506001600160a01b0382165f9081527f96f78a99f93d631b75bc050854c9b764642c10564e41ed27c197a36ddabb1df9602052604090205460ff165b8061187b57506001600160a01b03821615801561187b57506001600160a01b0383165f9081527f3907f76fa0fb1e5d0f263c5c4fe4316026052cf960c55a1c768106d8b9701c10602052604090205460ff165b1561188857505050505050565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a851480156118ed57506001600160a01b0386165f9081527f6ba48721fcbb2613af13d8285fe9ee4a081f7995464037bb5ea27397912881d2602052604090205460ff165b8061195857507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a488514801561195857506001600160a01b0386165f9081527f29e42896fa6edf5a5d7ff0bcd00acffbece6eb6cc7b44d0807bfd84929cc6e1b602052604090205460ff165b1561196557505050505050565b6040517ffe720f780000000000000000000000000000000000000000000000000000000081526001600160a01b03808516600483015283166024820152604401610ac0565b505050505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038716845290915290205460ff1615611a0057505050565b8282826040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610ac0939291906121da565b33611a41610e44565b6001600160a01b031614610e42576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610ac0565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611b188383836001611e53565b6104c0576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610ac0565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602090815260408083206001600160a01b038516845290915290205460ff16611be5576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260248101839052604401610ac0565b5050565b611bf1611ece565b610e42576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fb4611be9565b610e42611be9565b7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268005f611c90845f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f604e8210611cfa578215611cee576001611cf0565b5f5b60ff169050610425565b600a82900a808481611d0e57611d0e6124f4565b0491508082028414611189575060010192915050565b5f604e821015611d465781600a0a8381611d4057611d406124f4565b046116a6565b5f9392505050565b5f604e8210611d6d578215611d64575f19611d66565b5f5b9050610425565b50600a81900a8281029083818381611d8757611d876124f4565b0414611d94575f19611d96565b815b949350505050565b600a81900a611dad818461254e565b9050604e8210610425578215611d4657611dc882600a612645565b6116a6565b6040517f23b872dd000000000000000000000000000000000000000000000000000000005f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316611e42578383151615611e36573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000005f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316611ec2578383151615611eb6573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b5f611ed7611252565b5468010000000000000000900460ff16919050565b5f60208284031215611efc575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146116a6575f80fd5b5f60208284031215611f3b575f80fd5b5035919050565b6001600160a01b0381168114610f66575f80fd5b5f8060408385031215611f67575f80fd5b823591506020830135611f7981611f42565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160a0810167ffffffffffffffff81118282101715611fd457611fd4611f84565b60405290565b60405160c0810167ffffffffffffffff81118282101715611fd457611fd4611f84565b604051601f8201601f1916810167ffffffffffffffff8111828210171561202657612026611f84565b604052919050565b5f67ffffffffffffffff82111561204757612047611f84565b50601f01601f191660200190565b5f82601f830112612064575f80fd5b81356120776120728261202e565b611ffd565b81815284602083860101111561208b575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156120b7575f80fd5b813567ffffffffffffffff8111156120cd575f80fd5b611d9684828501612055565b5f805f606084860312156120eb575f80fd5b83356120f681611f42565b925060208401359150604084013567ffffffffffffffff811115612118575f80fd5b61212486828701612055565b9150509250925092565b5f6020828403121561213e575f80fd5b81356116a681611f42565b5f60a08284031215612159575f80fd5b612161611fb1565b825161216c81611f42565b8152602083015161217c81611f42565b6020820152604083015161218f81611f42565b604082015260608301516121a281611f42565b60608201526080928301519281019290925250919050565b5f602082840312156121ca575f80fd5b815160ff811681146116a6575f80fd5b6001600160a01b0384168152826020820152606060408201525f82518060608401528060208501608085015e5f608082850101526080601f19601f830116840101915050949350505050565b5f6020808385031215612237575f80fd5b825167ffffffffffffffff8082111561224e575f80fd5b9084019060c08287031215612261575f80fd5b612269611fda565b825161227481611f42565b81528284015161228381611f42565b80858301525060408301516040820152606083015160608201526080830151608082015260a0830151828111156122b8575f80fd5b80840193505086601f8401126122cc575f80fd5b825191506122dc6120728361202e565b82815287858486010111156122ef575f80fd5b828585018683015e5f8584830101528060a0830152508094505050505092915050565b5f60208284031215612322575f80fd5b5051919050565b80518015158114612338575f80fd5b919050565b5f6080828403121561234d575f80fd5b6040516080810181811067ffffffffffffffff8211171561237057612370611f84565b604052825161237e81611f42565b8152602083015161238e81611f42565b6020820152604083810151908201526123a960608401612329565b60608201529392505050565b5f82601f8301126123c4575f80fd5b8151602067ffffffffffffffff8211156123e0576123e0611f84565b8160051b6123ef828201611ffd565b9283528481018201928281019087851115612408575f80fd5b83870192505b848310156124275782518252918301919083019061240e565b979650505050505050565b5f60208284031215612442575f80fd5b815167ffffffffffffffff80821115612459575f80fd5b9083019060a0828603121561246c575f80fd5b612474611fb1565b825161247f81611f42565b8152602083015161248f81611f42565b60208201526040830151828111156124a5575f80fd5b6124b1878286016123b5565b6040830152506060830151828111156124c8575f80fd5b6124d4878286016123b5565b6060830152506124e660808401612329565b608082015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761042557610425612521565b600181815b8085111561259f57815f190482111561258557612585612521565b8085161561259257918102915b93841c939080029061256a565b509250929050565b5f826125b557506001610425565b816125c157505f610425565b81600181146125d757600281146125e1576125fd565b6001915050610425565b60ff8411156125f2576125f2612521565b50506001821b610425565b5060208310610133831016604e8410600b8410161715612620575081810a610425565b61262a8383612565565b805f190482111561263d5761263d612521565b029392505050565b5f6116a683836125a756"; diff --git a/src/generated/StoxReceipt.pointers.sol b/src/generated/StoxReceipt.pointers.sol index 9e9e0e46..ff38583a 100644 --- a/src/generated/StoxReceipt.pointers.sol +++ b/src/generated/StoxReceipt.pointers.sol @@ -10,16 +10,16 @@ pragma solidity ^0.8.25; // file needs the contract to exist so that it can be compiled. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x9a9a1e1f776f72c253aece25d01c4b2b16aaafe60d20ee81233c786c220a0301); +bytes32 constant BYTECODE_HASH = bytes32(0x06fffbad12ea80897d55aab5d4f1cd3f34f674237db44a148cc133334a0cca54); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x636178081C59A458B34C6226Dee79c7567a4f542); +address constant DEPLOYED_ADDRESS = address(0x2dF5cFE6d688EF9fF1B7c59A499D254b1527b286); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b613db3806100d65f395ff3fe608060405234801561000f575f80fd5b50600436106100fa575f3560e01c8063481c6a7511610093578063a22cb46511610063578063a22cb4651461023f578063c2530e3914610252578063e985e9c514610265578063f242432a146102cc575f80fd5b8063481c6a75146101bd5780634e1273f4146102045780636d5b3f781461022457806395d89b4114610237575f80fd5b80630e89341c116100ce5780630e89341c14610171578063177769cb146101845780632eb2c2d614610197578063439fab91146101aa575f80fd5b8062fdd58e146100fe57806301ffc9a714610124578063043fa9871461014757806306fdde031461015c575b5f80fd5b61011161010c366004612f42565b6102df565b6040519081526020015b60405180910390f35b610137610132366004612f99565b6102fb565b604051901515815260200161011b565b61015a6101553660046130c7565b6103dd565b005b6101646104a7565b60405161011b9190613195565b61016461017f3660046131a7565b61050c565b61015a6101923660046131be565b6105db565b61015a6101a536600461328c565b6105ea565b6101116101b8366004613333565b610609565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161011b565b61021761021236600461336d565b610821565b60405161011b9190613459565b61015a61023236600461346b565b610938565b610164610a0b565b61015a61024d3660046134cf565b610a5c565b61015a61026036600461346b565b610a67565b61013761027336600461350a565b73ffffffffffffffffffffffffffffffffffffffff9182165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45016020908152604080832093909416825291909152205460ff1690565b61015a6102da36600461346b565b610ae5565b5f6102f283836102ed610afb565b610b6e565b90505b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061038d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806102f557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102f5565b6103e5610bcf565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055856104528686868686610c43565b61049e7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b50505050505050565b60606104b1610d14565b6040518060400160405280600881526020017f20526563656970740000000000000000000000000000000000000000000000008152506040516020016104f892919061354d565b604051602081830303815290604052905090565b60605f61052261051a610ded565b60ff16610e9f565b61052a610d14565b610532610f5b565b61053a6104a7565b60405160200161054d9493929190613561565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152601d82527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000602083015291506105b382611055565b6040516020016105c492919061354d565b604051602081830303815290604052915050919050565b6105e6338383611061565b5050565b6105f5335b866110a9565b610602858585858561118d565b5050505050565b5f8061061361123a565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f8115801561063f5750825b90505f8267ffffffffffffffff16600114801561065b5750303b155b905081158015610669575080155b156106a0576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156107015784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61071860405180602001604052805f815250611262565b5f7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20090505f8880602001905181019061075191906136a3565b82547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9190911617909155507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3955083156108175784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b6060815183511461087057815183516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b5f610879610afb565b90505f845167ffffffffffffffff81111561089657610896612fb4565b6040519080825280602002602001820160405280156108bf578160200160208202803683370190505b5090505f5b855181101561092f5761090a8682815181106108e2576108e26136be565b60200260200101518683815181106108fc576108fc6136be565b602002602001015185610b6e565b82828151811061091c5761091c6136be565b60209081029190910101526001016108c4565b50949350505050565b610940610bcf565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716179055846109ab868584611061565b6109b785858585611273565b610a037fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b505050505050565b6060610a15610d14565b6040518060400160405280600581526020017f20524350540000000000000000000000000000000000000000000000000000008152506040516020016104f892919061354d565b6105e63383836112f5565b610a6f610bcf565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871617905584610ada868584611061565b6109b785858561144e565b610aee336105ef565b6106028585858585610c43565b5f3073ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6991906136a3565b905090565b5f80610b7a85856114dc565b90505f610b856114f1565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260209182526040808220888352909252908120549150610bc183838761158e565b5093505050505b9392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200805473ffffffffffffffffffffffffffffffffffffffff163314610c40576040517fc0b2335a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8416610c92576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f6004820152602401610867565b73ffffffffffffffffffffffffffffffffffffffff8516610ce1576040517f01a835140000000000000000000000000000000000000000000000000000000081525f6004820152602401610867565b6040805160018082526020820186905281830190815260608201859052608082019092529061049e87878484875f6118c6565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f95d89b4100000000000000000000000000000000000000000000000000000000815290516060939273ffffffffffffffffffffffffffffffffffffffff16916395d89b41916004808301925f9291908290030181865afa158015610da2573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610de79190810190613721565b91505090565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f313ce56700000000000000000000000000000000000000000000000000000000815290515f939273ffffffffffffffffffffffffffffffffffffffff169163313ce5679160048083019260209291908290030181865afa158015610e7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610de79190613766565b60605f610eab8361192b565b60010190505f8167ffffffffffffffff811115610eca57610eca612fb4565b6040519080825280601f01601f191660200182016040528015610ef4576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084610efe57509392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f38d52e0f00000000000000000000000000000000000000000000000000000000815290516060939273ffffffffffffffffffffffffffffffffffffffff16916338d52e0f9160048083019260209291908290030181865afa158015610fea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061100e91906136a3565b73ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610da2573d5f803e3d5ffd5b60606102f5825f611a0c565b8051156110a4577fd66d6a9810a5cef78b704e7e04334961e997c81d337f029f74637f060f3d8d6583838360405161109b939291906137b3565b60405180910390a15b505050565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015611136575073ffffffffffffffffffffffffffffffffffffffff8082165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4501602090815260408083209386168352929052205460ff16155b156105e6576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808416600483015282166024820152604401610867565b73ffffffffffffffffffffffffffffffffffffffff84166111dc576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f6004820152602401610867565b73ffffffffffffffffffffffffffffffffffffffff851661122b576040517f01a835140000000000000000000000000000000000000000000000000000000081525f6004820152602401610867565b610602858585858560016118c6565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102f5565b61126a611b8b565b610c4081611bcb565b73ffffffffffffffffffffffffffffffffffffffff84166112c2576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f6004820152602401610867565b60408051600180825260208201869052818301908152606082018590526080820190925290610a035f87848487846118c6565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c450073ffffffffffffffffffffffffffffffffffffffff8416611365576040517f3e31884e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610867565b73ffffffffffffffffffffffffffffffffffffffff83166113b4576040517fced3e1000000000000000000000000000000000000000000000000000000000081525f6004820152602401610867565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260018401602090815260408083209488168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661149d576040517f01a835140000000000000000000000000000000000000000000000000000000081525f6004820152602401610867565b604080516001808252602082018590528183019081526060820184905260a082019092525f6080820181815291929161060291879185908590836118c6565b5f806114e88484611bdc565b54949350505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0061153f60017fedb99b3af8e1c50d494d6f1b4c75245a0b733cb90baa42bfe0e2f5bc8b000f8261381d565b60405160200161155191815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101201692915050565b6040517f79ba43050000000000000000000000000000000000000000000000000000000081525f90819084908290819073ffffffffffffffffffffffffffffffffffffffff8716906379ba4305906115f0908690600390600190600401613830565b606060405180830381865afa15801561160b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162f9190613881565b5091509150875f03611718575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821461170a576040517f79ba4305000000000000000000000000000000000000000000000000000000008152919250829173ffffffffffffffffffffffffffffffffffffffff8716906379ba4305906116c0908590600390600190600401613830565b606060405180830381865afa1580156116db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ff9190613881565b50909250905061163c565b5f83945094505050506118be565b875b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83146118b65782935060028203611814576040517fb21a2494000000000000000000000000000000000000000000000000000000008152600481018490525f906118049073ffffffffffffffffffffffffffffffffffffffff8a169063b21a2494906024015f60405180830381865afa1580156117ba573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526117ff9190810190613721565b611c8c565b90506118108282611ca1565b9150505b6040517f79ba430500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816906379ba43059061186c908690600390600190600401613830565b606060405180830381865afa158015611887573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ab9190613881565b50909350915061171a565b945091925050505b935093915050565b6118d286868686611d1c565b73ffffffffffffffffffffffffffffffffffffffff851615610a035733811561190857611903818888888888611d81565b61049e565b60208581015190850151611920838a8a85858a611f70565b505050505050505050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611973577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831061199f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106119bd57662386f26fc10000830492506010015b6305f5e10083106119d5576305f5e100830492506008015b61271083106119e957612710830492506004015b606483106119fb576064830492506002015b600a83106102f55760010192915050565b606082515f03611a2a575060408051602081019091525f81526102f5565b5f82611a5a57600384516002611a4091906138c3565b611a4a91906138d6565b611a5590600461390e565b611a7f565b600384516004611a6a919061390e565b611a759060026138c3565b611a7f91906138d6565b905060405191507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f5261067083027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f18603f526020820181810185865187016020810180515f82525b82841015611b3d576003840193508351603f8160121c16518753600187019650603f81600c1c16518753600187019650603f8160061c16518753600187019650603f811651875350600186019550611aea565b905250859050611b7e57600386510660018114611b615760028114611b7457611b7c565b603d6001840353603d6002840353611b7c565b603d60018403535b505b9183525060405292915050565b611b936120ff565b611bc9576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611bd3611b8b565b610c408161211d565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00611c2a60017f3a8e79826d53842322cdcc810d4a989eb01ac46cfabfd48dcc021625ce13c2d761381d565b604051602001611c3c91815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301205f9687529290921681528185209585529490945250502090565b5f818060200190518101906102f59190613925565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611cff576040517fbf463fe900000000000000000000000000000000000000000000000000000000815260048101849052602401610867565b5f61092f611d16611d10865f612169565b856121c3565b5f612225565b5f611d25610afb565b90505f5b8351811015611d7457611d5686858381518110611d4857611d486136be565b602002602001015184612267565b611d6c85858381518110611d4857611d486136be565b600101611d29565b506106028585858561239d565b73ffffffffffffffffffffffffffffffffffffffff84163b15610a03576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c8190611df8908990899088908890889060040161393c565b6020604051808303815f875af1925050508015611e50575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611e4d918101906139a6565b60015b611edd573d808015611e7d576040519150601f19603f3d011682016040523d82523d5f602084013e611e82565b606091505b5080515f03611ed5576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602401610867565b805160208201fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c81000000000000000000000000000000000000000000000000000000001461049e576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602401610867565b73ffffffffffffffffffffffffffffffffffffffff84163b15610a03576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e6190611fe790899089908890889088906004016139c1565b6020604051808303815f875af192505050801561203f575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261203c918101906139a6565b60015b61206c573d808015611e7d576040519150601f19603f3d011682016040523d82523d5f602084013e611e82565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461049e576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602401610867565b5f61210861123a565b5468010000000000000000900460ff16919050565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45007f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45026110a48382613aa5565b5f805f612176858561245d565b91509150806121bb576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610867565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061220886868686612563565b915091505f6122178383612682565b9a9950505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6122598282876126e0565b9350935050505b9250929050565b73ffffffffffffffffffffffffffffffffffffffff831661228757505050565b5f6122906114f1565b73ffffffffffffffffffffffffffffffffffffffff85165f908152602082815260408083208784529091528120549192506122cb86866114dc565b90505f806122da83858861158e565b915091508381036122ef575050505050505050565b73ffffffffffffffffffffffffffffffffffffffff88165f908152602086815260408083208a84529091529020819055818314612331576123318888846128e7565b604080518581526020810183905290810184905260608101839052879073ffffffffffffffffffffffffffffffffffffffff8a16907f956b049289f8dbe8716375414d9fa6bf32cde65ec1b7e102623775cacc66a6999060800160405180910390a35050505050505050565b5f6123a66128fb565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200546040517fe5be7d9000000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063e5be7d90906124249084908990899089908990600401613bbd565b5f604051808303815f87803b15801561243b575f80fd5b505af115801561244d573d5f803e3d5ffd5b5050505061060285858585612994565b5f601b83900b83148383826124c1577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156124a157620186a0860595506005850194505b8586601b0b146124bc57600a860595508460010194506124a1565b6124d7565b855f036124d757505f9250600191506122609050565b848560030b14612533575f8512156124f757505f92508291506122609050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610867565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f808515841517801561257b575f92505f9150612678565b6125858487613c0f565b91505f61259188612c94565b90505f61259d87612c94565b90505f6125aa8383612cf5565b5090505f6f0785ee10d5da46d900f436a0000000008211156125df576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561260057670de0b6b3a7640000820491506012015b633b9aca0082111561261957633b9aca00820491506009015b61271082111561262e57612710820491506004015b811561264257600a8204915060010161262e565b61264c8187613c0f565b955061266e8b8a612668878761266387600a613d54565b612d30565b89612e15565b9097509550505050505b5094509492505050565b5f805f61268f858561245d565b915091508015801561269f575081155b156121bb576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610867565b5f805f851215612726576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610867565b845f0361273857505f905060016118be565b8460ff8416850185811215612783576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610867565b5f805f8312156127ed577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156127c4575f8095509550505050506118be565b825f03600a0a91508184816127db576127db613786565b04955050840290911491506118be9050565b5f8313156128d757604d831315612843576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610867565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161287857612878613786565b048411156128c5576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610867565b50919091029250600191506118be9050565b83600195509550505050506118be565b5f6128f28484611bdc565b91909155505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201545f907fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2009073ffffffffffffffffffffffffffffffffffffffff168061296457339250505090565b600190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055919050565b805182517f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c450091146129fe57825182516040517f5b05999100000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610867565b335f5b8451811015612b675760208181028681018201519086019091015173ffffffffffffffffffffffffffffffffffffffff891615612aff575f8281526020868152604080832073ffffffffffffffffffffffffffffffffffffffff8d16845290915290205481811015612acc576040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b166004820152602481018290526044810183905260648101849052608401610867565b5f8381526020878152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290209082900390555b73ffffffffffffffffffffffffffffffffffffffff881615612b5d575f8281526020868152604080832073ffffffffffffffffffffffffffffffffffffffff8c16845290915281208054839290612b579084906138c3565b90915550505b5050600101612a01565b508351600103612c0e5760208401515f9060208501519091508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051612bff929190918252602082015260400190565b60405180910390a45050610a03565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612c84929190613d5f565b60405180910390a4505050505050565b5f80821215612cf1577f80000000000000000000000000000000000000000000000000000000000000008203612ceb57507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f612d3d8686612cf5565b91509150815f03612d6157838181612d5757612d57613786565b0492505050610bc8565b838210612dab576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610867565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215612edf577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115612ecc57612e747f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60016138c3565b8403612ea457507f8000000000000000000000000000000000000000000000000000000000000000905081612f18565b612eaf600a856138d6565b612eb890613d83565b612ec3846001613c0f565b91509150612f18565b612ed584613d83565b8391509150612f18565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115612f1257612eb8600a856138d6565b50829050815b94509492505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610c40575f80fd5b5f8060408385031215612f53575f80fd5b8235612f5e81612f21565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610c40575f80fd5b5f60208284031215612fa9575f80fd5b8135610bc881612f6c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561302857613028612fb4565b604052919050565b5f67ffffffffffffffff82111561304957613049612fb4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613084575f80fd5b813561309761309282613030565b612fe1565b8181528460208386010111156130ab575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c087890312156130dc575f80fd5b86356130e781612f21565b955060208701356130f781612f21565b9450604087013561310781612f21565b9350606087013592506080870135915060a087013567ffffffffffffffff811115613130575f80fd5b61313c89828a01613075565b9150509295509295509295565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6102f26020830184613149565b5f602082840312156131b7575f80fd5b5035919050565b5f80604083850312156131cf575f80fd5b82359150602083013567ffffffffffffffff8111156131ec575f80fd5b6131f885828601613075565b9150509250929050565b5f67ffffffffffffffff82111561321b5761321b612fb4565b5060051b60200190565b5f82601f830112613234575f80fd5b8135602061324461309283613202565b8083825260208201915060208460051b870101935086841115613265575f80fd5b602086015b84811015613281578035835291830191830161326a565b509695505050505050565b5f805f805f60a086880312156132a0575f80fd5b85356132ab81612f21565b945060208601356132bb81612f21565b9350604086013567ffffffffffffffff808211156132d7575f80fd5b6132e389838a01613225565b945060608801359150808211156132f8575f80fd5b61330489838a01613225565b93506080880135915080821115613319575f80fd5b5061332688828901613075565b9150509295509295909350565b5f60208284031215613343575f80fd5b813567ffffffffffffffff811115613359575f80fd5b61336584828501613075565b949350505050565b5f806040838503121561337e575f80fd5b823567ffffffffffffffff80821115613395575f80fd5b818501915085601f8301126133a8575f80fd5b813560206133b861309283613202565b82815260059290921b840181019181810190898411156133d6575f80fd5b948201945b838610156133fd5785356133ee81612f21565b825294820194908201906133db565b96505086013592505080821115613412575f80fd5b506131f885828601613225565b5f815180845260208085019450602084015f5b8381101561344e57815187529582019590820190600101613432565b509495945050505050565b602081525f6102f2602083018461341f565b5f805f805f60a0868803121561347f575f80fd5b853561348a81612f21565b9450602086013561349a81612f21565b93506040860135925060608601359150608086013567ffffffffffffffff8111156134c3575f80fd5b61332688828901613075565b5f80604083850312156134e0575f80fd5b82356134eb81612f21565b9150602083013580151581146134ff575f80fd5b809150509250929050565b5f806040838503121561351b575f80fd5b823561352681612f21565b915060208301356134ff81612f21565b5f81518060208401855e5f93019283525090919050565b5f61336561355b8386613536565b84613536565b7f7b22646563696d616c73223a000000000000000000000000000000000000000081525f613592600c830187613536565b7f2c226465736372697074696f6e223a2231206f6620746865736520726563656981527f7074732063616e206265206275726e656420616c6f6e6773696465203120000060208201526135e8603e820187613536565b90507f20746f2072656465656d20000000000000000000000000000000000000000000815261361a600b820186613536565b90507f2066726f6d20746865207661756c742e222c000000000000000000000000000081527f226e616d65223a220000000000000000000000000000000000000000000000006012820152613672601a820185613536565b7f227d0000000000000000000000000000000000000000000000000000000000008152600201979650505050505050565b5f602082840312156136b3575f80fd5b8151610bc881612f21565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6136f861309284613030565b905082815283838301111561370b575f80fd5b8282602083015e5f602084830101529392505050565b5f60208284031215613731575f80fd5b815167ffffffffffffffff811115613747575f80fd5b8201601f81018413613757575f80fd5b613365848251602084016136eb565b5f60208284031215613776575f80fd5b815160ff81168114610bc8575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6137e76060830184613149565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156102f5576102f56137f0565b838152602081018390526060810160038310613873577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b826040830152949350505050565b5f805f60608486031215613893575f80fd5b8351925060208401519150604084015167ffffffffffffffff811681146138b8575f80fd5b809150509250925092565b808201808211156102f5576102f56137f0565b5f82613909577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176102f5576102f56137f0565b5f60208284031215613935575f80fd5b5051919050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a0604083015261397460a083018661341f565b8281036060840152613986818661341f565b9050828103608084015261399a8185613149565b98975050505050505050565b5f602082840312156139b6575f80fd5b8151610bc881612f6c565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a06080830152613a0560a0830184613149565b979650505050505050565b600181811c90821680613a2457607f821691505b602082108103613a5b577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f8211156110a457805f5260205f20601f840160051c81016020851015613a865750805b601f840160051c820191505b81811015610602575f8155600101613a92565b815167ffffffffffffffff811115613abf57613abf612fb4565b613ad381613acd8454613a10565b84613a61565b602080601f831160018114613b25575f8415613aef5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610a03565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b7157888601518255948401946001909101908401613b52565b5085821015613bad57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f73ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015280861660408401525060a06060830152613bfd60a083018561341f565b828103608084015261399a818561341f565b8082018281125f831280158216821582161715613c2e57613c2e6137f0565b505092915050565b600181815b80851115613c8f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613c7557613c756137f0565b80851615613c8257918102915b93841c9390800290613c3b565b509250929050565b5f82613ca5575060016102f5565b81613cb157505f6102f5565b8160018114613cc75760028114613cd157613ced565b60019150506102f5565b60ff841115613ce257613ce26137f0565b50506001821b6102f5565b5060208310610133831016604e8410600b8410161715613d10575081810a6102f5565b613d1a8383613c36565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613d4c57613d4c6137f0565b029392505050565b5f6102f28383613c97565b604081525f613d71604083018561341f565b82810360208401526137e7818561341f565b5f7f80000000000000000000000000000000000000000000000000000000000000008203612ceb57612ceb6137f056"; + hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6136e3806100d65f395ff3fe608060405234801561000f575f80fd5b50600436106100fa575f3560e01c8063481c6a7511610093578063a22cb46511610063578063a22cb46514610232578063c2530e3914610245578063e985e9c514610258578063f242432a146102b2575f80fd5b8063481c6a75146101bd5780634e1273f4146101f75780636d5b3f781461021757806395d89b411461022a575f80fd5b80630e89341c116100ce5780630e89341c14610171578063177769cb146101845780632eb2c2d614610197578063439fab91146101aa575f80fd5b8062fdd58e146100fe57806301ffc9a714610124578063043fa9871461014757806306fdde031461015c575b5f80fd5b61011161010c366004612a49565b6102c5565b6040519081526020015b60405180910390f35b610137610132366004612aa0565b6102e1565b604051901515815260200161011b565b61015a610155366004612b79565b6103c3565b005b61016461046a565b60405161011b9190612c29565b61016461017f366004612c3b565b6104cf565b61015a610192366004612c52565b610580565b61015a6101a5366004612d20565b61058f565b6101116101b8366004612dc7565b6105ae565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200546040516001600160a01b03909116815260200161011b565b61020a610205366004612e01565b6107ae565b60405161011b9190612eed565b61015a610225366004612eff565b6108c5565b610164610975565b61015a610240366004612f63565b6109c6565b61015a610253366004612eff565b6109d1565b610137610266366004612f9e565b6001600160a01b039182165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45016020908152604080832093909416825291909152205460ff1690565b61015a6102c0366004612eff565b610a37565b5f6102d883836102d3610a4d565b610ab3565b90505b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061037357507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806102db57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102db565b6103cb610b07565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038816179055856104208686868686610b6e565b6104617fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19169055565b50505050505050565b6060610474610c25565b6040518060400160405280600881526020017f20526563656970740000000000000000000000000000000000000000000000008152506040516020016104bb929190612fe1565b604051602081830303815290604052905090565b60605f6104e56104dd610cd3565b60ff16610d78565b6104ed610c25565b6104f5610e15565b6104fd61046a565b6040516020016105109493929190612ff5565b60408051601f19818403018152828201909152601d82527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020830152915061055882610ef5565b604051602001610569929190612fe1565b604051602081830303815290604052915050919050565b61058b338383610f01565b5050565b61059a335b86610f49565b6105a78585858585610ff9565b5050505050565b5f806105b861108c565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156105e45750825b90505f8267ffffffffffffffff1660011480156106005750303b155b90508115801561060e575080155b15610645576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156106a65784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6106bd60405180602001604052805f8152506110b4565b5f7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20090505f888060200190518101906106f69190613137565b825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039190911617909155507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3955083156107a45784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b606081518351146107fd57815183516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b5f610806610a4d565b90505f845167ffffffffffffffff81111561082357610823612abb565b60405190808252806020026020018201604052801561084c578160200160208202803683370190505b5090505f5b85518110156108bc5761089786828151811061086f5761086f613152565b602002602001015186838151811061088957610889613152565b602002602001015185610ab3565b8282815181106108a9576108a9613152565b6020908102919091010152600101610851565b50949350505050565b6108cd610b07565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03871617905584610920868584610f01565b61092c858585856110c5565b61096d7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19169055565b505050505050565b606061097f610c25565b6040518060400160405280600581526020017f20524350540000000000000000000000000000000000000000000000000000008152506040516020016104bb929190612fe1565b61058b33838361113a565b6109d9610b07565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03871617905584610a2c868584610f01565b61092c85858561124e565b610a4033610594565b6105a78585858585610b6e565b5f306001600160a01b031663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a8a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aae9190613137565b905090565b5f80610abf85856112cf565b90505f610aca6112e4565b6001600160a01b0387165f90815260209182526040808220888352909252908120549150610af9838387611345565b5093505050505b9392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20080546001600160a01b03163314610b6b576040517fc0b2335a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6001600160a01b038416610bb0576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016107f4565b6001600160a01b038516610bf2576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016107f4565b6040805160018082526020820186905281830190815260608201859052608082019092529061046187878484875f6115ed565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f95d89b410000000000000000000000000000000000000000000000000000000081529051606093926001600160a01b0316916395d89b41916004808301925f9291908290030181865afa158015610ca6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ccd919081019061319c565b91505090565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f313ce56700000000000000000000000000000000000000000000000000000000815290515f93926001600160a01b03169163313ce5679160048083019260209291908290030181865afa158015610d54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ccd91906131e1565b60605f610d8483611645565b60010190505f8167ffffffffffffffff811115610da357610da3612abb565b6040519080825280601f01601f191660200182016040528015610dcd576020820181803683370190505b5090508181016020015b5f19017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084610dd757509392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f38d52e0f0000000000000000000000000000000000000000000000000000000081529051606093926001600160a01b0316916338d52e0f9160048083019260209291908290030181865afa158015610e97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebb9190613137565b6001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610ca6573d5f803e3d5ffd5b60606102db825f611726565b805115610f44577fd66d6a9810a5cef78b704e7e04334961e997c81d337f029f74637f060f3d8d65838383604051610f3b93929190613215565b60405180910390a15b505050565b816001600160a01b0316816001600160a01b031614158015610faf57506001600160a01b038082165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4501602090815260408083209386168352929052205460ff16155b1561058b576040517fe237d9220000000000000000000000000000000000000000000000000000000081526001600160a01b038084166004830152821660248201526044016107f4565b6001600160a01b03841661103b576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016107f4565b6001600160a01b03851661107d576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016107f4565b6105a7858585858560016115ed565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102db565b6110bc6118a5565b610b6b816118e5565b6001600160a01b038416611107576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016107f4565b6040805160018082526020820186905281830190815260608201859052608082019092529061096d5f87848487846115ed565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45006001600160a01b03841661119d576040517f3e31884e0000000000000000000000000000000000000000000000000000000081525f60048201526024016107f4565b6001600160a01b0383166111df576040517fced3e1000000000000000000000000000000000000000000000000000000000081525f60048201526024016107f4565b6001600160a01b038481165f818152600184016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b6001600160a01b038316611290576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016107f4565b604080516001808252602082018590528183019081526060820184905260a082019092525f608082018181529192916105a791879185908590836115ed565b5f806112db84846118f6565b54949350505050565b5f8060ff1961131460017fedb99b3af8e1c50d494d6f1b4c75245a0b733cb90baa42bfe0e2f5bc8b000f82613259565b60405160200161132691815260200190565b60408051601f1981840301815291905280516020909101201692915050565b6040517f79ba43050000000000000000000000000000000000000000000000000000000081525f9081908490829081906001600160a01b038716906379ba43059061139a90869060039060019060040161326c565b606060405180830381865afa1580156113b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d991906132a4565b5091509150875f03611496575b5f198214611488576040517f79ba430500000000000000000000000000000000000000000000000000000000815291925082916001600160a01b038716906379ba43059061143e90859060039060019060040161326c565b606060405180830381865afa158015611459573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147d91906132a4565b5090925090506113e6565b5f83945094505050506115e5565b875b5f1983146115dd5782935060028203611548576040517fb21a2494000000000000000000000000000000000000000000000000000000008152600481018490525f90611538906001600160a01b038a169063b21a2494906024015f60405180830381865afa15801561150c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611533919081019061319c565b61196a565b9050611544828261197f565b9150505b6040517f79ba43050000000000000000000000000000000000000000000000000000000081526001600160a01b038816906379ba43059061159390869060039060019060040161326c565b606060405180830381865afa1580156115ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d291906132a4565b509093509150611498565b945091925050505b935093915050565b6115f9868686866119fa565b6001600160a01b0385161561096d573381156116225761161d818888888888611a5f565b610461565b6020858101519085015161163a838a8a85858a611bfc565b505050505050505050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061168d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106116b9576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106116d757662386f26fc10000830492506010015b6305f5e10083106116ef576305f5e100830492506008015b612710831061170357612710830492506004015b60648310611715576064830492506002015b600a83106102db5760010192915050565b606082515f03611744575060408051602081019091525f81526102db565b5f826117745760038451600261175a91906132e6565b61176491906132f9565b61176f906004613318565b611799565b6003845160046117849190613318565b61178f9060026132e6565b61179991906132f9565b905060405191507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f5261067083027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f18603f526020820181810185865187016020810180515f82525b82841015611857576003840193508351603f8160121c16518753600187019650603f81600c1c16518753600187019650603f8160061c16518753600187019650603f811651875350600186019550611804565b9052508590506118985760038651066001811461187b576002811461188e57611896565b603d6001840353603d6002840353611896565b603d60018403535b505b9183525060405292915050565b6118ad611d46565b6118e3576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6118ed6118a5565b610b6b81611d64565b5f8060ff1961192660017f3a8e79826d53842322cdcc810d4a989eb01ac46cfabfd48dcc021625ce13c2d7613259565b60405160200161193891815260200190565b60408051808303601f1901815291815281516020928301205f9687529290921681528185209585529490945250502090565b5f818060200190518101906102db919061332f565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156119dd576040517fbf463fe9000000000000000000000000000000000000000000000000000000008152600481018490526024016107f4565b5f6108bc6119f46119ee865f611db0565b85611e0a565b5f611e6c565b5f611a03610a4d565b90505f5b8351811015611a5257611a3486858381518110611a2657611a26613152565b602002602001015184611eae565b611a4a85858381518110611a2657611a26613152565b600101611a07565b506105a785858585611fb0565b6001600160a01b0384163b1561096d576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c8190611abc9089908990889088908890600401613346565b6020604051808303815f875af1925050508015611af6575060408051601f3d908101601f19168201909252611af3918101906133a3565b60015b611b76573d808015611b23576040519150601f19603f3d011682016040523d82523d5f602084013e611b28565b606091505b5080515f03611b6e576040517f57f447ce0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024016107f4565b805160208201fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014610461576040517f57f447ce0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024016107f4565b6001600160a01b0384163b1561096d576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e6190611c5990899089908890889088906004016133be565b6020604051808303815f875af1925050508015611c93575060408051601f3d908101601f19168201909252611c90918101906133a3565b60015b611cc0573d808015611b23576040519150601f19603f3d011682016040523d82523d5f602084013e611b28565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610461576040517f57f447ce0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024016107f4565b5f611d4f61108c565b5468010000000000000000900460ff16919050565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45007f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4502610f44838261347c565b5f805f611dbd8585612063565b9150915080611e02576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016107f4565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480611e4f86868686612169565b915091505f611e5e8383612288565b9a9950505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d611ea08282876122e6565b9350935050505b9250929050565b6001600160a01b038316611ec157505050565b5f611eca6112e4565b6001600160a01b0385165f90815260208281526040808320878452909152812054919250611ef886866112cf565b90505f80611f07838588611345565b91509150838103611f1c575050505050505050565b6001600160a01b0388165f908152602086815260408083208a84529091529020819055818314611f5157611f518888846124ce565b60408051858152602081018390529081018490526060810183905287906001600160a01b038a16907f956b049289f8dbe8716375414d9fa6bf32cde65ec1b7e102623775cacc66a6999060800160405180910390a35050505050505050565b5f611fb96124e2565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200546040517fe5be7d900000000000000000000000000000000000000000000000000000000081529192506001600160a01b03169063e5be7d909061202a9084908990899089908990600401613538565b5f604051808303815f87803b158015612041575f80fd5b505af1158015612053573d5f803e3d5ffd5b505050506105a785858585612563565b5f601b83900b83148383826120c7577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156120a757620186a0860595506005850194505b8586601b0b146120c257600a860595508460010194506120a7565b6120dd565b855f036120dd57505f925060019150611ea79050565b848560030b14612139575f8512156120fd57505f9250829150611ea79050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016107f4565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f8085158415178015612181575f92505f915061227e565b61218b848761357d565b91505f612197886127c7565b90505f6121a3876127c7565b90505f6121b08383612828565b5090505f6f0785ee10d5da46d900f436a0000000008211156121e5576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561220657670de0b6b3a7640000820491506012015b633b9aca0082111561221f57633b9aca00820491506009015b61271082111561223457612710820491506004015b811561224857600a82049150600101612234565b612252818761357d565b95506122748b8a61226e878761226987600a613684565b612844565b89612929565b9097509550505050505b5094509492505050565b5f805f6122958585612063565b91509150801580156122a5575081155b15611e02576040517f8eba4d0700000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016107f4565b5f805f85121561232c576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016107f4565b845f0361233e57505f905060016115e5565b8460ff8416850185811215612389576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016107f4565b5f805f8312156123f3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156123ca575f8095509550505050506115e5565b825f03600a0a91508184816123e1576123e1613201565b04955050840290911491506115e59050565b5f8313156124be57604d831315612449576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016107f4565b82600a0a9150815f198161245f5761245f613201565b048411156124ac576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016107f4565b50919091029250600191506115e59050565b83600195509550505050506115e5565b5f6124d984846118f6565b91909155505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201545f907fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200906001600160a01b03168061253e57339250505090565b6001909101805473ffffffffffffffffffffffffffffffffffffffff19169055919050565b805182517f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c450091146125cd57825182516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016107f4565b335f5b84518110156126e8576020818102868101820151908601909101516001600160a01b0389161561269a575f828152602086815260408083206001600160a01b038d16845290915290205481811015612674576040517f03dee4c50000000000000000000000000000000000000000000000000000000081526001600160a01b038b1660048201526024810182905260448101839052606481018490526084016107f4565b5f838152602087815260408083206001600160a01b038e16845290915290209082900390555b6001600160a01b038816156126de575f828152602086815260408083206001600160a01b038c168452909152812080548392906126d89084906132e6565b90915550505b50506001016125d0565b5083516001036127685760208401515f906020850151909150866001600160a01b0316886001600160a01b0316846001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051612759929190918252602082015260400190565b60405180910390a4505061096d565b846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516127b792919061368f565b60405180910390a4505050505050565b5f80821215612824577f8000000000000000000000000000000000000000000000000000000000000000820361281e57507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f1983850993909202808410938190039390930393915050565b5f805f6128518686612828565b91509150815f036128755783818161286b5761286b613201565b0492505050610b00565b8382106128bf576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016107f4565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f85871812156129f3577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8411156129e0576129887f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60016132e6565b84036129b857507f8000000000000000000000000000000000000000000000000000000000000000905081612a2c565b6129c3600a856132f9565b6129cc906136b3565b6129d784600161357d565b91509150612a2c565b6129e9846136b3565b8391509150612a2c565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115612a26576129cc600a856132f9565b50829050815b94509492505050565b6001600160a01b0381168114610b6b575f80fd5b5f8060408385031215612a5a575f80fd5b8235612a6581612a35565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610b6b575f80fd5b5f60208284031215612ab0575f80fd5b8135610b0081612a73565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612af857612af8612abb565b604052919050565b5f67ffffffffffffffff821115612b1957612b19612abb565b50601f01601f191660200190565b5f82601f830112612b36575f80fd5b8135612b49612b4482612b00565b612acf565b818152846020838601011115612b5d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215612b8e575f80fd5b8635612b9981612a35565b95506020870135612ba981612a35565b94506040870135612bb981612a35565b9350606087013592506080870135915060a087013567ffffffffffffffff811115612be2575f80fd5b612bee89828a01612b27565b9150509295509295509295565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6102d86020830184612bfb565b5f60208284031215612c4b575f80fd5b5035919050565b5f8060408385031215612c63575f80fd5b82359150602083013567ffffffffffffffff811115612c80575f80fd5b612c8c85828601612b27565b9150509250929050565b5f67ffffffffffffffff821115612caf57612caf612abb565b5060051b60200190565b5f82601f830112612cc8575f80fd5b81356020612cd8612b4483612c96565b8083825260208201915060208460051b870101935086841115612cf9575f80fd5b602086015b84811015612d155780358352918301918301612cfe565b509695505050505050565b5f805f805f60a08688031215612d34575f80fd5b8535612d3f81612a35565b94506020860135612d4f81612a35565b9350604086013567ffffffffffffffff80821115612d6b575f80fd5b612d7789838a01612cb9565b94506060880135915080821115612d8c575f80fd5b612d9889838a01612cb9565b93506080880135915080821115612dad575f80fd5b50612dba88828901612b27565b9150509295509295909350565b5f60208284031215612dd7575f80fd5b813567ffffffffffffffff811115612ded575f80fd5b612df984828501612b27565b949350505050565b5f8060408385031215612e12575f80fd5b823567ffffffffffffffff80821115612e29575f80fd5b818501915085601f830112612e3c575f80fd5b81356020612e4c612b4483612c96565b82815260059290921b84018101918181019089841115612e6a575f80fd5b948201945b83861015612e91578535612e8281612a35565b82529482019490820190612e6f565b96505086013592505080821115612ea6575f80fd5b50612c8c85828601612cb9565b5f815180845260208085019450602084015f5b83811015612ee257815187529582019590820190600101612ec6565b509495945050505050565b602081525f6102d86020830184612eb3565b5f805f805f60a08688031215612f13575f80fd5b8535612f1e81612a35565b94506020860135612f2e81612a35565b93506040860135925060608601359150608086013567ffffffffffffffff811115612f57575f80fd5b612dba88828901612b27565b5f8060408385031215612f74575f80fd5b8235612f7f81612a35565b915060208301358015158114612f93575f80fd5b809150509250929050565b5f8060408385031215612faf575f80fd5b8235612fba81612a35565b91506020830135612f9381612a35565b5f81518060208401855e5f93019283525090919050565b5f612df9612fef8386612fca565b84612fca565b7f7b22646563696d616c73223a000000000000000000000000000000000000000081525f613026600c830187612fca565b7f2c226465736372697074696f6e223a2231206f6620746865736520726563656981527f7074732063616e206265206275726e656420616c6f6e67736964652031200000602082015261307c603e820187612fca565b90507f20746f2072656465656d2000000000000000000000000000000000000000000081526130ae600b820186612fca565b90507f2066726f6d20746865207661756c742e222c000000000000000000000000000081527f226e616d65223a220000000000000000000000000000000000000000000000006012820152613106601a820185612fca565b7f227d0000000000000000000000000000000000000000000000000000000000008152600201979650505050505050565b5f60208284031215613147575f80fd5b8151610b0081612a35565b634e487b7160e01b5f52603260045260245ffd5b5f613173612b4484612b00565b9050828152838383011115613186575f80fd5b8282602083015e5f602084830101529392505050565b5f602082840312156131ac575f80fd5b815167ffffffffffffffff8111156131c2575f80fd5b8201601f810184136131d2575f80fd5b612df984825160208401613166565b5f602082840312156131f1575f80fd5b815160ff81168114610b00575f80fd5b634e487b7160e01b5f52601260045260245ffd5b6001600160a01b0384168152826020820152606060408201525f61323c6060830184612bfb565b95945050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156102db576102db613245565b83815260208101839052606081016003831061329657634e487b7160e01b5f52602160045260245ffd5b826040830152949350505050565b5f805f606084860312156132b6575f80fd5b8351925060208401519150604084015167ffffffffffffffff811681146132db575f80fd5b809150509250925092565b808201808211156102db576102db613245565b5f8261331357634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176102db576102db613245565b5f6020828403121561333f575f80fd5b5051919050565b5f6001600160a01b03808816835280871660208401525060a0604083015261337160a0830186612eb3565b82810360608401526133838186612eb3565b905082810360808401526133978185612bfb565b98975050505050505050565b5f602082840312156133b3575f80fd5b8151610b0081612a73565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a060808301526133f560a0830184612bfb565b979650505050505050565b600181811c9082168061341457607f821691505b60208210810361343257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610f4457805f5260205f20601f840160051c8101602085101561345d5750805b601f840160051c820191505b818110156105a7575f8155600101613469565b815167ffffffffffffffff81111561349657613496612abb565b6134aa816134a48454613400565b84613438565b602080601f8311600181146134dd575f84156134c65750858301515b5f19600386901b1c1916600185901b17855561096d565b5f85815260208120601f198616915b8281101561350b578886015182559484019460019091019084016134ec565b508582101561352857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6001600160a01b038088168352808716602084015280861660408401525060a0606083015261356b60a0830185612eb3565b82810360808401526133978185612eb3565b8082018281125f83128015821682158216171561359c5761359c613245565b505092915050565b600181815b808511156135de57815f19048211156135c4576135c4613245565b808516156135d157918102915b93841c93908002906135a9565b509250929050565b5f826135f4575060016102db565b8161360057505f6102db565b816001811461361657600281146136205761363c565b60019150506102db565b60ff84111561363157613631613245565b50506001821b6102db565b5060208310610133831016604e8410600b841016171561365f575081810a6102db565b61366983836135a4565b805f190482111561367c5761367c613245565b029392505050565b5f6102d883836135e6565b604081525f6136a16040830185612eb3565b828103602084015261323c8185612eb3565b5f7f8000000000000000000000000000000000000000000000000000000000000000820361281e5761281e61324556"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b50600436106100fa575f3560e01c8063481c6a7511610093578063a22cb46511610063578063a22cb4651461023f578063c2530e3914610252578063e985e9c514610265578063f242432a146102cc575f80fd5b8063481c6a75146101bd5780634e1273f4146102045780636d5b3f781461022457806395d89b4114610237575f80fd5b80630e89341c116100ce5780630e89341c14610171578063177769cb146101845780632eb2c2d614610197578063439fab91146101aa575f80fd5b8062fdd58e146100fe57806301ffc9a714610124578063043fa9871461014757806306fdde031461015c575b5f80fd5b61011161010c366004612f42565b6102df565b6040519081526020015b60405180910390f35b610137610132366004612f99565b6102fb565b604051901515815260200161011b565b61015a6101553660046130c7565b6103dd565b005b6101646104a7565b60405161011b9190613195565b61016461017f3660046131a7565b61050c565b61015a6101923660046131be565b6105db565b61015a6101a536600461328c565b6105ea565b6101116101b8366004613333565b610609565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161011b565b61021761021236600461336d565b610821565b60405161011b9190613459565b61015a61023236600461346b565b610938565b610164610a0b565b61015a61024d3660046134cf565b610a5c565b61015a61026036600461346b565b610a67565b61013761027336600461350a565b73ffffffffffffffffffffffffffffffffffffffff9182165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45016020908152604080832093909416825291909152205460ff1690565b61015a6102da36600461346b565b610ae5565b5f6102f283836102ed610afb565b610b6e565b90505b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061038d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806102f557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102f5565b6103e5610bcf565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055856104528686868686610c43565b61049e7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b50505050505050565b60606104b1610d14565b6040518060400160405280600881526020017f20526563656970740000000000000000000000000000000000000000000000008152506040516020016104f892919061354d565b604051602081830303815290604052905090565b60605f61052261051a610ded565b60ff16610e9f565b61052a610d14565b610532610f5b565b61053a6104a7565b60405160200161054d9493929190613561565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152601d82527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000602083015291506105b382611055565b6040516020016105c492919061354d565b604051602081830303815290604052915050919050565b6105e6338383611061565b5050565b6105f5335b866110a9565b610602858585858561118d565b5050505050565b5f8061061361123a565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f8115801561063f5750825b90505f8267ffffffffffffffff16600114801561065b5750303b155b905081158015610669575080155b156106a0576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156107015784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61071860405180602001604052805f815250611262565b5f7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20090505f8880602001905181019061075191906136a3565b82547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9190911617909155507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3955083156108175784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b6060815183511461087057815183516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b5f610879610afb565b90505f845167ffffffffffffffff81111561089657610896612fb4565b6040519080825280602002602001820160405280156108bf578160200160208202803683370190505b5090505f5b855181101561092f5761090a8682815181106108e2576108e26136be565b60200260200101518683815181106108fc576108fc6136be565b602002602001015185610b6e565b82828151811061091c5761091c6136be565b60209081029190910101526001016108c4565b50949350505050565b610940610bcf565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716179055846109ab868584611061565b6109b785858585611273565b610a037fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b505050505050565b6060610a15610d14565b6040518060400160405280600581526020017f20524350540000000000000000000000000000000000000000000000000000008152506040516020016104f892919061354d565b6105e63383836112f5565b610a6f610bcf565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871617905584610ada868584611061565b6109b785858561144e565b610aee336105ef565b6106028585858585610c43565b5f3073ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6991906136a3565b905090565b5f80610b7a85856114dc565b90505f610b856114f1565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260209182526040808220888352909252908120549150610bc183838761158e565b5093505050505b9392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200805473ffffffffffffffffffffffffffffffffffffffff163314610c40576040517fc0b2335a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8416610c92576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f6004820152602401610867565b73ffffffffffffffffffffffffffffffffffffffff8516610ce1576040517f01a835140000000000000000000000000000000000000000000000000000000081525f6004820152602401610867565b6040805160018082526020820186905281830190815260608201859052608082019092529061049e87878484875f6118c6565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f95d89b4100000000000000000000000000000000000000000000000000000000815290516060939273ffffffffffffffffffffffffffffffffffffffff16916395d89b41916004808301925f9291908290030181865afa158015610da2573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610de79190810190613721565b91505090565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f313ce56700000000000000000000000000000000000000000000000000000000815290515f939273ffffffffffffffffffffffffffffffffffffffff169163313ce5679160048083019260209291908290030181865afa158015610e7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610de79190613766565b60605f610eab8361192b565b60010190505f8167ffffffffffffffff811115610eca57610eca612fb4565b6040519080825280601f01601f191660200182016040528015610ef4576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084610efe57509392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f38d52e0f00000000000000000000000000000000000000000000000000000000815290516060939273ffffffffffffffffffffffffffffffffffffffff16916338d52e0f9160048083019260209291908290030181865afa158015610fea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061100e91906136a3565b73ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610da2573d5f803e3d5ffd5b60606102f5825f611a0c565b8051156110a4577fd66d6a9810a5cef78b704e7e04334961e997c81d337f029f74637f060f3d8d6583838360405161109b939291906137b3565b60405180910390a15b505050565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015611136575073ffffffffffffffffffffffffffffffffffffffff8082165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4501602090815260408083209386168352929052205460ff16155b156105e6576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808416600483015282166024820152604401610867565b73ffffffffffffffffffffffffffffffffffffffff84166111dc576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f6004820152602401610867565b73ffffffffffffffffffffffffffffffffffffffff851661122b576040517f01a835140000000000000000000000000000000000000000000000000000000081525f6004820152602401610867565b610602858585858560016118c6565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102f5565b61126a611b8b565b610c4081611bcb565b73ffffffffffffffffffffffffffffffffffffffff84166112c2576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f6004820152602401610867565b60408051600180825260208201869052818301908152606082018590526080820190925290610a035f87848487846118c6565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c450073ffffffffffffffffffffffffffffffffffffffff8416611365576040517f3e31884e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610867565b73ffffffffffffffffffffffffffffffffffffffff83166113b4576040517fced3e1000000000000000000000000000000000000000000000000000000000081525f6004820152602401610867565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260018401602090815260408083209488168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661149d576040517f01a835140000000000000000000000000000000000000000000000000000000081525f6004820152602401610867565b604080516001808252602082018590528183019081526060820184905260a082019092525f6080820181815291929161060291879185908590836118c6565b5f806114e88484611bdc565b54949350505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0061153f60017fedb99b3af8e1c50d494d6f1b4c75245a0b733cb90baa42bfe0e2f5bc8b000f8261381d565b60405160200161155191815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101201692915050565b6040517f79ba43050000000000000000000000000000000000000000000000000000000081525f90819084908290819073ffffffffffffffffffffffffffffffffffffffff8716906379ba4305906115f0908690600390600190600401613830565b606060405180830381865afa15801561160b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162f9190613881565b5091509150875f03611718575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821461170a576040517f79ba4305000000000000000000000000000000000000000000000000000000008152919250829173ffffffffffffffffffffffffffffffffffffffff8716906379ba4305906116c0908590600390600190600401613830565b606060405180830381865afa1580156116db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ff9190613881565b50909250905061163c565b5f83945094505050506118be565b875b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83146118b65782935060028203611814576040517fb21a2494000000000000000000000000000000000000000000000000000000008152600481018490525f906118049073ffffffffffffffffffffffffffffffffffffffff8a169063b21a2494906024015f60405180830381865afa1580156117ba573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526117ff9190810190613721565b611c8c565b90506118108282611ca1565b9150505b6040517f79ba430500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816906379ba43059061186c908690600390600190600401613830565b606060405180830381865afa158015611887573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ab9190613881565b50909350915061171a565b945091925050505b935093915050565b6118d286868686611d1c565b73ffffffffffffffffffffffffffffffffffffffff851615610a035733811561190857611903818888888888611d81565b61049e565b60208581015190850151611920838a8a85858a611f70565b505050505050505050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611973577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831061199f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106119bd57662386f26fc10000830492506010015b6305f5e10083106119d5576305f5e100830492506008015b61271083106119e957612710830492506004015b606483106119fb576064830492506002015b600a83106102f55760010192915050565b606082515f03611a2a575060408051602081019091525f81526102f5565b5f82611a5a57600384516002611a4091906138c3565b611a4a91906138d6565b611a5590600461390e565b611a7f565b600384516004611a6a919061390e565b611a759060026138c3565b611a7f91906138d6565b905060405191507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f5261067083027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f18603f526020820181810185865187016020810180515f82525b82841015611b3d576003840193508351603f8160121c16518753600187019650603f81600c1c16518753600187019650603f8160061c16518753600187019650603f811651875350600186019550611aea565b905250859050611b7e57600386510660018114611b615760028114611b7457611b7c565b603d6001840353603d6002840353611b7c565b603d60018403535b505b9183525060405292915050565b611b936120ff565b611bc9576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611bd3611b8b565b610c408161211d565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00611c2a60017f3a8e79826d53842322cdcc810d4a989eb01ac46cfabfd48dcc021625ce13c2d761381d565b604051602001611c3c91815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301205f9687529290921681528185209585529490945250502090565b5f818060200190518101906102f59190613925565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611cff576040517fbf463fe900000000000000000000000000000000000000000000000000000000815260048101849052602401610867565b5f61092f611d16611d10865f612169565b856121c3565b5f612225565b5f611d25610afb565b90505f5b8351811015611d7457611d5686858381518110611d4857611d486136be565b602002602001015184612267565b611d6c85858381518110611d4857611d486136be565b600101611d29565b506106028585858561239d565b73ffffffffffffffffffffffffffffffffffffffff84163b15610a03576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c8190611df8908990899088908890889060040161393c565b6020604051808303815f875af1925050508015611e50575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611e4d918101906139a6565b60015b611edd573d808015611e7d576040519150601f19603f3d011682016040523d82523d5f602084013e611e82565b606091505b5080515f03611ed5576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602401610867565b805160208201fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c81000000000000000000000000000000000000000000000000000000001461049e576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602401610867565b73ffffffffffffffffffffffffffffffffffffffff84163b15610a03576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e6190611fe790899089908890889088906004016139c1565b6020604051808303815f875af192505050801561203f575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261203c918101906139a6565b60015b61206c573d808015611e7d576040519150601f19603f3d011682016040523d82523d5f602084013e611e82565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461049e576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602401610867565b5f61210861123a565b5468010000000000000000900460ff16919050565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45007f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45026110a48382613aa5565b5f805f612176858561245d565b91509150806121bb576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610867565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061220886868686612563565b915091505f6122178383612682565b9a9950505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6122598282876126e0565b9350935050505b9250929050565b73ffffffffffffffffffffffffffffffffffffffff831661228757505050565b5f6122906114f1565b73ffffffffffffffffffffffffffffffffffffffff85165f908152602082815260408083208784529091528120549192506122cb86866114dc565b90505f806122da83858861158e565b915091508381036122ef575050505050505050565b73ffffffffffffffffffffffffffffffffffffffff88165f908152602086815260408083208a84529091529020819055818314612331576123318888846128e7565b604080518581526020810183905290810184905260608101839052879073ffffffffffffffffffffffffffffffffffffffff8a16907f956b049289f8dbe8716375414d9fa6bf32cde65ec1b7e102623775cacc66a6999060800160405180910390a35050505050505050565b5f6123a66128fb565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200546040517fe5be7d9000000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063e5be7d90906124249084908990899089908990600401613bbd565b5f604051808303815f87803b15801561243b575f80fd5b505af115801561244d573d5f803e3d5ffd5b5050505061060285858585612994565b5f601b83900b83148383826124c1577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156124a157620186a0860595506005850194505b8586601b0b146124bc57600a860595508460010194506124a1565b6124d7565b855f036124d757505f9250600191506122609050565b848560030b14612533575f8512156124f757505f92508291506122609050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610867565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f808515841517801561257b575f92505f9150612678565b6125858487613c0f565b91505f61259188612c94565b90505f61259d87612c94565b90505f6125aa8383612cf5565b5090505f6f0785ee10d5da46d900f436a0000000008211156125df576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561260057670de0b6b3a7640000820491506012015b633b9aca0082111561261957633b9aca00820491506009015b61271082111561262e57612710820491506004015b811561264257600a8204915060010161262e565b61264c8187613c0f565b955061266e8b8a612668878761266387600a613d54565b612d30565b89612e15565b9097509550505050505b5094509492505050565b5f805f61268f858561245d565b915091508015801561269f575081155b156121bb576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610867565b5f805f851215612726576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610867565b845f0361273857505f905060016118be565b8460ff8416850185811215612783576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610867565b5f805f8312156127ed577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156127c4575f8095509550505050506118be565b825f03600a0a91508184816127db576127db613786565b04955050840290911491506118be9050565b5f8313156128d757604d831315612843576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610867565b82600a0a9150817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8161287857612878613786565b048411156128c5576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610867565b50919091029250600191506118be9050565b83600195509550505050506118be565b5f6128f28484611bdc565b91909155505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201545f907fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2009073ffffffffffffffffffffffffffffffffffffffff168061296457339250505090565b600190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055919050565b805182517f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c450091146129fe57825182516040517f5b05999100000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610867565b335f5b8451811015612b675760208181028681018201519086019091015173ffffffffffffffffffffffffffffffffffffffff891615612aff575f8281526020868152604080832073ffffffffffffffffffffffffffffffffffffffff8d16845290915290205481811015612acc576040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b166004820152602481018290526044810183905260648101849052608401610867565b5f8381526020878152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290209082900390555b73ffffffffffffffffffffffffffffffffffffffff881615612b5d575f8281526020868152604080832073ffffffffffffffffffffffffffffffffffffffff8c16845290915281208054839290612b579084906138c3565b90915550505b5050600101612a01565b508351600103612c0e5760208401515f9060208501519091508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051612bff929190918252602082015260400190565b60405180910390a45050610a03565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612c84929190613d5f565b60405180910390a4505050505050565b5f80821215612cf1577f80000000000000000000000000000000000000000000000000000000000000008203612ceb57507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b5f805f612d3d8686612cf5565b91509150815f03612d6157838181612d5757612d57613786565b0492505050610bc8565b838210612dab576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610867565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215612edf577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115612ecc57612e747f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60016138c3565b8403612ea457507f8000000000000000000000000000000000000000000000000000000000000000905081612f18565b612eaf600a856138d6565b612eb890613d83565b612ec3846001613c0f565b91509150612f18565b612ed584613d83565b8391509150612f18565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115612f1257612eb8600a856138d6565b50829050815b94509492505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610c40575f80fd5b5f8060408385031215612f53575f80fd5b8235612f5e81612f21565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610c40575f80fd5b5f60208284031215612fa9575f80fd5b8135610bc881612f6c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561302857613028612fb4565b604052919050565b5f67ffffffffffffffff82111561304957613049612fb4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613084575f80fd5b813561309761309282613030565b612fe1565b8181528460208386010111156130ab575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c087890312156130dc575f80fd5b86356130e781612f21565b955060208701356130f781612f21565b9450604087013561310781612f21565b9350606087013592506080870135915060a087013567ffffffffffffffff811115613130575f80fd5b61313c89828a01613075565b9150509295509295509295565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6102f26020830184613149565b5f602082840312156131b7575f80fd5b5035919050565b5f80604083850312156131cf575f80fd5b82359150602083013567ffffffffffffffff8111156131ec575f80fd5b6131f885828601613075565b9150509250929050565b5f67ffffffffffffffff82111561321b5761321b612fb4565b5060051b60200190565b5f82601f830112613234575f80fd5b8135602061324461309283613202565b8083825260208201915060208460051b870101935086841115613265575f80fd5b602086015b84811015613281578035835291830191830161326a565b509695505050505050565b5f805f805f60a086880312156132a0575f80fd5b85356132ab81612f21565b945060208601356132bb81612f21565b9350604086013567ffffffffffffffff808211156132d7575f80fd5b6132e389838a01613225565b945060608801359150808211156132f8575f80fd5b61330489838a01613225565b93506080880135915080821115613319575f80fd5b5061332688828901613075565b9150509295509295909350565b5f60208284031215613343575f80fd5b813567ffffffffffffffff811115613359575f80fd5b61336584828501613075565b949350505050565b5f806040838503121561337e575f80fd5b823567ffffffffffffffff80821115613395575f80fd5b818501915085601f8301126133a8575f80fd5b813560206133b861309283613202565b82815260059290921b840181019181810190898411156133d6575f80fd5b948201945b838610156133fd5785356133ee81612f21565b825294820194908201906133db565b96505086013592505080821115613412575f80fd5b506131f885828601613225565b5f815180845260208085019450602084015f5b8381101561344e57815187529582019590820190600101613432565b509495945050505050565b602081525f6102f2602083018461341f565b5f805f805f60a0868803121561347f575f80fd5b853561348a81612f21565b9450602086013561349a81612f21565b93506040860135925060608601359150608086013567ffffffffffffffff8111156134c3575f80fd5b61332688828901613075565b5f80604083850312156134e0575f80fd5b82356134eb81612f21565b9150602083013580151581146134ff575f80fd5b809150509250929050565b5f806040838503121561351b575f80fd5b823561352681612f21565b915060208301356134ff81612f21565b5f81518060208401855e5f93019283525090919050565b5f61336561355b8386613536565b84613536565b7f7b22646563696d616c73223a000000000000000000000000000000000000000081525f613592600c830187613536565b7f2c226465736372697074696f6e223a2231206f6620746865736520726563656981527f7074732063616e206265206275726e656420616c6f6e6773696465203120000060208201526135e8603e820187613536565b90507f20746f2072656465656d20000000000000000000000000000000000000000000815261361a600b820186613536565b90507f2066726f6d20746865207661756c742e222c000000000000000000000000000081527f226e616d65223a220000000000000000000000000000000000000000000000006012820152613672601a820185613536565b7f227d0000000000000000000000000000000000000000000000000000000000008152600201979650505050505050565b5f602082840312156136b3575f80fd5b8151610bc881612f21565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6136f861309284613030565b905082815283838301111561370b575f80fd5b8282602083015e5f602084830101529392505050565b5f60208284031215613731575f80fd5b815167ffffffffffffffff811115613747575f80fd5b8201601f81018413613757575f80fd5b613365848251602084016136eb565b5f60208284031215613776575f80fd5b815160ff81168114610bc8575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6137e76060830184613149565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156102f5576102f56137f0565b838152602081018390526060810160038310613873577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b826040830152949350505050565b5f805f60608486031215613893575f80fd5b8351925060208401519150604084015167ffffffffffffffff811681146138b8575f80fd5b809150509250925092565b808201808211156102f5576102f56137f0565b5f82613909577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820281158282048414176102f5576102f56137f0565b5f60208284031215613935575f80fd5b5051919050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a0604083015261397460a083018661341f565b8281036060840152613986818661341f565b9050828103608084015261399a8185613149565b98975050505050505050565b5f602082840312156139b6575f80fd5b8151610bc881612f6c565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a06080830152613a0560a0830184613149565b979650505050505050565b600181811c90821680613a2457607f821691505b602082108103613a5b577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f8211156110a457805f5260205f20601f840160051c81016020851015613a865750805b601f840160051c820191505b81811015610602575f8155600101613a92565b815167ffffffffffffffff811115613abf57613abf612fb4565b613ad381613acd8454613a10565b84613a61565b602080601f831160018114613b25575f8415613aef5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610a03565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b7157888601518255948401946001909101908401613b52565b5085821015613bad57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b5f73ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015280861660408401525060a06060830152613bfd60a083018561341f565b828103608084015261399a818561341f565b8082018281125f831280158216821582161715613c2e57613c2e6137f0565b505092915050565b600181815b80851115613c8f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613c7557613c756137f0565b80851615613c8257918102915b93841c9390800290613c3b565b509250929050565b5f82613ca5575060016102f5565b81613cb157505f6102f5565b8160018114613cc75760028114613cd157613ced565b60019150506102f5565b60ff841115613ce257613ce26137f0565b50506001821b6102f5565b5060208310610133831016604e8410600b8410161715613d10575081810a6102f5565b613d1a8383613c36565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613d4c57613d4c6137f0565b029392505050565b5f6102f28383613c97565b604081525f613d71604083018561341f565b82810360208401526137e7818561341f565b5f7f80000000000000000000000000000000000000000000000000000000000000008203612ceb57612ceb6137f056"; + hex"608060405234801561000f575f80fd5b50600436106100fa575f3560e01c8063481c6a7511610093578063a22cb46511610063578063a22cb46514610232578063c2530e3914610245578063e985e9c514610258578063f242432a146102b2575f80fd5b8063481c6a75146101bd5780634e1273f4146101f75780636d5b3f781461021757806395d89b411461022a575f80fd5b80630e89341c116100ce5780630e89341c14610171578063177769cb146101845780632eb2c2d614610197578063439fab91146101aa575f80fd5b8062fdd58e146100fe57806301ffc9a714610124578063043fa9871461014757806306fdde031461015c575b5f80fd5b61011161010c366004612a49565b6102c5565b6040519081526020015b60405180910390f35b610137610132366004612aa0565b6102e1565b604051901515815260200161011b565b61015a610155366004612b79565b6103c3565b005b61016461046a565b60405161011b9190612c29565b61016461017f366004612c3b565b6104cf565b61015a610192366004612c52565b610580565b61015a6101a5366004612d20565b61058f565b6101116101b8366004612dc7565b6105ae565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200546040516001600160a01b03909116815260200161011b565b61020a610205366004612e01565b6107ae565b60405161011b9190612eed565b61015a610225366004612eff565b6108c5565b610164610975565b61015a610240366004612f63565b6109c6565b61015a610253366004612eff565b6109d1565b610137610266366004612f9e565b6001600160a01b039182165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45016020908152604080832093909416825291909152205460ff1690565b61015a6102c0366004612eff565b610a37565b5f6102d883836102d3610a4d565b610ab3565b90505b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061037357507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806102db57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102db565b6103cb610b07565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038816179055856104208686868686610b6e565b6104617fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19169055565b50505050505050565b6060610474610c25565b6040518060400160405280600881526020017f20526563656970740000000000000000000000000000000000000000000000008152506040516020016104bb929190612fe1565b604051602081830303815290604052905090565b60605f6104e56104dd610cd3565b60ff16610d78565b6104ed610c25565b6104f5610e15565b6104fd61046a565b6040516020016105109493929190612ff5565b60408051601f19818403018152828201909152601d82527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020830152915061055882610ef5565b604051602001610569929190612fe1565b604051602081830303815290604052915050919050565b61058b338383610f01565b5050565b61059a335b86610f49565b6105a78585858585610ff9565b5050505050565b5f806105b861108c565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156105e45750825b90505f8267ffffffffffffffff1660011480156106005750303b155b90508115801561060e575080155b15610645576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156106a65784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6106bd60405180602001604052805f8152506110b4565b5f7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20090505f888060200190518101906106f69190613137565b825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039190911617909155507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3955083156107a45784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b606081518351146107fd57815183516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b5f610806610a4d565b90505f845167ffffffffffffffff81111561082357610823612abb565b60405190808252806020026020018201604052801561084c578160200160208202803683370190505b5090505f5b85518110156108bc5761089786828151811061086f5761086f613152565b602002602001015186838151811061088957610889613152565b602002602001015185610ab3565b8282815181106108a9576108a9613152565b6020908102919091010152600101610851565b50949350505050565b6108cd610b07565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03871617905584610920868584610f01565b61092c858585856110c5565b61096d7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19169055565b505050505050565b606061097f610c25565b6040518060400160405280600581526020017f20524350540000000000000000000000000000000000000000000000000000008152506040516020016104bb929190612fe1565b61058b33838361113a565b6109d9610b07565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03871617905584610a2c868584610f01565b61092c85858561124e565b610a4033610594565b6105a78585858585610b6e565b5f306001600160a01b031663481c6a756040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a8a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aae9190613137565b905090565b5f80610abf85856112cf565b90505f610aca6112e4565b6001600160a01b0387165f90815260209182526040808220888352909252908120549150610af9838387611345565b5093505050505b9392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20080546001600160a01b03163314610b6b576040517fc0b2335a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6001600160a01b038416610bb0576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016107f4565b6001600160a01b038516610bf2576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016107f4565b6040805160018082526020820186905281830190815260608201859052608082019092529061046187878484875f6115ed565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f95d89b410000000000000000000000000000000000000000000000000000000081529051606093926001600160a01b0316916395d89b41916004808301925f9291908290030181865afa158015610ca6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ccd919081019061319c565b91505090565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f313ce56700000000000000000000000000000000000000000000000000000000815290515f93926001600160a01b03169163313ce5679160048083019260209291908290030181865afa158015610d54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ccd91906131e1565b60605f610d8483611645565b60010190505f8167ffffffffffffffff811115610da357610da3612abb565b6040519080825280601f01601f191660200182016040528015610dcd576020820181803683370190505b5090508181016020015b5f19017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084610dd757509392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f38d52e0f0000000000000000000000000000000000000000000000000000000081529051606093926001600160a01b0316916338d52e0f9160048083019260209291908290030181865afa158015610e97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebb9190613137565b6001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610ca6573d5f803e3d5ffd5b60606102db825f611726565b805115610f44577fd66d6a9810a5cef78b704e7e04334961e997c81d337f029f74637f060f3d8d65838383604051610f3b93929190613215565b60405180910390a15b505050565b816001600160a01b0316816001600160a01b031614158015610faf57506001600160a01b038082165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4501602090815260408083209386168352929052205460ff16155b1561058b576040517fe237d9220000000000000000000000000000000000000000000000000000000081526001600160a01b038084166004830152821660248201526044016107f4565b6001600160a01b03841661103b576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016107f4565b6001600160a01b03851661107d576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016107f4565b6105a7858585858560016115ed565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102db565b6110bc6118a5565b610b6b816118e5565b6001600160a01b038416611107576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f60048201526024016107f4565b6040805160018082526020820186905281830190815260608201859052608082019092529061096d5f87848487846115ed565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45006001600160a01b03841661119d576040517f3e31884e0000000000000000000000000000000000000000000000000000000081525f60048201526024016107f4565b6001600160a01b0383166111df576040517fced3e1000000000000000000000000000000000000000000000000000000000081525f60048201526024016107f4565b6001600160a01b038481165f818152600184016020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b6001600160a01b038316611290576040517f01a835140000000000000000000000000000000000000000000000000000000081525f60048201526024016107f4565b604080516001808252602082018590528183019081526060820184905260a082019092525f608082018181529192916105a791879185908590836115ed565b5f806112db84846118f6565b54949350505050565b5f8060ff1961131460017fedb99b3af8e1c50d494d6f1b4c75245a0b733cb90baa42bfe0e2f5bc8b000f82613259565b60405160200161132691815260200190565b60408051601f1981840301815291905280516020909101201692915050565b6040517f79ba43050000000000000000000000000000000000000000000000000000000081525f9081908490829081906001600160a01b038716906379ba43059061139a90869060039060019060040161326c565b606060405180830381865afa1580156113b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d991906132a4565b5091509150875f03611496575b5f198214611488576040517f79ba430500000000000000000000000000000000000000000000000000000000815291925082916001600160a01b038716906379ba43059061143e90859060039060019060040161326c565b606060405180830381865afa158015611459573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147d91906132a4565b5090925090506113e6565b5f83945094505050506115e5565b875b5f1983146115dd5782935060028203611548576040517fb21a2494000000000000000000000000000000000000000000000000000000008152600481018490525f90611538906001600160a01b038a169063b21a2494906024015f60405180830381865afa15801561150c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611533919081019061319c565b61196a565b9050611544828261197f565b9150505b6040517f79ba43050000000000000000000000000000000000000000000000000000000081526001600160a01b038816906379ba43059061159390869060039060019060040161326c565b606060405180830381865afa1580156115ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d291906132a4565b509093509150611498565b945091925050505b935093915050565b6115f9868686866119fa565b6001600160a01b0385161561096d573381156116225761161d818888888888611a5f565b610461565b6020858101519085015161163a838a8a85858a611bfc565b505050505050505050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061168d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106116b9576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106116d757662386f26fc10000830492506010015b6305f5e10083106116ef576305f5e100830492506008015b612710831061170357612710830492506004015b60648310611715576064830492506002015b600a83106102db5760010192915050565b606082515f03611744575060408051602081019091525f81526102db565b5f826117745760038451600261175a91906132e6565b61176491906132f9565b61176f906004613318565b611799565b6003845160046117849190613318565b61178f9060026132e6565b61179991906132f9565b905060405191507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f5261067083027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f18603f526020820181810185865187016020810180515f82525b82841015611857576003840193508351603f8160121c16518753600187019650603f81600c1c16518753600187019650603f8160061c16518753600187019650603f811651875350600186019550611804565b9052508590506118985760038651066001811461187b576002811461188e57611896565b603d6001840353603d6002840353611896565b603d60018403535b505b9183525060405292915050565b6118ad611d46565b6118e3576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6118ed6118a5565b610b6b81611d64565b5f8060ff1961192660017f3a8e79826d53842322cdcc810d4a989eb01ac46cfabfd48dcc021625ce13c2d7613259565b60405160200161193891815260200190565b60408051808303601f1901815291815281516020928301205f9687529290921681528185209585529490945250502090565b5f818060200190518101906102db919061332f565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156119dd576040517fbf463fe9000000000000000000000000000000000000000000000000000000008152600481018490526024016107f4565b5f6108bc6119f46119ee865f611db0565b85611e0a565b5f611e6c565b5f611a03610a4d565b90505f5b8351811015611a5257611a3486858381518110611a2657611a26613152565b602002602001015184611eae565b611a4a85858381518110611a2657611a26613152565b600101611a07565b506105a785858585611fb0565b6001600160a01b0384163b1561096d576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c8190611abc9089908990889088908890600401613346565b6020604051808303815f875af1925050508015611af6575060408051601f3d908101601f19168201909252611af3918101906133a3565b60015b611b76573d808015611b23576040519150601f19603f3d011682016040523d82523d5f602084013e611b28565b606091505b5080515f03611b6e576040517f57f447ce0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024016107f4565b805160208201fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014610461576040517f57f447ce0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024016107f4565b6001600160a01b0384163b1561096d576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e6190611c5990899089908890889088906004016133be565b6020604051808303815f875af1925050508015611c93575060408051601f3d908101601f19168201909252611c90918101906133a3565b60015b611cc0573d808015611b23576040519150601f19603f3d011682016040523d82523d5f602084013e611b28565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014610461576040517f57f447ce0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024016107f4565b5f611d4f61108c565b5468010000000000000000900460ff16919050565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45007f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4502610f44838261347c565b5f805f611dbd8585612063565b9150915080611e02576040517f22c9f7bb00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016107f4565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d8480611e4f86868686612169565b915091505f611e5e8383612288565b9a9950505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d611ea08282876122e6565b9350935050505b9250929050565b6001600160a01b038316611ec157505050565b5f611eca6112e4565b6001600160a01b0385165f90815260208281526040808320878452909152812054919250611ef886866112cf565b90505f80611f07838588611345565b91509150838103611f1c575050505050505050565b6001600160a01b0388165f908152602086815260408083208a84529091529020819055818314611f5157611f518888846124ce565b60408051858152602081018390529081018490526060810183905287906001600160a01b038a16907f956b049289f8dbe8716375414d9fa6bf32cde65ec1b7e102623775cacc66a6999060800160405180910390a35050505050505050565b5f611fb96124e2565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200546040517fe5be7d900000000000000000000000000000000000000000000000000000000081529192506001600160a01b03169063e5be7d909061202a9084908990899089908990600401613538565b5f604051808303815f87803b158015612041575f80fd5b505af1158015612053573d5f803e3d5ffd5b505050506105a785858585612563565b5f601b83900b83148383826120c7577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008605156120a757620186a0860595506005850194505b8586601b0b146120c257600a860595508460010194506120a7565b6120dd565b855f036120dd57505f925060019150611ea79050565b848560030b14612139575f8512156120fd57505f9250829150611ea79050565b6040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016107f4565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f8085158415178015612181575f92505f915061227e565b61218b848761357d565b91505f612197886127c7565b90505f6121a3876127c7565b90505f6121b08383612828565b5090505f6f0785ee10d5da46d900f436a0000000008211156121e5576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561220657670de0b6b3a7640000820491506012015b633b9aca0082111561221f57633b9aca00820491506009015b61271082111561223457612710820491506004015b811561224857600a82049150600101612234565b612252818761357d565b95506122748b8a61226e878761226987600a613684565b612844565b89612929565b9097509550505050505b5094509492505050565b5f805f6122958585612063565b91509150801580156122a5575081155b15611e02576040517f8eba4d0700000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016107f4565b5f805f85121561232c576040517f4a7d166b00000000000000000000000000000000000000000000000000000000815260048101869052602481018590526044016107f4565b845f0361233e57505f905060016115e5565b8460ff8416850185811215612389576040517fd556b11100000000000000000000000000000000000000000000000000000000815260048101889052602481018790526044016107f4565b5f805f8312156123f3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb38312156123ca575f8095509550505050506115e5565b825f03600a0a91508184816123e1576123e1613201565b04955050840290911491506115e59050565b5f8313156124be57604d831315612449576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016107f4565b82600a0a9150815f198161245f5761245f613201565b048411156124ac576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff881660448201526064016107f4565b50919091029250600191506115e59050565b83600195509550505050506115e5565b5f6124d984846118f6565b91909155505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201545f907fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200906001600160a01b03168061253e57339250505090565b6001909101805473ffffffffffffffffffffffffffffffffffffffff19169055919050565b805182517f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c450091146125cd57825182516040517f5b059991000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016107f4565b335f5b84518110156126e8576020818102868101820151908601909101516001600160a01b0389161561269a575f828152602086815260408083206001600160a01b038d16845290915290205481811015612674576040517f03dee4c50000000000000000000000000000000000000000000000000000000081526001600160a01b038b1660048201526024810182905260448101839052606481018490526084016107f4565b5f838152602087815260408083206001600160a01b038e16845290915290209082900390555b6001600160a01b038816156126de575f828152602086815260408083206001600160a01b038c168452909152812080548392906126d89084906132e6565b90915550505b50506001016125d0565b5083516001036127685760208401515f906020850151909150866001600160a01b0316886001600160a01b0316846001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051612759929190918252602082015260400190565b60405180910390a4505061096d565b846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516127b792919061368f565b60405180910390a4505050505050565b5f80821215612824577f8000000000000000000000000000000000000000000000000000000000000000820361281e57507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f1983850993909202808410938190039390930393915050565b5f805f6128518686612828565b91509150815f036128755783818161286b5761286b613201565b0492505050610b00565b8382106128bf576040517f6c59da120000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064016107f4565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f85871812156129f3577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8411156129e0576129887f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60016132e6565b84036129b857507f8000000000000000000000000000000000000000000000000000000000000000905081612a2c565b6129c3600a856132f9565b6129cc906136b3565b6129d784600161357d565b91509150612a2c565b6129e9846136b3565b8391509150612a2c565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115612a26576129cc600a856132f9565b50829050815b94509492505050565b6001600160a01b0381168114610b6b575f80fd5b5f8060408385031215612a5a575f80fd5b8235612a6581612a35565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610b6b575f80fd5b5f60208284031215612ab0575f80fd5b8135610b0081612a73565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612af857612af8612abb565b604052919050565b5f67ffffffffffffffff821115612b1957612b19612abb565b50601f01601f191660200190565b5f82601f830112612b36575f80fd5b8135612b49612b4482612b00565b612acf565b818152846020838601011115612b5d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215612b8e575f80fd5b8635612b9981612a35565b95506020870135612ba981612a35565b94506040870135612bb981612a35565b9350606087013592506080870135915060a087013567ffffffffffffffff811115612be2575f80fd5b612bee89828a01612b27565b9150509295509295509295565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6102d86020830184612bfb565b5f60208284031215612c4b575f80fd5b5035919050565b5f8060408385031215612c63575f80fd5b82359150602083013567ffffffffffffffff811115612c80575f80fd5b612c8c85828601612b27565b9150509250929050565b5f67ffffffffffffffff821115612caf57612caf612abb565b5060051b60200190565b5f82601f830112612cc8575f80fd5b81356020612cd8612b4483612c96565b8083825260208201915060208460051b870101935086841115612cf9575f80fd5b602086015b84811015612d155780358352918301918301612cfe565b509695505050505050565b5f805f805f60a08688031215612d34575f80fd5b8535612d3f81612a35565b94506020860135612d4f81612a35565b9350604086013567ffffffffffffffff80821115612d6b575f80fd5b612d7789838a01612cb9565b94506060880135915080821115612d8c575f80fd5b612d9889838a01612cb9565b93506080880135915080821115612dad575f80fd5b50612dba88828901612b27565b9150509295509295909350565b5f60208284031215612dd7575f80fd5b813567ffffffffffffffff811115612ded575f80fd5b612df984828501612b27565b949350505050565b5f8060408385031215612e12575f80fd5b823567ffffffffffffffff80821115612e29575f80fd5b818501915085601f830112612e3c575f80fd5b81356020612e4c612b4483612c96565b82815260059290921b84018101918181019089841115612e6a575f80fd5b948201945b83861015612e91578535612e8281612a35565b82529482019490820190612e6f565b96505086013592505080821115612ea6575f80fd5b50612c8c85828601612cb9565b5f815180845260208085019450602084015f5b83811015612ee257815187529582019590820190600101612ec6565b509495945050505050565b602081525f6102d86020830184612eb3565b5f805f805f60a08688031215612f13575f80fd5b8535612f1e81612a35565b94506020860135612f2e81612a35565b93506040860135925060608601359150608086013567ffffffffffffffff811115612f57575f80fd5b612dba88828901612b27565b5f8060408385031215612f74575f80fd5b8235612f7f81612a35565b915060208301358015158114612f93575f80fd5b809150509250929050565b5f8060408385031215612faf575f80fd5b8235612fba81612a35565b91506020830135612f9381612a35565b5f81518060208401855e5f93019283525090919050565b5f612df9612fef8386612fca565b84612fca565b7f7b22646563696d616c73223a000000000000000000000000000000000000000081525f613026600c830187612fca565b7f2c226465736372697074696f6e223a2231206f6620746865736520726563656981527f7074732063616e206265206275726e656420616c6f6e67736964652031200000602082015261307c603e820187612fca565b90507f20746f2072656465656d2000000000000000000000000000000000000000000081526130ae600b820186612fca565b90507f2066726f6d20746865207661756c742e222c000000000000000000000000000081527f226e616d65223a220000000000000000000000000000000000000000000000006012820152613106601a820185612fca565b7f227d0000000000000000000000000000000000000000000000000000000000008152600201979650505050505050565b5f60208284031215613147575f80fd5b8151610b0081612a35565b634e487b7160e01b5f52603260045260245ffd5b5f613173612b4484612b00565b9050828152838383011115613186575f80fd5b8282602083015e5f602084830101529392505050565b5f602082840312156131ac575f80fd5b815167ffffffffffffffff8111156131c2575f80fd5b8201601f810184136131d2575f80fd5b612df984825160208401613166565b5f602082840312156131f1575f80fd5b815160ff81168114610b00575f80fd5b634e487b7160e01b5f52601260045260245ffd5b6001600160a01b0384168152826020820152606060408201525f61323c6060830184612bfb565b95945050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156102db576102db613245565b83815260208101839052606081016003831061329657634e487b7160e01b5f52602160045260245ffd5b826040830152949350505050565b5f805f606084860312156132b6575f80fd5b8351925060208401519150604084015167ffffffffffffffff811681146132db575f80fd5b809150509250925092565b808201808211156102db576102db613245565b5f8261331357634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176102db576102db613245565b5f6020828403121561333f575f80fd5b5051919050565b5f6001600160a01b03808816835280871660208401525060a0604083015261337160a0830186612eb3565b82810360608401526133838186612eb3565b905082810360808401526133978185612bfb565b98975050505050505050565b5f602082840312156133b3575f80fd5b8151610b0081612a73565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a060808301526133f560a0830184612bfb565b979650505050505050565b600181811c9082168061341457607f821691505b60208210810361343257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610f4457805f5260205f20601f840160051c8101602085101561345d5750805b601f840160051c820191505b818110156105a7575f8155600101613469565b815167ffffffffffffffff81111561349657613496612abb565b6134aa816134a48454613400565b84613438565b602080601f8311600181146134dd575f84156134c65750858301515b5f19600386901b1c1916600185901b17855561096d565b5f85815260208120601f198616915b8281101561350b578886015182559484019460019091019084016134ec565b508582101561352857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6001600160a01b038088168352808716602084015280861660408401525060a0606083015261356b60a0830185612eb3565b82810360808401526133978185612eb3565b8082018281125f83128015821682158216171561359c5761359c613245565b505092915050565b600181815b808511156135de57815f19048211156135c4576135c4613245565b808516156135d157918102915b93841c93908002906135a9565b509250929050565b5f826135f4575060016102db565b8161360057505f6102db565b816001811461361657600281146136205761363c565b60019150506102db565b60ff84111561363157613631613245565b50506001821b6102db565b5060208310610133831016604e8410600b841016171561365f575081810a6102db565b61366983836135a4565b805f190482111561367c5761367c613245565b029392505050565b5f6102d883836135e6565b604081525f6136a16040830185612eb3565b828103602084015261323c8185612eb3565b5f7f8000000000000000000000000000000000000000000000000000000000000000820361281e5761281e61324556"; diff --git a/src/generated/StoxReceiptVault.pointers.sol b/src/generated/StoxReceiptVault.pointers.sol index e3b3fbba..d455ad4a 100644 --- a/src/generated/StoxReceiptVault.pointers.sol +++ b/src/generated/StoxReceiptVault.pointers.sol @@ -10,16 +10,16 @@ pragma solidity ^0.8.25; // file needs the contract to exist so that it can be compiled. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x577df3fa0da43c77ab39988fb287becea335ac426bacee1dc305fe11ccd2ee19); +bytes32 constant BYTECODE_HASH = bytes32(0x11da975b8024dd98441bfdf42a68462fa5db9bd4e3af348f05928ef359924671); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x93545768D43A723Fe8E07d9381edC56341E76a25); +address constant DEPLOYED_ADDRESS = address(0x2BCcEd626566Ef1e65F922DD03748C5C7aa2d748); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"608060405234801561000f575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561003c610041565b6100f3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100915760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100f05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b616162806101005f395ff3fe608060405260043610610337575f3560e01c8063715018a6116101af578063bbec4d06116100eb578063dd62ed3e11610094578063e70689f51161006e578063e70689f5146109ab578063f2fde38b146109ca578063f5647943146109e9578063f5d214f514610a1e5761033e565b8063dd62ed3e146108ed578063e1e6b89814610950578063e5be7d901461098c5761033e565b8063c77b66c2116100c5578063c77b66c2146108b3578063d09edf31146108c6578063db2088f4146108da5761033e565b8063bbec4d0614610875578063c54cafee14610894578063c63d75b6146105635761033e565b80638da5cb5b11610158578063a9059cbb11610132578063a9059cbb146107b8578063ac9650d8146107d7578063ae57de0c14610803578063ae98b39f146108225761033e565b80638da5cb5b14610771578063921a4c421461078557806395d89b41146107a45761033e565b80637a7af70d116101895780637a7af70d1461072057806381c3fcb91461073357806385b68756146107525761033e565b8063715018a6146106ce578063770afee1146106e2578063786cd916146107015761033e565b8063276b11401161027e5780634abe413711610227578063633ac71711610201578063633ac7171461061e5780636ba235211461063d5780636c876b941461069057806370a08231146106af5761033e565b80634abe4137146105c157806356db02e8146105e057806359f89dda146105ff5761033e565b8063402d267d11610258578063402d267d14610563578063439fab9114610583578063488bd7b0146105a25761033e565b8063276b1140146104fe578063313ce5671461051157806338d52e0f146105375761033e565b806318160ddd116102e05780631f6759d3116102ba5780631f6759d31461048d57806323b872dd146104c05780632755c6c7146104df5761033e565b806318160ddd1461043b578063181e7b3b1461044f5780631e4344a11461046e5761033e565b806306fdde031161031157806306fdde03146103e8578063095ea7b3146104095780631423feba146104285761033e565b806301e1d1141461037357806301ffc9a71461039a578063058a628f146103c95761033e565b3661033e57005b73db479091164a15f1ba29de513776fffbb4a9f0af365f80375f80365f845af43d5f803e80801561036d573d5ff35b3d5ffd5b005b34801561037e575f80fd5b50610387610a51565b6040519081526020015b60405180910390f35b3480156103a5575f80fd5b506103b96103b4366004614fc2565b610a5f565b6040519015158152602001610391565b3480156103d4575f80fd5b506103716103e3366004615015565b610aba565b3480156103f3575f80fd5b506103fc610ce3565b604051610391919061507c565b348015610414575f80fd5b506103b961042336600461508e565b610db6565b610387610436366004615217565b610dcd565b348015610446575f80fd5b50610387610e17565b34801561045a575f80fd5b50610387610469366004615276565b610e20565b348015610479575f80fd5b50610371610488366004615296565b610e3f565b348015610498575f80fd5b507f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70054610387565b3480156104cb575f80fd5b506103b96104da3660046152ad565b610ecb565b3480156104ea575f80fd5b506103716104f936600461508e565b610eee565b61038761050c366004615276565b611028565b34801561051c575f80fd5b50610525611053565b60405160ff9091168152602001610391565b348015610542575f80fd5b5061054b6110f8565b6040516001600160a01b039091168152602001610391565b34801561056e575f80fd5b5061038761057d366004615015565b505f1990565b34801561058e575f80fd5b5061038761059d3660046152eb565b61112c565b3480156105ad575f80fd5b506103876105bc366004615276565b6113d1565b3480156105cc575f80fd5b506103876105db36600461508e565b6113e9565b3480156105eb575f80fd5b506103876105fa36600461531d565b6114a3565b34801561060a575f80fd5b50610371610619366004615364565b6117e4565b348015610629575f80fd5b50610371610638366004615015565b61181c565b348015610648575f80fd5b50610387610657366004615015565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be701602052604090205490565b34801561069b575f80fd5b506103716106aa366004615015565b611949565b3480156106ba575f80fd5b506103876106c9366004615015565b611a49565b3480156106d9575f80fd5b50610371611a92565b3480156106ed575f80fd5b506103876106fc366004615364565b611aa5565b34801561070c575f80fd5b5061037161071b36600461508e565b611c5f565b61038761072e366004615276565b611d90565b34801561073e575f80fd5b5061037161074d3660046152eb565b611da5565b34801561075d575f80fd5b5061038761076c36600461508e565b611de1565b34801561077c575f80fd5b5061054b611ec4565b348015610790575f80fd5b5061038761079f3660046153b9565b611ecd565b3480156107af575f80fd5b506103fc611efa565b3480156107c3575f80fd5b506103b96107d236600461508e565b611f4b565b3480156107e2575f80fd5b506107f66107f136600461542a565b611f58565b6040516103919190615499565b34801561080e575f80fd5b5061038761081d3660046153b9565b61203e565b34801561082d575f80fd5b5061038761083c366004615015565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be702602052604090205490565b348015610880575f80fd5b5061038761088f366004615276565b612061565b34801561089f575f80fd5b506103876108ae366004615557565b61206f565b6103876108c1366004615217565b612157565b3480156108d1575f80fd5b5061054b612186565b6103876108e8366004615276565b6121ae565b3480156108f8575f80fd5b506103876109073660046155bc565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b34801561095b575f80fd5b507f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031661054b565b348015610997575f80fd5b506103716109a6366004615665565b6121c2565b3480156109b6575f80fd5b506103716109c53660046156fb565b6122f9565b3480156109d5575f80fd5b506103716109e4366004615015565b612462565b3480156109f4575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd025442116103b9565b348015610a29575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0154610387565b5f610a5a610e17565b905090565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda000000000000000000000000000000000000000000000000000000001480610ab45750610ab4826124b8565b92915050565b6040517f248a9ca30000000000000000000000000000000000000000000000000000000081527ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f8960048201525f906001600160a01b0383169063248a9ca390602401602060405180830381865afa158015610b37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b5b9190615753565b905080610bca576040517f76728ed90000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201527ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f8960248201526044015b60405180910390fd5b6040517f248a9ca30000000000000000000000000000000000000000000000000000000081527f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e760048201525f906001600160a01b0384169063248a9ca390602401602060405180830381865afa158015610c47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6b9190615753565b905080610cd5576040517f76728ed90000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201527f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e76024820152604401610bc1565b610cde836125e6565b505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610d349061576a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d609061576a565b8015610dab5780601f10610d8257610100808354040283529160200191610dab565b820191905f5260205f20905b815481529060010190602001808311610d8e57829003601f168201915b505050505091505090565b5f33610dc38185856125f7565b5060019392505050565b5f80610dd7612604565b90505f610df187610deb335b89865f61265b565b8761266f565b9050610e008787838588612685565b610e0b335b476128ac565b9150505b949350505050565b5f610a5a612955565b5f610e3883670de0b6b3a7640000612ab4565b612ab4565b9392505050565b610e47612ac0565b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7008054821115610e75578181555b7fff9fd4facd8bd30d905cc7ffbd03e8829a414df4c6554d155d132c3377868a42610e9e611ec4565b8254604080516001600160a01b039093168352602083018690528201526060015b60405180910390a15050565b5f33610ed8858285612b0b565b610ee3858585612bbf565b506001949350505050565b610ef6612ac0565b805f03610f3a576040517f5a6084530000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610bc1565b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115610fb7576001600160a01b0383165f90815260028201602052604090208290555b7fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd610fe0611ec4565b6001600160a01b038581165f818152600286016020908152604091829020548251959094168552840191909152820185905260608201526080015b60405180910390a1505050565b5f8061104884611042335b3361103c612604565b5f61265b565b85612c4e565b9050610e3833610e05565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080545f91906001600160a01b0316803b806110905760126110f0565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f091906157b5565b935050505090565b5f807f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326005b546001600160a01b031692915050565b5f80611136612c65565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156111625750825b90505f8267ffffffffffffffff16600114801561117e5750303b155b90508115801561118c575080155b156111c3576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156112245784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61122c612c8d565b5f878060200190518101906112419190615822565b90506112508160200151612cc6565b6020810151516001600160a01b031615611296576040517f8951799200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b03166112d7576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112e030612e39565b80516112eb90612f99565b7ffa89761502e992c8c755fba778ced00f4562485023f656906eb76f5dd65a9fe53360408051808201825284516001600160a01b0316815260208086015190820152905161133a929190615919565b60405180910390a17fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc396505083156113c75784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b5f610e38836113e4335b3386600161265b565b613021565b5f61141b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015260248201859052919091169062fdd58e90604401602060405180830381865afa15801561147f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e389190615753565b5f6114ac61302e565b825f036114e5576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6115a98461151b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b038a81166004830152602482018a9052919091169062fdd58e90604401602060405180830381865afa15801561157f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a39190615753565b9061305c565b905080156116c6577f88e2280ece62e9296d3578b77647db2c11f9fa7e42578e2db5d4262123ffae3e3387878785886040516115ea969594939291906159bd565b60405180910390a17f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663043fa98733883360405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03938416600482015291831660248301529091166044820152606481018890526084810184905260c060a48201525f60c482015260e4015f604051808303815f87803b1580156116af575f80fd5b505af11580156116c1573d5f803e3d5ffd5b505050505b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e36040518060a001604052808c6001600160a01b031681526020018b81526020018a81526020018781526020018981525060405160200161175d9190615a06565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161178a93929190615a51565b5f604051808303815f87803b1580156117a1575f80fd5b505af11580156117b3573d5f803e3d5ffd5b5093945050505050610e0f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b8282826040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610bc193929190615a51565b611824612ac0565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7009042116118d9576001600160a01b0382165f818152600283016020526040908190205490517f81a7897700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610bc1565b6001600160a01b0382165f9081526002820160205260408120557fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd61191c611ec4565b604080516001600160a01b03928316815291851660208301525f9082018190526060820152608001610ebf565b611951612ac0565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700904211611a06576001600160a01b0382165f818152600183016020526040908190205490517ff1b01b5400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610bc1565b6001600160a01b0382165f9081526001820160205260408120557fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af2532695447499161191c611ec4565b5f80611a548361306b565b90505f611a5f61307e565b6001600160a01b0385165f90815260038201602052604081205491925090611a8890849061311b565b5095945050505050565b611a9a612ac0565b611aa35f612f99565b565b5f611aae61302e565b825f03611ae7576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611af5846115a387611a49565b90508015611b47577f3fc1c49e72362e91416388fe7a107b92db924642476e83e701eeeb6256d7249e3386868487604051611b34959493929190615a78565b60405180910390a1611b47853383612bbf565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed60405180608001604052808b6001600160a01b031681526020018a815260200187815260200189815250604051602001611bd89190615aaf565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401611c0593929190615a51565b5f604051808303815f87803b158015611c1c575f80fd5b505af1158015611c2e573d5f803e3d5ffd5b5093945050505050610e3860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b611c67612ac0565b805f03611cab576040517ffd86061b0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610bc1565b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115611d28576001600160a01b0383165f90815260018201602052604090208290555b7fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af25326954474991611d51611ec4565b6001600160a01b038581165f8181526001860160209081526040918290205482519590941685528401919091528201859052606082015260800161101b565b5f8061104884611d9f33611033565b8561266f565b7fdaffad82f53a38a62340f14cdd6fd3b437c5dcda6b32029dac1e661dbce28b2d3382604051611dd6929190615af0565b60405180910390a150565b5f80611df0848585600161265b565b9050805f03611e02575f915050610ab4565b610e0f611e367f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052919091169062fdd58e90604401602060405180830381865afa158015611e9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ebe9190615753565b82612ab4565b5f610a5a6131c9565b5f80611ee087610e33878988600161265b565b9050611ef08187878a88886131f1565b9695505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610d349061576a565b5f33610dc3818585612bbf565b604080515f8152602081019091526060908267ffffffffffffffff811115611f8257611f826150b8565b604051908082528060200260200182016040528015611fb557816020015b6060815260200190600190039081611fa05790505b5091505f5b838110156120365761201130868684818110611fd857611fd8615b51565b9050602002810190611fea9190615b7e565b85604051602001611ffd93929190615bdf565b6040516020818303038152906040526135b7565b83828151811061202357612023615b51565b6020908102919091010152600101611fba565b505092915050565b5f80612051876113e4878988600161265b565b9050611ef08787878488886131f1565b5f610e3883610e33336113db565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00908511156120f1576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101869052602401610bc1565b5f61210888612102338a8a5f61265b565b5f61266f565b905061214c8888838989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061268592505050565b979650505050505050565b5f80612161612604565b90505f6121778761217133610de3565b87612c4e565b9050610e008187898588612685565b5f807fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0061111c565b5f8061104884670de0b6b3a7640000612102565b6121cf8585858585613652565b6121d984846136b5565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080546040805160a0810182526001600160a01b0388811682528781166020830152918101869052606081018590529116906359f89dda9088907f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4890608081016122837fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b151590526040516122979190602001615c3c565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016122c493929190615a51565b5f604051808303815f87803b1580156122db575f80fd5b505af11580156122ed573d5f803e3d5ffd5b50505050505050505050565b835f03612332576040517f8672985d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090505f6040518060a001604052808360020154815260200183600201548152602001878152602001861515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250905084806123cc5750816002015486115b156123e05760028201869055602081018690525b7f7ef5cae78e9bd364afb19bb0f8a881a6d156e35a119e28c0d17524e5079581583387878787604051612417959493929190615ccc565b60405180910390a181546001600160a01b03166359f89dda337f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d053391846040516020016122979190615d38565b61246a612ac0565b6001600160a01b0381166124ac576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b6124b581612f99565b50565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fe5be7d9000000000000000000000000000000000000000000000000000000000148061254a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b8061259657507fffffffff0000000000000000000000000000000000000000000000000000000082167fe1e6b89800000000000000000000000000000000000000000000000000000000145b80610ab457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610ab4565b6125ee612ac0565b6124b581612e39565b610cde8383836001613775565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090612655906001615d7c565b91505090565b5f670de0b6b3a76400005b95945050505050565b5f61267a828461389d565b610e0f84845f6138e1565b61268d61302e565b845f036126c6576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f036126ff576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03841661273f576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f0361277a576040517fe4a471820000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b7f3377bcbed49a0c0005e53931cd8fe7334b5371523e5de784c0d0d3d01089cfea3385878686866040516127b3969594939291906159bd565b60405180910390a16127c885858585856138f6565b6127d28484613951565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517f6d5b3f780000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690636d5b3f78906128429033908890879089908890600401615a78565b5f604051808303815f87803b158015612859575f80fd5b505af115801561286b573d5f803e3d5ffd5b5050505061287c858585858561399e565b6128a560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b804710156128ef576040517fcf47918100000000000000000000000000000000000000000000000000000000815247600482015260248101829052604401610bc1565b612908828260405180602001604052805f815250613a4a565b15612911575050565b3d156129235761291f613a5f565b5050565b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8061295f61307e565b60028101549091505f0361297557612655613a6a565b5f6129845f1960036001613b0b565b90505f5b5f198214610e38575f8360020183815481106129a6576129a6615b51565b905f5260205f2090600502015f0154905060028103612a83575f612a738560020185815481106129d8576129d8615b51565b905f5260205f20906005020160040180546129f29061576a565b80601f0160208091040260200160405190810160405280929190818152602001828054612a1e9061576a565b8015612a695780601f10612a4057610100808354040283529160200191612a69565b820191905f5260205f20905b815481529060010190602001808311612a4c57829003601f168201915b5050505050613c06565b9050612a7f8382613c1b565b9250505b5f838152600485016020526040902054612a9d9083615d7c565b9150612aac8360036001613b0b565b925050612988565b5f610e38838383613c9f565b33612ac9611ec4565b6001600160a01b031614611aa3576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610bc1565b6001600160a01b038381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220545f19811015612bb95781811015612bab576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610bc1565b612bb984848484035f613775565b50505050565b6001600160a01b038316612c01576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b6001600160a01b038216612c43576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b610cde838383613cb4565b5f612c59828461389d565b610e0f84846001613c9f565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610ab4565b425f03611aa3576040517f789a532d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cce613d07565b612ce081602001518260400151613d0f565b80517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0393841617825560608401517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601805490921693169283179055604080517f481c6a75000000000000000000000000000000000000000000000000000000008152905191925f92909163481c6a759160048083019260209291908290030181865afa158015612dc0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612de49190615d8f565b90506001600160a01b0381163014610cde576040517f7935475e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0382166024820152604401610bc1565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f59f89dda0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015612eb4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed89190615daa565b612f0e576040517ffd12061600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811782556040805133815260208101929092527fa8c713fe8fb360697fc0daab836d85208a605d485fbc265aea0f773fc6cdd71a9101610ebf565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f610e38838360016138e1565b613036613d21565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f828218828410028218610e38565b5f8061307683613d7c565b549392505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006130cc60017f2f8f8ecf1b7a1a3ceda8d15a9a2247a2377b3434535a87f1728021c13fec2e71615b3e565b6040516020016130de91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101201692915050565b5f80828161312761307e565b9050855f6131388760036001613b0b565b90505b5f1981146131ba5792508281158015906131785750600283600201828154811061316757613167615b51565b905f5260205f2090600502015f0154145b156131a6575f6131968460020183815481106129d8576129d8615b51565b90506131a28382613c1b565b9250505b6131b38160036001613b0b565b905061313b565b509350909150505b9250929050565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930061111c565b6131f961302e565b855f03613232576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f0361326b576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385166132ab576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166132eb576040517f9905827b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f03613327576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101839052602401610bc1565b7f2845b9458bcc357e1abfe8de7f6832dfe7220596a053496b33d0deb6577d8d2a338686898787876040516133629796959493929190615dc5565b60405180910390a16001600160a01b03841633146134d157613385843385612b0b565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663e985e9c585336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015613421573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134459190615daa565b6134d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610bc1565b6134db8484613e25565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517fc2530e390000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c2530e399061354b9033908890879089908890600401615a78565b5f604051808303815f87803b158015613562575f80fd5b505af1158015613574573d5f803e3d5ffd5b50505050613586868686868686613e72565b6135af60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b60605f6135c48484613f7b565b90508080156135e557505f3d11806135e557505f846001600160a01b03163b115b156135fa576135f2613f8e565b915050610ab4565b801561363d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610bc1565b3d156129235761364b613a5f565b5092915050565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031633146128a5576040517f8813aac300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700805442118015906136fe57506001600160a01b0383165f908152600182016020526040902054155b801561372157506001600160a01b0382165f908152600282016020526040902054155b15610cde5780546040517f79d7155100000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b03808516602483015283166044820152606401610bc1565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b0385166137d8576040517fe602df050000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b6001600160a01b03841661381a576040517f94280d620000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156128a557836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161388e91815260200190565b60405180910390a35050505050565b8181101561291f576040517fa3e322340000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610bc1565b5f610e0f8484670de0b6b3a764000085613fa7565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01547fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00906139449084613fe9565b6001909101555050505050565b6001600160a01b038216613993576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b61291f5f8383613cb4565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216040518060c00160405280613a073390565b6001600160a01b031681526020018a6001600160a01b031681526020018881526020018b8152602001898152602001878152506040516020016122979190615e6a565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00613ab860017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615b3e565b604051602001613aca91815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529190528051602090910120166002015492915050565b5f600783168103613b48576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613b5161307e565b60028101549091505f03613b69575f19915050610e38565b5f5f198614613b9c57816002018681548110613b8757613b87615b51565b905f5260205f20906005020160030154613b9f565b81545b90506002846002811115613bb557613bb5615e7c565b03613bd757613bce82613bc88484613ff8565b87614073565b92505050610e38565b6001846002811115613beb57613beb615e7c565b03613bfb57613bce8282876140cb565b611ef0828287614073565b5f81806020019051810190610ab49190615753565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613c79576040517fbf463fe900000000000000000000000000000000000000000000000000000000815260048101849052602401610bc1565b5f613c96613c90613c8a865f614138565b85614192565b5f6141f4565b50949350505050565b5f610e0f84670de0b6b3a76400008585613fa7565b613cbc614235565b613cc58361429b565b613cce8261429b565b613cd9838383614388565b6001600160a01b038316613cf057610cde816144e8565b6001600160a01b038216610cde57610cde8161452b565b611aa3614565565b613d17614565565b61291f82826145a3565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203611aa3576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00613dca60017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615b3e565b604051602001613ddc91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f96875292909216905290922092915050565b6001600160a01b038216613e67576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b61291f825f83613cb4565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696040518060c001604052808a6001600160a01b031681526020018b6001600160a01b031681526020018881526020018c815260200189815260200187815250604051602001613f189190615e6a565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401613f4593929190615a51565b5f604051808303815f87803b158015613f5c575f80fd5b505af1158015613f6e573d5f803e3d5ffd5b5050505050505050505050565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b5f613fd4613fb483614606565b8015613fcf57505f8480613fca57613fca615ea9565b868809115b151590565b613fdf868686614632565b6126669190615d7c565b5f828218828411028218610e38565b5f5b5f19821415801561403c57504283600201838154811061401c5761401c615b51565b5f91825260209091206001600590920201015467ffffffffffffffff1611155b1561406d5782600201828154811061405657614056615b51565b905f5260205f209060050201600301549150613ffa565b50919050565b5f5b5f1983146140c1575f84600201848154811061409357614093615b51565b905f5260205f209060050201905082815f0154165f146140b65783915050610e38565b600301549250614075565b505f199392505050565b5f5b5f1983146140c1575f8460020184815481106140eb576140eb615b51565b5f918252602090912060059091020160018101549091504267ffffffffffffffff909116111561411b57506140c1565b805483161561412d5783915050610e38565b6003015492506140cd565b5f805f61414585856146e2565b915091508061418a576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610bc1565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806141d7868686866147e8565b915091505f6141e68383614907565b9a9950505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d614228828287614965565b9350935050509250929050565b5f61423e61307e565b60028101549091505f0361424f5750565b5f614264826005015460026001176001613b0b565b90505f195b5f1982146142875750806142808160036001613b0b565b9150614269565b5f198114610cde5760058301819055505050565b6001600160a01b0381166142ac5750565b5f6142b561307e565b6001600160a01b0383165f9081526003820160205260408120549192506142db8461306b565b90505f806142e9838561311b565b915091508381036142fc57505050505050565b6001600160a01b0386165f9081526003860160205260409020819055818314614329576143298683614b50565b6040805185815260208101839052908101849052606081018390526001600160a01b038716907f36a2eb39b73568d38e98721588b15b309c9380e1b1ab575c2c3d71d5148ccb4a9060800160405180910390a26135af84848385614b62565b61439283836136b5565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a6040518060800160405280896001600160a01b03168152602001886001600160a01b031681526020018781526020016144427fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b151590526040805182516001600160a01b03908116602080840191909152840151168183015290820151606080830191909152909101511515608082015260a0016040516020818303038152906040526040518463ffffffff1660e01b81526004016144b093929190615a51565b5f604051808303815f87803b1580156144c7575f80fd5b505af11580156144d9573d5f803e3d5ffd5b50505050612bb9848484614bbf565b5f6144f161307e565b60028101549091501561291f5760058101545f90815260048201602052604081208054849290614522908490615d7c565b90915550505050565b5f61453461307e565b60028101549091501561291f5760058101545f90815260048201602052604081208054849290614522908490615b3e565b61456d614bca565b611aa3576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6145ab614565565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036145f78482615f1a565b5060048101612bb98382615f1a565b5f600282600381111561461b5761461b615e7c565b6146259190615ff4565b60ff166001149050919050565b5f805f61463f8686614be8565b91509150815f036146635783818161465957614659615ea9565b0492505050610e38565b81841161467a5761467a6003851502601118614c04565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f601b83900b8314838382614746577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561472657620186a0860595506005850194505b8586601b0b1461474157600a86059550846001019450614726565b61475c565b855f0361475c57505f9250600191506131c29050565b848560030b146147b8575f85121561477c57505f92508291506131c29050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610bc1565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f8085158415178015614800575f92505f91506148fd565b61480a8487616015565b91505f61481688614c15565b90505f61482287614c15565b90505f61482f8383614be8565b5090505f6f0785ee10d5da46d900f436a000000000821115614864576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561488557670de0b6b3a7640000820491506012015b633b9aca0082111561489e57633b9aca00820491506009015b6127108211156148b357612710820491506004015b81156148c757600a820491506001016148b3565b6148d18187616015565b95506148f38b8a6148ed87876148e887600a616114565b614c76565b89614d51565b9097509550505050505b5094509492505050565b5f805f61491485856146e2565b9150915080158015614924575081155b1561418a576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610bc1565b5f805f8512156149ab576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610bc1565b845f036149bd57505f90506001614b48565b8460ff8416850185811215614a08576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610bc1565b5f805f831215614a72577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215614a49575f809550955050505050614b48565b825f03600a0a9150818481614a6057614a60615ea9565b0495505084029091149150614b489050565b5f831315614b3d57604d831315614ac8576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610bc1565b82600a0a9150815f1981614ade57614ade615ea9565b04841115614b2b576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610bc1565b5091909102925060019150614b489050565b509193506001925050505b935093915050565b5f614b5a83613d7c565b919091555050565b5f614b6b61307e565b905083816004015f8781526020019081526020015f205f828254614b8f9190615b3e565b90915550505f83815260048201602052604081208054849290614bb3908490615d7c565b90915550505050505050565b610cde838383614e5d565b5f614bd3612c65565b5468010000000000000000900460ff16919050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f80821215614c72577f80000000000000000000000000000000000000000000000000000000000000008203614c6c57507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f614c838686614be8565b91509150815f03614c9d5783818161465957614659615ea9565b838210614ce7576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610bc1565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614e1b577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614e0857614db07f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001615d7c565b8403614de057507f8000000000000000000000000000000000000000000000000000000000000000905081614e54565b614deb600a8561611f565b614df490616132565b614dff846001616015565b91509150614e54565b614e1184616132565b8391509150614e54565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614e4e57614df4600a8561611f565b50829050815b94509492505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038416614eaa5781816002015f828254614e9f9190615d7c565b90915550614f339050565b6001600160a01b0384165f9081526020829052604090205482811015614f15576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810182905260448101849052606401610bc1565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316614f51576002810180548390039055614f6f565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051614fb491815260200190565b60405180910390a350505050565b5f60208284031215614fd2575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e38575f80fd5b6001600160a01b03811681146124b5575f80fd5b5f60208284031215615025575f80fd5b8135610e3881615001565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610e386020830184615030565b5f806040838503121561509f575f80fd5b82356150aa81615001565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715615108576151086150b8565b60405290565b6040516080810167ffffffffffffffff81118282101715615108576151086150b8565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715615178576151786150b8565b604052919050565b5f67ffffffffffffffff821115615199576151996150b8565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f8301126151d4575f80fd5b81356151e76151e282615180565b615131565b8181528460208386010111156151fb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f806080858703121561522a575f80fd5b84359350602085013561523c81615001565b925060408501359150606085013567ffffffffffffffff81111561525e575f80fd5b61526a878288016151c5565b91505092959194509250565b5f8060408385031215615287575f80fd5b50508035926020909101359150565b5f602082840312156152a6575f80fd5b5035919050565b5f805f606084860312156152bf575f80fd5b83356152ca81615001565b925060208401356152da81615001565b929592945050506040919091013590565b5f602082840312156152fb575f80fd5b813567ffffffffffffffff811115615311575f80fd5b610e0f848285016151c5565b5f805f8060808587031215615330575f80fd5b843561533b81615001565b93506020850135925060408501359150606085013567ffffffffffffffff81111561525e575f80fd5b5f805f60608486031215615376575f80fd5b833561538181615001565b925060208401359150604084013567ffffffffffffffff8111156153a3575f80fd5b6153af868287016151c5565b9150509250925092565b5f805f805f60a086880312156153cd575f80fd5b8535945060208601356153df81615001565b935060408601356153ef81615001565b925060608601359150608086013567ffffffffffffffff811115615411575f80fd5b61541d888289016151c5565b9150509295509295909350565b5f806020838503121561543b575f80fd5b823567ffffffffffffffff80821115615452575f80fd5b818501915085601f830112615465575f80fd5b813581811115615473575f80fd5b8660208260051b8501011115615487575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b8281101561550c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526154fa858351615030565b945092850192908501906001016154c0565b5092979650505050505050565b5f8083601f840112615529575f80fd5b50813567ffffffffffffffff811115615540575f80fd5b6020830191508360208285010111156131c2575f80fd5b5f805f805f6080868803121561556b575f80fd5b85359450602086013561557d81615001565b935060408601359250606086013567ffffffffffffffff81111561559f575f80fd5b6155ab88828901615519565b969995985093965092949392505050565b5f80604083850312156155cd575f80fd5b82356155d881615001565b915060208301356155e881615001565b809150509250929050565b5f82601f830112615602575f80fd5b8135602067ffffffffffffffff82111561561e5761561e6150b8565b8160051b61562d828201615131565b9283528481018201928281019087851115615646575f80fd5b83870192505b8483101561214c5782358252918301919083019061564c565b5f805f805f60a08688031215615679575f80fd5b853561568481615001565b9450602086013561569481615001565b935060408601356156a481615001565b9250606086013567ffffffffffffffff808211156156c0575f80fd5b6156cc89838a016155f3565b935060808801359150808211156156e1575f80fd5b5061541d888289016155f3565b80151581146124b5575f80fd5b5f805f806060858703121561570e575f80fd5b843593506020850135615720816156ee565b9250604085013567ffffffffffffffff81111561573b575f80fd5b61574787828801615519565b95989497509550505050565b5f60208284031215615763575f80fd5b5051919050565b600181811c9082168061577e57607f821691505b60208210810361406d577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f602082840312156157c5575f80fd5b815160ff81168114610e38575f80fd5b5f82601f8301126157e4575f80fd5b81516157f26151e282615180565b818152846020838601011115615806575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215615832575f80fd5b815167ffffffffffffffff80821115615849575f80fd5b908301906040828603121561585c575f80fd5b6158646150e5565b825161586f81615001565b8152602083015182811115615882575f80fd5b929092019160808387031215615896575f80fd5b61589e61510e565b83516158a981615001565b81526020840151838111156158bc575f80fd5b6158c8888287016157d5565b6020830152506040840151838111156158df575f80fd5b6158eb888287016157d5565b6040830152506060840151935061590184615001565b60608101939093526020810192909252509392505050565b5f6001600160a01b038085168352604060208401528084511660408401526020840151604060608501528181511660808501526020810151608060a0860152615966610100860182615030565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808683030160c08701526159a18282615030565b9150508260608301511660e08601528093505050509392505050565b5f6001600160a01b03808916835280881660208401525085604083015284606083015283608083015260c060a08301526159fa60c0830184615030565b98975050505050505050565b602081526001600160a01b0382511660208201526020820151604082015260408201516060820152606082015160808201525f608083015160a080840152610e0f60c0840182615030565b6001600160a01b0384168152826020820152606060408201525f6126666060830184615030565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261214c60a0830184615030565b602081526001600160a01b03825116602082015260208201516040820152604082015160608201525f6060830151608080840152610e0f60a0840182615030565b6001600160a01b0383168152604060208201525f610e0f6040830184615030565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610ab457610ab4615b11565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615bb1575f80fd5b83018035915067ffffffffffffffff821115615bcb575f80fd5b6020019150368190038213156131c2575f80fd5b828482375f8382015f815283518060208601835e5f910190815295945050505050565b5f815180845260208085019450602084015f5b83811015615c3157815187529582019590820190600101615c15565b509495945050505050565b602081525f6001600160a01b0380845116602084015280602085015116604084015250604083015160a06060840152615c7860c0840182615c02565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016080850152615cb38282615c02565b9150506080840151151560a08401528091505092915050565b6001600160a01b0386168152846020820152831515604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101949350505050565b602081528151602082015260208201516040820152604082015160608201526060820151151560808201525f608083015160a080840152610e0f60c0840182615030565b80820180821115610ab457610ab4615b11565b5f60208284031215615d9f575f80fd5b8151610e3881615001565b5f60208284031215615dba575f80fd5b8151610e38816156ee565b5f6001600160a01b03808a16835280891660208401528088166040840152508560608301528460808301528360a083015260e060c0830152615e0a60e0830184615030565b9998505050505050505050565b5f6001600160a01b038083511684528060208401511660208501525060408201516040840152606082015160608401526080820151608084015260a082015160c060a0850152610e0f60c0850182615030565b602081525f610e386020830184615e17565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b601f821115610cde57805f5260205f20601f840160051c81016020851015615efb5750805b601f840160051c820191505b818110156128a5575f8155600101615f07565b815167ffffffffffffffff811115615f3457615f346150b8565b615f4881615f42845461576a565b84615ed6565b602080601f831160018114615f7b575f8415615f645750858301515b5f19600386901b1c1916600185901b1785556135af565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615fc757888601518255948401946001909101908401615fa8565b5085821015615fe457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60ff83168061600657616006615ea9565b8060ff84160691505092915050565b8082018281125f83128015821682158216171561203657612036615b11565b600181815b8085111561606e57815f190482111561605457616054615b11565b8085161561606157918102915b93841c9390800290616039565b509250929050565b5f8261608457506001610ab4565b8161609057505f610ab4565b81600181146160a657600281146160b0576160cc565b6001915050610ab4565b60ff8411156160c1576160c1615b11565b50506001821b610ab4565b5060208310610133831016604e8410600b84101617156160ef575081810a610ab4565b6160f98383616034565b805f190482111561610c5761610c615b11565b029392505050565b5f610e388383616076565b5f8261612d5761612d615ea9565b500490565b5f7f80000000000000000000000000000000000000000000000000000000000000008203614c6c57614c6c615b1156"; + hex"608060405234801561000f575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561003c610041565b6100f3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100915760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100f05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615ffa806101005f395ff3fe608060405260043610610337575f3560e01c8063715018a6116101af578063bbec4d06116100eb578063dd62ed3e11610094578063e70689f51161006e578063e70689f5146109ab578063f2fde38b146109ca578063f5647943146109e9578063f5d214f514610a1e5761033e565b8063dd62ed3e146108ed578063e1e6b89814610950578063e5be7d901461098c5761033e565b8063c77b66c2116100c5578063c77b66c2146108b3578063d09edf31146108c6578063db2088f4146108da5761033e565b8063bbec4d0614610875578063c54cafee14610894578063c63d75b6146105635761033e565b80638da5cb5b11610158578063a9059cbb11610132578063a9059cbb146107b8578063ac9650d8146107d7578063ae57de0c14610803578063ae98b39f146108225761033e565b80638da5cb5b14610771578063921a4c421461078557806395d89b41146107a45761033e565b80637a7af70d116101895780637a7af70d1461072057806381c3fcb91461073357806385b68756146107525761033e565b8063715018a6146106ce578063770afee1146106e2578063786cd916146107015761033e565b8063276b11401161027e5780634abe413711610227578063633ac71711610201578063633ac7171461061e5780636ba235211461063d5780636c876b941461069057806370a08231146106af5761033e565b80634abe4137146105c157806356db02e8146105e057806359f89dda146105ff5761033e565b8063402d267d11610258578063402d267d14610563578063439fab9114610583578063488bd7b0146105a25761033e565b8063276b1140146104fe578063313ce5671461051157806338d52e0f146105375761033e565b806318160ddd116102e05780631f6759d3116102ba5780631f6759d31461048d57806323b872dd146104c05780632755c6c7146104df5761033e565b806318160ddd1461043b578063181e7b3b1461044f5780631e4344a11461046e5761033e565b806306fdde031161031157806306fdde03146103e8578063095ea7b3146104095780631423feba146104285761033e565b806301e1d1141461037357806301ffc9a71461039a578063058a628f146103c95761033e565b3661033e57005b7351f78b77edffdb62b8aeb753066c318a46d05d74365f80375f80365f845af43d5f803e80801561036d573d5ff35b3d5ffd5b005b34801561037e575f80fd5b50610387610a51565b6040519081526020015b60405180910390f35b3480156103a5575f80fd5b506103b96103b4366004614f0e565b610a5f565b6040519015158152602001610391565b3480156103d4575f80fd5b506103716103e3366004614f61565b610aba565b3480156103f3575f80fd5b506103fc610ce3565b6040516103919190614faa565b348015610414575f80fd5b506103b9610423366004614fbc565b610db6565b610387610436366004615109565b610dcd565b348015610446575f80fd5b50610387610e17565b34801561045a575f80fd5b50610387610469366004615168565b610e20565b348015610479575f80fd5b50610371610488366004615188565b610e3f565b348015610498575f80fd5b507f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70054610387565b3480156104cb575f80fd5b506103b96104da36600461519f565b610ecb565b3480156104ea575f80fd5b506103716104f9366004614fbc565b610eee565b61038761050c366004615168565b611028565b34801561051c575f80fd5b50610525611053565b60405160ff9091168152602001610391565b348015610542575f80fd5b5061054b6110f8565b6040516001600160a01b039091168152602001610391565b34801561056e575f80fd5b5061038761057d366004614f61565b505f1990565b34801561058e575f80fd5b5061038761059d3660046151dd565b61112c565b3480156105ad575f80fd5b506103876105bc366004615168565b6113d1565b3480156105cc575f80fd5b506103876105db366004614fbc565b6113e9565b3480156105eb575f80fd5b506103876105fa36600461520f565b6114a3565b34801561060a575f80fd5b50610371610619366004615256565b6117e4565b348015610629575f80fd5b50610371610638366004614f61565b61181c565b348015610648575f80fd5b50610387610657366004614f61565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be701602052604090205490565b34801561069b575f80fd5b506103716106aa366004614f61565b611949565b3480156106ba575f80fd5b506103876106c9366004614f61565b611a49565b3480156106d9575f80fd5b50610371611a92565b3480156106ed575f80fd5b506103876106fc366004615256565b611aa5565b34801561070c575f80fd5b5061037161071b366004614fbc565b611c5f565b61038761072e366004615168565b611d90565b34801561073e575f80fd5b5061037161074d3660046151dd565b611da5565b34801561075d575f80fd5b5061038761076c366004614fbc565b611de1565b34801561077c575f80fd5b5061054b611ec4565b348015610790575f80fd5b5061038761079f3660046152ab565b611ecd565b3480156107af575f80fd5b506103fc611efa565b3480156107c3575f80fd5b506103b96107d2366004614fbc565b611f4b565b3480156107e2575f80fd5b506107f66107f136600461531c565b611f58565b604051610391919061538b565b34801561080e575f80fd5b5061038761081d3660046152ab565b61203e565b34801561082d575f80fd5b5061038761083c366004614f61565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be702602052604090205490565b348015610880575f80fd5b5061038761088f366004615168565b612061565b34801561089f575f80fd5b506103876108ae366004615449565b61206f565b6103876108c1366004615109565b612157565b3480156108d1575f80fd5b5061054b612186565b6103876108e8366004615168565b6121ae565b3480156108f8575f80fd5b506103876109073660046154ae565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b34801561095b575f80fd5b507f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031661054b565b348015610997575f80fd5b506103716109a6366004615557565b6121c2565b3480156109b6575f80fd5b506103716109c53660046155ed565b6122f9565b3480156109d5575f80fd5b506103716109e4366004614f61565b612462565b3480156109f4575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd025442116103b9565b348015610a29575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0154610387565b5f610a5a610e17565b905090565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda000000000000000000000000000000000000000000000000000000001480610ab45750610ab4826124b8565b92915050565b6040517f248a9ca30000000000000000000000000000000000000000000000000000000081527ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f8960048201525f906001600160a01b0383169063248a9ca390602401602060405180830381865afa158015610b37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b5b9190615645565b905080610bca576040517f76728ed90000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201527ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f8960248201526044015b60405180910390fd5b6040517f248a9ca30000000000000000000000000000000000000000000000000000000081527f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e760048201525f906001600160a01b0384169063248a9ca390602401602060405180830381865afa158015610c47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6b9190615645565b905080610cd5576040517f76728ed90000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201527f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e76024820152604401610bc1565b610cde836125e6565b505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610d349061565c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d609061565c565b8015610dab5780601f10610d8257610100808354040283529160200191610dab565b820191905f5260205f20905b815481529060010190602001808311610d8e57829003601f168201915b505050505091505090565b5f33610dc38185856125f7565b5060019392505050565b5f80610dd7612604565b90505f610df187610deb335b89865f61265b565b8761266f565b9050610e008787838588612685565b610e0b335b476128ac565b9150505b949350505050565b5f610a5a612955565b5f610e3883670de0b6b3a7640000612ab4565b612ab4565b9392505050565b610e47612ac0565b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7008054821115610e75578181555b7fff9fd4facd8bd30d905cc7ffbd03e8829a414df4c6554d155d132c3377868a42610e9e611ec4565b8254604080516001600160a01b039093168352602083018690528201526060015b60405180910390a15050565b5f33610ed8858285612b0b565b610ee3858585612bbf565b506001949350505050565b610ef6612ac0565b805f03610f3a576040517f5a6084530000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610bc1565b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115610fb7576001600160a01b0383165f90815260028201602052604090208290555b7fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd610fe0611ec4565b6001600160a01b038581165f818152600286016020908152604091829020548251959094168552840191909152820185905260608201526080015b60405180910390a1505050565b5f8061104884611042335b3361103c612604565b5f61265b565b85612c4e565b9050610e3833610e05565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080545f91906001600160a01b0316803b806110905760126110f0565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f091906156a7565b935050505090565b5f807f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326005b546001600160a01b031692915050565b5f80611136612c65565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156111625750825b90505f8267ffffffffffffffff16600114801561117e5750303b155b90508115801561118c575080155b156111c3576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156112245784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61122c612c8d565b5f878060200190518101906112419190615714565b90506112508160200151612cc6565b6020810151516001600160a01b031615611296576040517f8951799200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b03166112d7576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112e030612e39565b80516112eb90612f99565b7ffa89761502e992c8c755fba778ced00f4562485023f656906eb76f5dd65a9fe53360408051808201825284516001600160a01b0316815260208086015190820152905161133a92919061580b565b60405180910390a17fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc396505083156113c75784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b5f610e38836113e4335b3386600161265b565b613021565b5f61141b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015260248201859052919091169062fdd58e90604401602060405180830381865afa15801561147f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e389190615645565b5f6114ac61302e565b825f036114e5576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6115a98461151b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b038a81166004830152602482018a9052919091169062fdd58e90604401602060405180830381865afa15801561157f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a39190615645565b9061305c565b905080156116c6577f88e2280ece62e9296d3578b77647db2c11f9fa7e42578e2db5d4262123ffae3e3387878785886040516115ea969594939291906158af565b60405180910390a17f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663043fa98733883360405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03938416600482015291831660248301529091166044820152606481018890526084810184905260c060a48201525f60c482015260e4015f604051808303815f87803b1580156116af575f80fd5b505af11580156116c1573d5f803e3d5ffd5b505050505b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e36040518060a001604052808c6001600160a01b031681526020018b81526020018a81526020018781526020018981525060405160200161175d91906158f8565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161178a93929190615943565b5f604051808303815f87803b1580156117a1575f80fd5b505af11580156117b3573d5f803e3d5ffd5b5093945050505050610e0f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b8282826040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610bc193929190615943565b611824612ac0565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7009042116118d9576001600160a01b0382165f818152600283016020526040908190205490517f81a7897700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610bc1565b6001600160a01b0382165f9081526002820160205260408120557fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd61191c611ec4565b604080516001600160a01b03928316815291851660208301525f9082018190526060820152608001610ebf565b611951612ac0565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700904211611a06576001600160a01b0382165f818152600183016020526040908190205490517ff1b01b5400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610bc1565b6001600160a01b0382165f9081526001820160205260408120557fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af2532695447499161191c611ec4565b5f80611a548361306b565b90505f611a5f61307e565b6001600160a01b0385165f90815260038201602052604081205491925090611a889084906130df565b5095945050505050565b611a9a612ac0565b611aa35f612f99565b565b5f611aae61302e565b825f03611ae7576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611af5846115a387611a49565b90508015611b47577f3fc1c49e72362e91416388fe7a107b92db924642476e83e701eeeb6256d7249e3386868487604051611b3495949392919061596a565b60405180910390a1611b47853383612bbf565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed60405180608001604052808b6001600160a01b031681526020018a815260200187815260200189815250604051602001611bd891906159a1565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401611c0593929190615943565b5f604051808303815f87803b158015611c1c575f80fd5b505af1158015611c2e573d5f803e3d5ffd5b5093945050505050610e3860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b611c67612ac0565b805f03611cab576040517ffd86061b0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610bc1565b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115611d28576001600160a01b0383165f90815260018201602052604090208290555b7fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af25326954474991611d51611ec4565b6001600160a01b038581165f8181526001860160209081526040918290205482519590941685528401919091528201859052606082015260800161101b565b5f8061104884611d9f33611033565b8561266f565b7fdaffad82f53a38a62340f14cdd6fd3b437c5dcda6b32029dac1e661dbce28b2d3382604051611dd69291906159e2565b60405180910390a150565b5f80611df0848585600161265b565b9050805f03611e02575f915050610ab4565b610e0f611e367f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052919091169062fdd58e90604401602060405180830381865afa158015611e9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ebe9190615645565b82612ab4565b5f610a5a61318d565b5f80611ee087610e33878988600161265b565b9050611ef08187878a88886131b5565b9695505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610d349061565c565b5f33610dc3818585612bbf565b604080515f8152602081019091526060908267ffffffffffffffff811115611f8257611f82614fe6565b604051908082528060200260200182016040528015611fb557816020015b6060815260200190600190039081611fa05790505b5091505f5b838110156120365761201130868684818110611fd857611fd8615a43565b9050602002810190611fea9190615a70565b85604051602001611ffd93929190615ad1565b60405160208183030381529060405261357b565b83828151811061202357612023615a43565b6020908102919091010152600101611fba565b505092915050565b5f80612051876113e4878988600161265b565b9050611ef08787878488886131b5565b5f610e3883610e33336113db565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00908511156120f1576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101869052602401610bc1565b5f61210888612102338a8a5f61265b565b5f61266f565b905061214c8888838989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061268592505050565b979650505050505050565b5f80612161612604565b90505f6121778761217133610de3565b87612c4e565b9050610e008187898588612685565b5f807fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0061111c565b5f8061104884670de0b6b3a7640000612102565b6121cf8585858585613616565b6121d98484613679565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080546040805160a0810182526001600160a01b0388811682528781166020830152918101869052606081018590529116906359f89dda9088907f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4890608081016122837fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b151590526040516122979190602001615b2e565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016122c493929190615943565b5f604051808303815f87803b1580156122db575f80fd5b505af11580156122ed573d5f803e3d5ffd5b50505050505050505050565b835f03612332576040517f8672985d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090505f6040518060a001604052808360020154815260200183600201548152602001878152602001861515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250905084806123cc5750816002015486115b156123e05760028201869055602081018690525b7f7ef5cae78e9bd364afb19bb0f8a881a6d156e35a119e28c0d17524e5079581583387878787604051612417959493929190615ba0565b60405180910390a181546001600160a01b03166359f89dda337f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d053391846040516020016122979190615bee565b61246a612ac0565b6001600160a01b0381166124ac576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b6124b581612f99565b50565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fe5be7d9000000000000000000000000000000000000000000000000000000000148061254a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b8061259657507fffffffff0000000000000000000000000000000000000000000000000000000082167fe1e6b89800000000000000000000000000000000000000000000000000000000145b80610ab457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610ab4565b6125ee612ac0565b6124b581612e39565b610cde8383836001613739565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090612655906001615c32565b91505090565b5f670de0b6b3a76400005b95945050505050565b5f61267a8284613861565b610e0f84845f6138a5565b61268d61302e565b845f036126c6576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f036126ff576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03841661273f576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f0361277a576040517fe4a471820000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b7f3377bcbed49a0c0005e53931cd8fe7334b5371523e5de784c0d0d3d01089cfea3385878686866040516127b3969594939291906158af565b60405180910390a16127c885858585856138ba565b6127d28484613915565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517f6d5b3f780000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690636d5b3f7890612842903390889087908990889060040161596a565b5f604051808303815f87803b158015612859575f80fd5b505af115801561286b573d5f803e3d5ffd5b5050505061287c8585858585613962565b6128a560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b804710156128ef576040517fcf47918100000000000000000000000000000000000000000000000000000000815247600482015260248101829052604401610bc1565b612908828260405180602001604052805f815250613a0e565b15612911575050565b3d156129235761291f613a23565b5050565b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8061295f61307e565b60028101549091505f0361297557612655613a2e565b5f6129845f1960036001613a93565b90505f5b5f198214610e38575f8360020183815481106129a6576129a6615a43565b905f5260205f2090600502015f0154905060028103612a83575f612a738560020185815481106129d8576129d8615a43565b905f5260205f20906005020160040180546129f29061565c565b80601f0160208091040260200160405190810160405280929190818152602001828054612a1e9061565c565b8015612a695780601f10612a4057610100808354040283529160200191612a69565b820191905f5260205f20905b815481529060010190602001808311612a4c57829003601f168201915b5050505050613b8e565b9050612a7f8382613ba3565b9250505b5f838152600485016020526040902054612a9d9083615c32565b9150612aac8360036001613a93565b925050612988565b5f610e38838383613c27565b33612ac9611ec4565b6001600160a01b031614611aa3576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610bc1565b6001600160a01b038381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220545f19811015612bb95781811015612bab576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610bc1565b612bb984848484035f613739565b50505050565b6001600160a01b038316612c01576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b6001600160a01b038216612c43576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b610cde838383613c3c565b5f612c598284613861565b610e0f84846001613c27565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610ab4565b425f03611aa3576040517f789a532d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cce613c8f565b612ce081602001518260400151613c97565b80517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0393841617825560608401517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601805490921693169283179055604080517f481c6a75000000000000000000000000000000000000000000000000000000008152905191925f92909163481c6a759160048083019260209291908290030181865afa158015612dc0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612de49190615c45565b90506001600160a01b0381163014610cde576040517f7935475e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0382166024820152604401610bc1565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f59f89dda0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015612eb4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed89190615c60565b612f0e576040517ffd12061600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811782556040805133815260208101929092527fa8c713fe8fb360697fc0daab836d85208a605d485fbc265aea0f773fc6cdd71a9101610ebf565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f610e38838360016138a5565b613036613ca9565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f828218828410028218610e38565b5f8061307683613d04565b549392505050565b5f8060ff196130ae60017f2f8f8ecf1b7a1a3ceda8d15a9a2247a2377b3434535a87f1728021c13fec2e71615a30565b6040516020016130c091815260200190565b60408051601f1981840301815291905280516020909101201692915050565b5f8082816130eb61307e565b9050855f6130fc8760036001613a93565b90505b5f19811461317e57925082811580159061313c5750600283600201828154811061312b5761312b615a43565b905f5260205f2090600502015f0154145b1561316a575f61315a8460020183815481106129d8576129d8615a43565b90506131668382613ba3565b9250505b6131778160036001613a93565b90506130ff565b509350909150505b9250929050565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930061111c565b6131bd61302e565b855f036131f6576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f0361322f576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03851661326f576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166132af576040517f9905827b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f036132eb576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101839052602401610bc1565b7f2845b9458bcc357e1abfe8de7f6832dfe7220596a053496b33d0deb6577d8d2a338686898787876040516133269796959493929190615c7b565b60405180910390a16001600160a01b038416331461349557613349843385612b0b565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663e985e9c585336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156133e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134099190615c60565b613495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610bc1565b61349f8484613d71565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517fc2530e390000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c2530e399061350f903390889087908990889060040161596a565b5f604051808303815f87803b158015613526575f80fd5b505af1158015613538573d5f803e3d5ffd5b5050505061354a868686868686613dbe565b61357360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b60605f6135888484613ec7565b90508080156135a957505f3d11806135a957505f846001600160a01b03163b115b156135be576135b6613eda565b915050610ab4565b8015613601576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610bc1565b3d156129235761360f613a23565b5092915050565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031633146128a5576040517f8813aac300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700805442118015906136c257506001600160a01b0383165f908152600182016020526040902054155b80156136e557506001600160a01b0382165f908152600282016020526040902054155b15610cde5780546040517f79d7155100000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b03808516602483015283166044820152606401610bc1565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b03851661379c576040517fe602df050000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b6001600160a01b0384166137de576040517f94280d620000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156128a557836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161385291815260200190565b60405180910390a35050505050565b8181101561291f576040517fa3e322340000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610bc1565b5f610e0f8484670de0b6b3a764000085613ef3565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01547fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00906139089084613f35565b6001909101555050505050565b6001600160a01b038216613957576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b61291f5f8383613c3c565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216040518060c001604052806139cb3390565b6001600160a01b031681526020018a6001600160a01b031681526020018881526020018b8152602001898152602001878152506040516020016122979190615d20565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b5f8060ff19613a5e60017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615a30565b604051602001613a7091815260200190565b60408051808303601f190181529190528051602090910120166002015492915050565b5f600783168103613ad0576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613ad961307e565b60028101549091505f03613af1575f19915050610e38565b5f5f198614613b2457816002018681548110613b0f57613b0f615a43565b905f5260205f20906005020160030154613b27565b81545b90506002846002811115613b3d57613b3d615d32565b03613b5f57613b5682613b508484613f44565b87613fbf565b92505050610e38565b6001846002811115613b7357613b73615d32565b03613b8357613b56828287614017565b611ef0828287613fbf565b5f81806020019051810190610ab49190615645565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613c01576040517fbf463fe900000000000000000000000000000000000000000000000000000000815260048101849052602401610bc1565b5f613c1e613c18613c12865f614084565b856140de565b5f614140565b50949350505050565b5f610e0f84670de0b6b3a76400008585613ef3565b613c44614181565b613c4d836141e7565b613c56826141e7565b613c618383836142d4565b6001600160a01b038316613c7857610cde81614434565b6001600160a01b038216610cde57610cde81614477565b611aa36144b1565b613c9f6144b1565b61291f82826144ef565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203611aa3576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060ff19613d3460017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615a30565b604051602001613d4691815260200190565b60408051601f1981840301815291815281516020928301205f96875292909216905290922092915050565b6001600160a01b038216613db3576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b61291f825f83613c3c565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696040518060c001604052808a6001600160a01b031681526020018b6001600160a01b031681526020018881526020018c815260200189815260200187815250604051602001613e649190615d20565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401613e9193929190615943565b5f604051808303815f87803b158015613ea8575f80fd5b505af1158015613eba573d5f803e3d5ffd5b5050505050505050505050565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b5f613f20613f0083614552565b8015613f1b57505f8480613f1657613f16615d5f565b868809115b151590565b613f2b86868661457e565b6126669190615c32565b5f828218828411028218610e38565b5f5b5f198214158015613f88575042836002018381548110613f6857613f68615a43565b5f91825260209091206001600590920201015467ffffffffffffffff1611155b15613fb957826002018281548110613fa257613fa2615a43565b905f5260205f209060050201600301549150613f46565b50919050565b5f5b5f19831461400d575f846002018481548110613fdf57613fdf615a43565b905f5260205f209060050201905082815f0154165f146140025783915050610e38565b600301549250613fc1565b505f199392505050565b5f5b5f19831461400d575f84600201848154811061403757614037615a43565b5f918252602090912060059091020160018101549091504267ffffffffffffffff9091161115614067575061400d565b80548316156140795783915050610e38565b600301549250614019565b5f805f614091858561462e565b91509150806140d6576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610bc1565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061412386868686614734565b915091505f6141328383614853565b9a9950505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6141748282876148b1565b9350935050509250929050565b5f61418a61307e565b60028101549091505f0361419b5750565b5f6141b0826005015460026001176001613a93565b90505f195b5f1982146141d35750806141cc8160036001613a93565b91506141b5565b5f198114610cde5760058301819055505050565b6001600160a01b0381166141f85750565b5f61420161307e565b6001600160a01b0383165f9081526003820160205260408120549192506142278461306b565b90505f8061423583856130df565b9150915083810361424857505050505050565b6001600160a01b0386165f9081526003860160205260409020819055818314614275576142758683614a9c565b6040805185815260208101839052908101849052606081018390526001600160a01b038716907f36a2eb39b73568d38e98721588b15b309c9380e1b1ab575c2c3d71d5148ccb4a9060800160405180910390a261357384848385614aae565b6142de8383613679565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a6040518060800160405280896001600160a01b03168152602001886001600160a01b0316815260200187815260200161438e7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b151590526040805182516001600160a01b03908116602080840191909152840151168183015290820151606080830191909152909101511515608082015260a0016040516020818303038152906040526040518463ffffffff1660e01b81526004016143fc93929190615943565b5f604051808303815f87803b158015614413575f80fd5b505af1158015614425573d5f803e3d5ffd5b50505050612bb9848484614b0b565b5f61443d61307e565b60028101549091501561291f5760058101545f9081526004820160205260408120805484929061446e908490615c32565b90915550505050565b5f61448061307e565b60028101549091501561291f5760058101545f9081526004820160205260408120805484929061446e908490615a30565b6144b9614b16565b611aa3576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6144f76144b1565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036145438482615dd0565b5060048101612bb98382615dd0565b5f600282600381111561456757614567615d32565b6145719190615e8c565b60ff166001149050919050565b5f805f61458b8686614b34565b91509150815f036145af578381816145a5576145a5615d5f565b0492505050610e38565b8184116145c6576145c66003851502601118614b50565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f601b83900b8314838382614692577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561467257620186a0860595506005850194505b8586601b0b1461468d57600a86059550846001019450614672565b6146a8565b855f036146a857505f9250600191506131869050565b848560030b14614704575f8512156146c857505f92508291506131869050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610bc1565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f808515841517801561474c575f92505f9150614849565b6147568487615ead565b91505f61476288614b61565b90505f61476e87614b61565b90505f61477b8383614b34565b5090505f6f0785ee10d5da46d900f436a0000000008211156147b0576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a76400008211156147d157670de0b6b3a7640000820491506012015b633b9aca008211156147ea57633b9aca00820491506009015b6127108211156147ff57612710820491506004015b811561481357600a820491506001016147ff565b61481d8187615ead565b955061483f8b8a614839878761483487600a615fac565b614bc2565b89614c9d565b9097509550505050505b5094509492505050565b5f805f614860858561462e565b9150915080158015614870575081155b156140d6576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610bc1565b5f805f8512156148f7576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610bc1565b845f0361490957505f90506001614a94565b8460ff8416850185811215614954576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610bc1565b5f805f8312156149be577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215614995575f809550955050505050614a94565b825f03600a0a91508184816149ac576149ac615d5f565b0495505084029091149150614a949050565b5f831315614a8957604d831315614a14576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610bc1565b82600a0a9150815f1981614a2a57614a2a615d5f565b04841115614a77576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610bc1565b5091909102925060019150614a949050565b509193506001925050505b935093915050565b5f614aa683613d04565b919091555050565b5f614ab761307e565b905083816004015f8781526020019081526020015f205f828254614adb9190615a30565b90915550505f83815260048201602052604081208054849290614aff908490615c32565b90915550505050505050565b610cde838383614da9565b5f614b1f612c65565b5468010000000000000000900460ff16919050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f80821215614bbe577f80000000000000000000000000000000000000000000000000000000000000008203614bb857507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f614bcf8686614b34565b91509150815f03614be9578381816145a5576145a5615d5f565b838210614c33576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610bc1565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614d67577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614d5457614cfc7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001615c32565b8403614d2c57507f8000000000000000000000000000000000000000000000000000000000000000905081614da0565b614d37600a85615fb7565b614d4090615fca565b614d4b846001615ead565b91509150614da0565b614d5d84615fca565b8391509150614da0565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614d9a57614d40600a85615fb7565b50829050815b94509492505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038416614df65781816002015f828254614deb9190615c32565b90915550614e7f9050565b6001600160a01b0384165f9081526020829052604090205482811015614e61576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810182905260448101849052606401610bc1565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316614e9d576002810180548390039055614ebb565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051614f0091815260200190565b60405180910390a350505050565b5f60208284031215614f1e575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e38575f80fd5b6001600160a01b03811681146124b5575f80fd5b5f60208284031215614f71575f80fd5b8135610e3881614f4d565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610e386020830184614f7c565b5f8060408385031215614fcd575f80fd5b8235614fd881614f4d565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561503657615036614fe6565b60405290565b6040516080810167ffffffffffffffff8111828210171561503657615036614fe6565b604051601f8201601f1916810167ffffffffffffffff8111828210171561508857615088614fe6565b604052919050565b5f67ffffffffffffffff8211156150a9576150a9614fe6565b50601f01601f191660200190565b5f82601f8301126150c6575f80fd5b81356150d96150d482615090565b61505f565b8181528460208386010111156150ed575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f806080858703121561511c575f80fd5b84359350602085013561512e81614f4d565b925060408501359150606085013567ffffffffffffffff811115615150575f80fd5b61515c878288016150b7565b91505092959194509250565b5f8060408385031215615179575f80fd5b50508035926020909101359150565b5f60208284031215615198575f80fd5b5035919050565b5f805f606084860312156151b1575f80fd5b83356151bc81614f4d565b925060208401356151cc81614f4d565b929592945050506040919091013590565b5f602082840312156151ed575f80fd5b813567ffffffffffffffff811115615203575f80fd5b610e0f848285016150b7565b5f805f8060808587031215615222575f80fd5b843561522d81614f4d565b93506020850135925060408501359150606085013567ffffffffffffffff811115615150575f80fd5b5f805f60608486031215615268575f80fd5b833561527381614f4d565b925060208401359150604084013567ffffffffffffffff811115615295575f80fd5b6152a1868287016150b7565b9150509250925092565b5f805f805f60a086880312156152bf575f80fd5b8535945060208601356152d181614f4d565b935060408601356152e181614f4d565b925060608601359150608086013567ffffffffffffffff811115615303575f80fd5b61530f888289016150b7565b9150509295509295909350565b5f806020838503121561532d575f80fd5b823567ffffffffffffffff80821115615344575f80fd5b818501915085601f830112615357575f80fd5b813581811115615365575f80fd5b8660208260051b8501011115615379575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b828110156153fe577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526153ec858351614f7c565b945092850192908501906001016153b2565b5092979650505050505050565b5f8083601f84011261541b575f80fd5b50813567ffffffffffffffff811115615432575f80fd5b602083019150836020828501011115613186575f80fd5b5f805f805f6080868803121561545d575f80fd5b85359450602086013561546f81614f4d565b935060408601359250606086013567ffffffffffffffff811115615491575f80fd5b61549d8882890161540b565b969995985093965092949392505050565b5f80604083850312156154bf575f80fd5b82356154ca81614f4d565b915060208301356154da81614f4d565b809150509250929050565b5f82601f8301126154f4575f80fd5b8135602067ffffffffffffffff82111561551057615510614fe6565b8160051b61551f82820161505f565b9283528481018201928281019087851115615538575f80fd5b83870192505b8483101561214c5782358252918301919083019061553e565b5f805f805f60a0868803121561556b575f80fd5b853561557681614f4d565b9450602086013561558681614f4d565b9350604086013561559681614f4d565b9250606086013567ffffffffffffffff808211156155b2575f80fd5b6155be89838a016154e5565b935060808801359150808211156155d3575f80fd5b5061530f888289016154e5565b80151581146124b5575f80fd5b5f805f8060608587031215615600575f80fd5b843593506020850135615612816155e0565b9250604085013567ffffffffffffffff81111561562d575f80fd5b6156398782880161540b565b95989497509550505050565b5f60208284031215615655575f80fd5b5051919050565b600181811c9082168061567057607f821691505b602082108103613fb9577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f602082840312156156b7575f80fd5b815160ff81168114610e38575f80fd5b5f82601f8301126156d6575f80fd5b81516156e46150d482615090565b8181528460208386010111156156f8575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215615724575f80fd5b815167ffffffffffffffff8082111561573b575f80fd5b908301906040828603121561574e575f80fd5b615756615013565b825161576181614f4d565b8152602083015182811115615774575f80fd5b929092019160808387031215615788575f80fd5b61579061503c565b835161579b81614f4d565b81526020840151838111156157ae575f80fd5b6157ba888287016156c7565b6020830152506040840151838111156157d1575f80fd5b6157dd888287016156c7565b604083015250606084015193506157f384614f4d565b60608101939093526020810192909252509392505050565b5f6001600160a01b038085168352604060208401528084511660408401526020840151604060608501528181511660808501526020810151608060a0860152615858610100860182614f7c565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808683030160c08701526158938282614f7c565b9150508260608301511660e08601528093505050509392505050565b5f6001600160a01b03808916835280881660208401525085604083015284606083015283608083015260c060a08301526158ec60c0830184614f7c565b98975050505050505050565b602081526001600160a01b0382511660208201526020820151604082015260408201516060820152606082015160808201525f608083015160a080840152610e0f60c0840182614f7c565b6001600160a01b0384168152826020820152606060408201525f6126666060830184614f7c565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261214c60a0830184614f7c565b602081526001600160a01b03825116602082015260208201516040820152604082015160608201525f6060830151608080840152610e0f60a0840182614f7c565b6001600160a01b0383168152604060208201525f610e0f6040830184614f7c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610ab457610ab4615a03565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615aa3575f80fd5b83018035915067ffffffffffffffff821115615abd575f80fd5b602001915036819003821315613186575f80fd5b828482375f8382015f815283518060208601835e5f910190815295945050505050565b5f815180845260208085019450602084015f5b83811015615b2357815187529582019590820190600101615b07565b509495945050505050565b602081525f6001600160a01b0380845116602084015280602085015116604084015250604083015160a06060840152615b6a60c0840182615af4565b90506060840151601f19848303016080850152615b878282615af4565b9150506080840151151560a08401528091505092915050565b6001600160a01b0386168152846020820152831515604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f909201601f19160101949350505050565b602081528151602082015260208201516040820152604082015160608201526060820151151560808201525f608083015160a080840152610e0f60c0840182614f7c565b80820180821115610ab457610ab4615a03565b5f60208284031215615c55575f80fd5b8151610e3881614f4d565b5f60208284031215615c70575f80fd5b8151610e38816155e0565b5f6001600160a01b03808a16835280891660208401528088166040840152508560608301528460808301528360a083015260e060c0830152615cc060e0830184614f7c565b9998505050505050505050565b5f6001600160a01b038083511684528060208401511660208501525060408201516040840152606082015160608401526080820151608084015260a082015160c060a0850152610e0f60c0850182614f7c565b602081525f610e386020830184615ccd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b601f821115610cde57805f5260205f20601f840160051c81016020851015615db15750805b601f840160051c820191505b818110156128a5575f8155600101615dbd565b815167ffffffffffffffff811115615dea57615dea614fe6565b615dfe81615df8845461565c565b84615d8c565b602080601f831160018114615e31575f8415615e1a5750858301515b5f19600386901b1c1916600185901b178555613573565b5f85815260208120601f198616915b82811015615e5f57888601518255948401946001909101908401615e40565b5085821015615e7c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60ff831680615e9e57615e9e615d5f565b8060ff84160691505092915050565b8082018281125f83128015821682158216171561203657612036615a03565b600181815b80851115615f0657815f1904821115615eec57615eec615a03565b80851615615ef957918102915b93841c9390800290615ed1565b509250929050565b5f82615f1c57506001610ab4565b81615f2857505f610ab4565b8160018114615f3e5760028114615f4857615f64565b6001915050610ab4565b60ff841115615f5957615f59615a03565b50506001821b610ab4565b5060208310610133831016604e8410600b8410161715615f87575081810a610ab4565b615f918383615ecc565b805f1904821115615fa457615fa4615a03565b029392505050565b5f610e388383615f0e565b5f82615fc557615fc5615d5f565b500490565b5f7f80000000000000000000000000000000000000000000000000000000000000008203614bb857614bb8615a0356"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610337575f3560e01c8063715018a6116101af578063bbec4d06116100eb578063dd62ed3e11610094578063e70689f51161006e578063e70689f5146109ab578063f2fde38b146109ca578063f5647943146109e9578063f5d214f514610a1e5761033e565b8063dd62ed3e146108ed578063e1e6b89814610950578063e5be7d901461098c5761033e565b8063c77b66c2116100c5578063c77b66c2146108b3578063d09edf31146108c6578063db2088f4146108da5761033e565b8063bbec4d0614610875578063c54cafee14610894578063c63d75b6146105635761033e565b80638da5cb5b11610158578063a9059cbb11610132578063a9059cbb146107b8578063ac9650d8146107d7578063ae57de0c14610803578063ae98b39f146108225761033e565b80638da5cb5b14610771578063921a4c421461078557806395d89b41146107a45761033e565b80637a7af70d116101895780637a7af70d1461072057806381c3fcb91461073357806385b68756146107525761033e565b8063715018a6146106ce578063770afee1146106e2578063786cd916146107015761033e565b8063276b11401161027e5780634abe413711610227578063633ac71711610201578063633ac7171461061e5780636ba235211461063d5780636c876b941461069057806370a08231146106af5761033e565b80634abe4137146105c157806356db02e8146105e057806359f89dda146105ff5761033e565b8063402d267d11610258578063402d267d14610563578063439fab9114610583578063488bd7b0146105a25761033e565b8063276b1140146104fe578063313ce5671461051157806338d52e0f146105375761033e565b806318160ddd116102e05780631f6759d3116102ba5780631f6759d31461048d57806323b872dd146104c05780632755c6c7146104df5761033e565b806318160ddd1461043b578063181e7b3b1461044f5780631e4344a11461046e5761033e565b806306fdde031161031157806306fdde03146103e8578063095ea7b3146104095780631423feba146104285761033e565b806301e1d1141461037357806301ffc9a71461039a578063058a628f146103c95761033e565b3661033e57005b73db479091164a15f1ba29de513776fffbb4a9f0af365f80375f80365f845af43d5f803e80801561036d573d5ff35b3d5ffd5b005b34801561037e575f80fd5b50610387610a51565b6040519081526020015b60405180910390f35b3480156103a5575f80fd5b506103b96103b4366004614fc2565b610a5f565b6040519015158152602001610391565b3480156103d4575f80fd5b506103716103e3366004615015565b610aba565b3480156103f3575f80fd5b506103fc610ce3565b604051610391919061507c565b348015610414575f80fd5b506103b961042336600461508e565b610db6565b610387610436366004615217565b610dcd565b348015610446575f80fd5b50610387610e17565b34801561045a575f80fd5b50610387610469366004615276565b610e20565b348015610479575f80fd5b50610371610488366004615296565b610e3f565b348015610498575f80fd5b507f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70054610387565b3480156104cb575f80fd5b506103b96104da3660046152ad565b610ecb565b3480156104ea575f80fd5b506103716104f936600461508e565b610eee565b61038761050c366004615276565b611028565b34801561051c575f80fd5b50610525611053565b60405160ff9091168152602001610391565b348015610542575f80fd5b5061054b6110f8565b6040516001600160a01b039091168152602001610391565b34801561056e575f80fd5b5061038761057d366004615015565b505f1990565b34801561058e575f80fd5b5061038761059d3660046152eb565b61112c565b3480156105ad575f80fd5b506103876105bc366004615276565b6113d1565b3480156105cc575f80fd5b506103876105db36600461508e565b6113e9565b3480156105eb575f80fd5b506103876105fa36600461531d565b6114a3565b34801561060a575f80fd5b50610371610619366004615364565b6117e4565b348015610629575f80fd5b50610371610638366004615015565b61181c565b348015610648575f80fd5b50610387610657366004615015565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be701602052604090205490565b34801561069b575f80fd5b506103716106aa366004615015565b611949565b3480156106ba575f80fd5b506103876106c9366004615015565b611a49565b3480156106d9575f80fd5b50610371611a92565b3480156106ed575f80fd5b506103876106fc366004615364565b611aa5565b34801561070c575f80fd5b5061037161071b36600461508e565b611c5f565b61038761072e366004615276565b611d90565b34801561073e575f80fd5b5061037161074d3660046152eb565b611da5565b34801561075d575f80fd5b5061038761076c36600461508e565b611de1565b34801561077c575f80fd5b5061054b611ec4565b348015610790575f80fd5b5061038761079f3660046153b9565b611ecd565b3480156107af575f80fd5b506103fc611efa565b3480156107c3575f80fd5b506103b96107d236600461508e565b611f4b565b3480156107e2575f80fd5b506107f66107f136600461542a565b611f58565b6040516103919190615499565b34801561080e575f80fd5b5061038761081d3660046153b9565b61203e565b34801561082d575f80fd5b5061038761083c366004615015565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be702602052604090205490565b348015610880575f80fd5b5061038761088f366004615276565b612061565b34801561089f575f80fd5b506103876108ae366004615557565b61206f565b6103876108c1366004615217565b612157565b3480156108d1575f80fd5b5061054b612186565b6103876108e8366004615276565b6121ae565b3480156108f8575f80fd5b506103876109073660046155bc565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b34801561095b575f80fd5b507f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031661054b565b348015610997575f80fd5b506103716109a6366004615665565b6121c2565b3480156109b6575f80fd5b506103716109c53660046156fb565b6122f9565b3480156109d5575f80fd5b506103716109e4366004615015565b612462565b3480156109f4575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd025442116103b9565b348015610a29575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0154610387565b5f610a5a610e17565b905090565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda000000000000000000000000000000000000000000000000000000001480610ab45750610ab4826124b8565b92915050565b6040517f248a9ca30000000000000000000000000000000000000000000000000000000081527ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f8960048201525f906001600160a01b0383169063248a9ca390602401602060405180830381865afa158015610b37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b5b9190615753565b905080610bca576040517f76728ed90000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201527ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f8960248201526044015b60405180910390fd5b6040517f248a9ca30000000000000000000000000000000000000000000000000000000081527f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e760048201525f906001600160a01b0384169063248a9ca390602401602060405180830381865afa158015610c47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6b9190615753565b905080610cd5576040517f76728ed90000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201527f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e76024820152604401610bc1565b610cde836125e6565b505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610d349061576a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d609061576a565b8015610dab5780601f10610d8257610100808354040283529160200191610dab565b820191905f5260205f20905b815481529060010190602001808311610d8e57829003601f168201915b505050505091505090565b5f33610dc38185856125f7565b5060019392505050565b5f80610dd7612604565b90505f610df187610deb335b89865f61265b565b8761266f565b9050610e008787838588612685565b610e0b335b476128ac565b9150505b949350505050565b5f610a5a612955565b5f610e3883670de0b6b3a7640000612ab4565b612ab4565b9392505050565b610e47612ac0565b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7008054821115610e75578181555b7fff9fd4facd8bd30d905cc7ffbd03e8829a414df4c6554d155d132c3377868a42610e9e611ec4565b8254604080516001600160a01b039093168352602083018690528201526060015b60405180910390a15050565b5f33610ed8858285612b0b565b610ee3858585612bbf565b506001949350505050565b610ef6612ac0565b805f03610f3a576040517f5a6084530000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610bc1565b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115610fb7576001600160a01b0383165f90815260028201602052604090208290555b7fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd610fe0611ec4565b6001600160a01b038581165f818152600286016020908152604091829020548251959094168552840191909152820185905260608201526080015b60405180910390a1505050565b5f8061104884611042335b3361103c612604565b5f61265b565b85612c4e565b9050610e3833610e05565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080545f91906001600160a01b0316803b806110905760126110f0565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f091906157b5565b935050505090565b5f807f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326005b546001600160a01b031692915050565b5f80611136612c65565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156111625750825b90505f8267ffffffffffffffff16600114801561117e5750303b155b90508115801561118c575080155b156111c3576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156112245784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61122c612c8d565b5f878060200190518101906112419190615822565b90506112508160200151612cc6565b6020810151516001600160a01b031615611296576040517f8951799200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b03166112d7576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112e030612e39565b80516112eb90612f99565b7ffa89761502e992c8c755fba778ced00f4562485023f656906eb76f5dd65a9fe53360408051808201825284516001600160a01b0316815260208086015190820152905161133a929190615919565b60405180910390a17fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc396505083156113c75784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b5f610e38836113e4335b3386600161265b565b613021565b5f61141b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015260248201859052919091169062fdd58e90604401602060405180830381865afa15801561147f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e389190615753565b5f6114ac61302e565b825f036114e5576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6115a98461151b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b038a81166004830152602482018a9052919091169062fdd58e90604401602060405180830381865afa15801561157f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a39190615753565b9061305c565b905080156116c6577f88e2280ece62e9296d3578b77647db2c11f9fa7e42578e2db5d4262123ffae3e3387878785886040516115ea969594939291906159bd565b60405180910390a17f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663043fa98733883360405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03938416600482015291831660248301529091166044820152606481018890526084810184905260c060a48201525f60c482015260e4015f604051808303815f87803b1580156116af575f80fd5b505af11580156116c1573d5f803e3d5ffd5b505050505b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e36040518060a001604052808c6001600160a01b031681526020018b81526020018a81526020018781526020018981525060405160200161175d9190615a06565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161178a93929190615a51565b5f604051808303815f87803b1580156117a1575f80fd5b505af11580156117b3573d5f803e3d5ffd5b5093945050505050610e0f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b8282826040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610bc193929190615a51565b611824612ac0565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7009042116118d9576001600160a01b0382165f818152600283016020526040908190205490517f81a7897700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610bc1565b6001600160a01b0382165f9081526002820160205260408120557fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd61191c611ec4565b604080516001600160a01b03928316815291851660208301525f9082018190526060820152608001610ebf565b611951612ac0565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700904211611a06576001600160a01b0382165f818152600183016020526040908190205490517ff1b01b5400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610bc1565b6001600160a01b0382165f9081526001820160205260408120557fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af2532695447499161191c611ec4565b5f80611a548361306b565b90505f611a5f61307e565b6001600160a01b0385165f90815260038201602052604081205491925090611a8890849061311b565b5095945050505050565b611a9a612ac0565b611aa35f612f99565b565b5f611aae61302e565b825f03611ae7576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611af5846115a387611a49565b90508015611b47577f3fc1c49e72362e91416388fe7a107b92db924642476e83e701eeeb6256d7249e3386868487604051611b34959493929190615a78565b60405180910390a1611b47853383612bbf565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed60405180608001604052808b6001600160a01b031681526020018a815260200187815260200189815250604051602001611bd89190615aaf565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401611c0593929190615a51565b5f604051808303815f87803b158015611c1c575f80fd5b505af1158015611c2e573d5f803e3d5ffd5b5093945050505050610e3860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b611c67612ac0565b805f03611cab576040517ffd86061b0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610bc1565b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115611d28576001600160a01b0383165f90815260018201602052604090208290555b7fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af25326954474991611d51611ec4565b6001600160a01b038581165f8181526001860160209081526040918290205482519590941685528401919091528201859052606082015260800161101b565b5f8061104884611d9f33611033565b8561266f565b7fdaffad82f53a38a62340f14cdd6fd3b437c5dcda6b32029dac1e661dbce28b2d3382604051611dd6929190615af0565b60405180910390a150565b5f80611df0848585600161265b565b9050805f03611e02575f915050610ab4565b610e0f611e367f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052919091169062fdd58e90604401602060405180830381865afa158015611e9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ebe9190615753565b82612ab4565b5f610a5a6131c9565b5f80611ee087610e33878988600161265b565b9050611ef08187878a88886131f1565b9695505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610d349061576a565b5f33610dc3818585612bbf565b604080515f8152602081019091526060908267ffffffffffffffff811115611f8257611f826150b8565b604051908082528060200260200182016040528015611fb557816020015b6060815260200190600190039081611fa05790505b5091505f5b838110156120365761201130868684818110611fd857611fd8615b51565b9050602002810190611fea9190615b7e565b85604051602001611ffd93929190615bdf565b6040516020818303038152906040526135b7565b83828151811061202357612023615b51565b6020908102919091010152600101611fba565b505092915050565b5f80612051876113e4878988600161265b565b9050611ef08787878488886131f1565b5f610e3883610e33336113db565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00908511156120f1576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101869052602401610bc1565b5f61210888612102338a8a5f61265b565b5f61266f565b905061214c8888838989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061268592505050565b979650505050505050565b5f80612161612604565b90505f6121778761217133610de3565b87612c4e565b9050610e008187898588612685565b5f807fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0061111c565b5f8061104884670de0b6b3a7640000612102565b6121cf8585858585613652565b6121d984846136b5565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080546040805160a0810182526001600160a01b0388811682528781166020830152918101869052606081018590529116906359f89dda9088907f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4890608081016122837fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b151590526040516122979190602001615c3c565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016122c493929190615a51565b5f604051808303815f87803b1580156122db575f80fd5b505af11580156122ed573d5f803e3d5ffd5b50505050505050505050565b835f03612332576040517f8672985d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090505f6040518060a001604052808360020154815260200183600201548152602001878152602001861515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250905084806123cc5750816002015486115b156123e05760028201869055602081018690525b7f7ef5cae78e9bd364afb19bb0f8a881a6d156e35a119e28c0d17524e5079581583387878787604051612417959493929190615ccc565b60405180910390a181546001600160a01b03166359f89dda337f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d053391846040516020016122979190615d38565b61246a612ac0565b6001600160a01b0381166124ac576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b6124b581612f99565b50565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fe5be7d9000000000000000000000000000000000000000000000000000000000148061254a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b8061259657507fffffffff0000000000000000000000000000000000000000000000000000000082167fe1e6b89800000000000000000000000000000000000000000000000000000000145b80610ab457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610ab4565b6125ee612ac0565b6124b581612e39565b610cde8383836001613775565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090612655906001615d7c565b91505090565b5f670de0b6b3a76400005b95945050505050565b5f61267a828461389d565b610e0f84845f6138e1565b61268d61302e565b845f036126c6576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f036126ff576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03841661273f576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f0361277a576040517fe4a471820000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b7f3377bcbed49a0c0005e53931cd8fe7334b5371523e5de784c0d0d3d01089cfea3385878686866040516127b3969594939291906159bd565b60405180910390a16127c885858585856138f6565b6127d28484613951565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517f6d5b3f780000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690636d5b3f78906128429033908890879089908890600401615a78565b5f604051808303815f87803b158015612859575f80fd5b505af115801561286b573d5f803e3d5ffd5b5050505061287c858585858561399e565b6128a560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b804710156128ef576040517fcf47918100000000000000000000000000000000000000000000000000000000815247600482015260248101829052604401610bc1565b612908828260405180602001604052805f815250613a4a565b15612911575050565b3d156129235761291f613a5f565b5050565b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8061295f61307e565b60028101549091505f0361297557612655613a6a565b5f6129845f1960036001613b0b565b90505f5b5f198214610e38575f8360020183815481106129a6576129a6615b51565b905f5260205f2090600502015f0154905060028103612a83575f612a738560020185815481106129d8576129d8615b51565b905f5260205f20906005020160040180546129f29061576a565b80601f0160208091040260200160405190810160405280929190818152602001828054612a1e9061576a565b8015612a695780601f10612a4057610100808354040283529160200191612a69565b820191905f5260205f20905b815481529060010190602001808311612a4c57829003601f168201915b5050505050613c06565b9050612a7f8382613c1b565b9250505b5f838152600485016020526040902054612a9d9083615d7c565b9150612aac8360036001613b0b565b925050612988565b5f610e38838383613c9f565b33612ac9611ec4565b6001600160a01b031614611aa3576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610bc1565b6001600160a01b038381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220545f19811015612bb95781811015612bab576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610bc1565b612bb984848484035f613775565b50505050565b6001600160a01b038316612c01576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b6001600160a01b038216612c43576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b610cde838383613cb4565b5f612c59828461389d565b610e0f84846001613c9f565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610ab4565b425f03611aa3576040517f789a532d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cce613d07565b612ce081602001518260400151613d0f565b80517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0393841617825560608401517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601805490921693169283179055604080517f481c6a75000000000000000000000000000000000000000000000000000000008152905191925f92909163481c6a759160048083019260209291908290030181865afa158015612dc0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612de49190615d8f565b90506001600160a01b0381163014610cde576040517f7935475e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0382166024820152604401610bc1565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f59f89dda0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015612eb4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed89190615daa565b612f0e576040517ffd12061600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811782556040805133815260208101929092527fa8c713fe8fb360697fc0daab836d85208a605d485fbc265aea0f773fc6cdd71a9101610ebf565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f610e38838360016138e1565b613036613d21565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f828218828410028218610e38565b5f8061307683613d7c565b549392505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006130cc60017f2f8f8ecf1b7a1a3ceda8d15a9a2247a2377b3434535a87f1728021c13fec2e71615b3e565b6040516020016130de91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101201692915050565b5f80828161312761307e565b9050855f6131388760036001613b0b565b90505b5f1981146131ba5792508281158015906131785750600283600201828154811061316757613167615b51565b905f5260205f2090600502015f0154145b156131a6575f6131968460020183815481106129d8576129d8615b51565b90506131a28382613c1b565b9250505b6131b38160036001613b0b565b905061313b565b509350909150505b9250929050565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930061111c565b6131f961302e565b855f03613232576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f0361326b576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385166132ab576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166132eb576040517f9905827b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f03613327576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101839052602401610bc1565b7f2845b9458bcc357e1abfe8de7f6832dfe7220596a053496b33d0deb6577d8d2a338686898787876040516133629796959493929190615dc5565b60405180910390a16001600160a01b03841633146134d157613385843385612b0b565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663e985e9c585336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015613421573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134459190615daa565b6134d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610bc1565b6134db8484613e25565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517fc2530e390000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c2530e399061354b9033908890879089908890600401615a78565b5f604051808303815f87803b158015613562575f80fd5b505af1158015613574573d5f803e3d5ffd5b50505050613586868686868686613e72565b6135af60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b60605f6135c48484613f7b565b90508080156135e557505f3d11806135e557505f846001600160a01b03163b115b156135fa576135f2613f8e565b915050610ab4565b801561363d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610bc1565b3d156129235761364b613a5f565b5092915050565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031633146128a5576040517f8813aac300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700805442118015906136fe57506001600160a01b0383165f908152600182016020526040902054155b801561372157506001600160a01b0382165f908152600282016020526040902054155b15610cde5780546040517f79d7155100000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b03808516602483015283166044820152606401610bc1565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b0385166137d8576040517fe602df050000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b6001600160a01b03841661381a576040517f94280d620000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156128a557836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161388e91815260200190565b60405180910390a35050505050565b8181101561291f576040517fa3e322340000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610bc1565b5f610e0f8484670de0b6b3a764000085613fa7565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01547fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00906139449084613fe9565b6001909101555050505050565b6001600160a01b038216613993576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b61291f5f8383613cb4565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216040518060c00160405280613a073390565b6001600160a01b031681526020018a6001600160a01b031681526020018881526020018b8152602001898152602001878152506040516020016122979190615e6a565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00613ab860017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615b3e565b604051602001613aca91815260200190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181529190528051602090910120166002015492915050565b5f600783168103613b48576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613b5161307e565b60028101549091505f03613b69575f19915050610e38565b5f5f198614613b9c57816002018681548110613b8757613b87615b51565b905f5260205f20906005020160030154613b9f565b81545b90506002846002811115613bb557613bb5615e7c565b03613bd757613bce82613bc88484613ff8565b87614073565b92505050610e38565b6001846002811115613beb57613beb615e7c565b03613bfb57613bce8282876140cb565b611ef0828287614073565b5f81806020019051810190610ab49190615753565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613c79576040517fbf463fe900000000000000000000000000000000000000000000000000000000815260048101849052602401610bc1565b5f613c96613c90613c8a865f614138565b85614192565b5f6141f4565b50949350505050565b5f610e0f84670de0b6b3a76400008585613fa7565b613cbc614235565b613cc58361429b565b613cce8261429b565b613cd9838383614388565b6001600160a01b038316613cf057610cde816144e8565b6001600160a01b038216610cde57610cde8161452b565b611aa3614565565b613d17614565565b61291f82826145a3565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203611aa3576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00613dca60017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615b3e565b604051602001613ddc91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f96875292909216905290922092915050565b6001600160a01b038216613e67576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b61291f825f83613cb4565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696040518060c001604052808a6001600160a01b031681526020018b6001600160a01b031681526020018881526020018c815260200189815260200187815250604051602001613f189190615e6a565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401613f4593929190615a51565b5f604051808303815f87803b158015613f5c575f80fd5b505af1158015613f6e573d5f803e3d5ffd5b5050505050505050505050565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b5f613fd4613fb483614606565b8015613fcf57505f8480613fca57613fca615ea9565b868809115b151590565b613fdf868686614632565b6126669190615d7c565b5f828218828411028218610e38565b5f5b5f19821415801561403c57504283600201838154811061401c5761401c615b51565b5f91825260209091206001600590920201015467ffffffffffffffff1611155b1561406d5782600201828154811061405657614056615b51565b905f5260205f209060050201600301549150613ffa565b50919050565b5f5b5f1983146140c1575f84600201848154811061409357614093615b51565b905f5260205f209060050201905082815f0154165f146140b65783915050610e38565b600301549250614075565b505f199392505050565b5f5b5f1983146140c1575f8460020184815481106140eb576140eb615b51565b5f918252602090912060059091020160018101549091504267ffffffffffffffff909116111561411b57506140c1565b805483161561412d5783915050610e38565b6003015492506140cd565b5f805f61414585856146e2565b915091508061418a576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610bc1565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d84806141d7868686866147e8565b915091505f6141e68383614907565b9a9950505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d614228828287614965565b9350935050509250929050565b5f61423e61307e565b60028101549091505f0361424f5750565b5f614264826005015460026001176001613b0b565b90505f195b5f1982146142875750806142808160036001613b0b565b9150614269565b5f198114610cde5760058301819055505050565b6001600160a01b0381166142ac5750565b5f6142b561307e565b6001600160a01b0383165f9081526003820160205260408120549192506142db8461306b565b90505f806142e9838561311b565b915091508381036142fc57505050505050565b6001600160a01b0386165f9081526003860160205260409020819055818314614329576143298683614b50565b6040805185815260208101839052908101849052606081018390526001600160a01b038716907f36a2eb39b73568d38e98721588b15b309c9380e1b1ab575c2c3d71d5148ccb4a9060800160405180910390a26135af84848385614b62565b61439283836136b5565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a6040518060800160405280896001600160a01b03168152602001886001600160a01b031681526020018781526020016144427fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b151590526040805182516001600160a01b03908116602080840191909152840151168183015290820151606080830191909152909101511515608082015260a0016040516020818303038152906040526040518463ffffffff1660e01b81526004016144b093929190615a51565b5f604051808303815f87803b1580156144c7575f80fd5b505af11580156144d9573d5f803e3d5ffd5b50505050612bb9848484614bbf565b5f6144f161307e565b60028101549091501561291f5760058101545f90815260048201602052604081208054849290614522908490615d7c565b90915550505050565b5f61453461307e565b60028101549091501561291f5760058101545f90815260048201602052604081208054849290614522908490615b3e565b61456d614bca565b611aa3576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6145ab614565565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036145f78482615f1a565b5060048101612bb98382615f1a565b5f600282600381111561461b5761461b615e7c565b6146259190615ff4565b60ff166001149050919050565b5f805f61463f8686614be8565b91509150815f036146635783818161465957614659615ea9565b0492505050610e38565b81841161467a5761467a6003851502601118614c04565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f601b83900b8314838382614746577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561472657620186a0860595506005850194505b8586601b0b1461474157600a86059550846001019450614726565b61475c565b855f0361475c57505f9250600191506131c29050565b848560030b146147b8575f85121561477c57505f92508291506131c29050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610bc1565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f8085158415178015614800575f92505f91506148fd565b61480a8487616015565b91505f61481688614c15565b90505f61482287614c15565b90505f61482f8383614be8565b5090505f6f0785ee10d5da46d900f436a000000000821115614864576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a764000082111561488557670de0b6b3a7640000820491506012015b633b9aca0082111561489e57633b9aca00820491506009015b6127108211156148b357612710820491506004015b81156148c757600a820491506001016148b3565b6148d18187616015565b95506148f38b8a6148ed87876148e887600a616114565b614c76565b89614d51565b9097509550505050505b5094509492505050565b5f805f61491485856146e2565b9150915080158015614924575081155b1561418a576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610bc1565b5f805f8512156149ab576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610bc1565b845f036149bd57505f90506001614b48565b8460ff8416850185811215614a08576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610bc1565b5f805f831215614a72577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215614a49575f809550955050505050614b48565b825f03600a0a9150818481614a6057614a60615ea9565b0495505084029091149150614b489050565b5f831315614b3d57604d831315614ac8576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610bc1565b82600a0a9150815f1981614ade57614ade615ea9565b04841115614b2b576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610bc1565b5091909102925060019150614b489050565b509193506001925050505b935093915050565b5f614b5a83613d7c565b919091555050565b5f614b6b61307e565b905083816004015f8781526020019081526020015f205f828254614b8f9190615b3e565b90915550505f83815260048201602052604081208054849290614bb3908490615d7c565b90915550505050505050565b610cde838383614e5d565b5f614bd3612c65565b5468010000000000000000900460ff16919050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f80821215614c72577f80000000000000000000000000000000000000000000000000000000000000008203614c6c57507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f614c838686614be8565b91509150815f03614c9d5783818161465957614659615ea9565b838210614ce7576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610bc1565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614e1b577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614e0857614db07f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001615d7c565b8403614de057507f8000000000000000000000000000000000000000000000000000000000000000905081614e54565b614deb600a8561611f565b614df490616132565b614dff846001616015565b91509150614e54565b614e1184616132565b8391509150614e54565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614e4e57614df4600a8561611f565b50829050815b94509492505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038416614eaa5781816002015f828254614e9f9190615d7c565b90915550614f339050565b6001600160a01b0384165f9081526020829052604090205482811015614f15576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810182905260448101849052606401610bc1565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316614f51576002810180548390039055614f6f565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051614fb491815260200190565b60405180910390a350505050565b5f60208284031215614fd2575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e38575f80fd5b6001600160a01b03811681146124b5575f80fd5b5f60208284031215615025575f80fd5b8135610e3881615001565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610e386020830184615030565b5f806040838503121561509f575f80fd5b82356150aa81615001565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715615108576151086150b8565b60405290565b6040516080810167ffffffffffffffff81118282101715615108576151086150b8565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715615178576151786150b8565b604052919050565b5f67ffffffffffffffff821115615199576151996150b8565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f8301126151d4575f80fd5b81356151e76151e282615180565b615131565b8181528460208386010111156151fb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f806080858703121561522a575f80fd5b84359350602085013561523c81615001565b925060408501359150606085013567ffffffffffffffff81111561525e575f80fd5b61526a878288016151c5565b91505092959194509250565b5f8060408385031215615287575f80fd5b50508035926020909101359150565b5f602082840312156152a6575f80fd5b5035919050565b5f805f606084860312156152bf575f80fd5b83356152ca81615001565b925060208401356152da81615001565b929592945050506040919091013590565b5f602082840312156152fb575f80fd5b813567ffffffffffffffff811115615311575f80fd5b610e0f848285016151c5565b5f805f8060808587031215615330575f80fd5b843561533b81615001565b93506020850135925060408501359150606085013567ffffffffffffffff81111561525e575f80fd5b5f805f60608486031215615376575f80fd5b833561538181615001565b925060208401359150604084013567ffffffffffffffff8111156153a3575f80fd5b6153af868287016151c5565b9150509250925092565b5f805f805f60a086880312156153cd575f80fd5b8535945060208601356153df81615001565b935060408601356153ef81615001565b925060608601359150608086013567ffffffffffffffff811115615411575f80fd5b61541d888289016151c5565b9150509295509295909350565b5f806020838503121561543b575f80fd5b823567ffffffffffffffff80821115615452575f80fd5b818501915085601f830112615465575f80fd5b813581811115615473575f80fd5b8660208260051b8501011115615487575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b8281101561550c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526154fa858351615030565b945092850192908501906001016154c0565b5092979650505050505050565b5f8083601f840112615529575f80fd5b50813567ffffffffffffffff811115615540575f80fd5b6020830191508360208285010111156131c2575f80fd5b5f805f805f6080868803121561556b575f80fd5b85359450602086013561557d81615001565b935060408601359250606086013567ffffffffffffffff81111561559f575f80fd5b6155ab88828901615519565b969995985093965092949392505050565b5f80604083850312156155cd575f80fd5b82356155d881615001565b915060208301356155e881615001565b809150509250929050565b5f82601f830112615602575f80fd5b8135602067ffffffffffffffff82111561561e5761561e6150b8565b8160051b61562d828201615131565b9283528481018201928281019087851115615646575f80fd5b83870192505b8483101561214c5782358252918301919083019061564c565b5f805f805f60a08688031215615679575f80fd5b853561568481615001565b9450602086013561569481615001565b935060408601356156a481615001565b9250606086013567ffffffffffffffff808211156156c0575f80fd5b6156cc89838a016155f3565b935060808801359150808211156156e1575f80fd5b5061541d888289016155f3565b80151581146124b5575f80fd5b5f805f806060858703121561570e575f80fd5b843593506020850135615720816156ee565b9250604085013567ffffffffffffffff81111561573b575f80fd5b61574787828801615519565b95989497509550505050565b5f60208284031215615763575f80fd5b5051919050565b600181811c9082168061577e57607f821691505b60208210810361406d577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f602082840312156157c5575f80fd5b815160ff81168114610e38575f80fd5b5f82601f8301126157e4575f80fd5b81516157f26151e282615180565b818152846020838601011115615806575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215615832575f80fd5b815167ffffffffffffffff80821115615849575f80fd5b908301906040828603121561585c575f80fd5b6158646150e5565b825161586f81615001565b8152602083015182811115615882575f80fd5b929092019160808387031215615896575f80fd5b61589e61510e565b83516158a981615001565b81526020840151838111156158bc575f80fd5b6158c8888287016157d5565b6020830152506040840151838111156158df575f80fd5b6158eb888287016157d5565b6040830152506060840151935061590184615001565b60608101939093526020810192909252509392505050565b5f6001600160a01b038085168352604060208401528084511660408401526020840151604060608501528181511660808501526020810151608060a0860152615966610100860182615030565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808683030160c08701526159a18282615030565b9150508260608301511660e08601528093505050509392505050565b5f6001600160a01b03808916835280881660208401525085604083015284606083015283608083015260c060a08301526159fa60c0830184615030565b98975050505050505050565b602081526001600160a01b0382511660208201526020820151604082015260408201516060820152606082015160808201525f608083015160a080840152610e0f60c0840182615030565b6001600160a01b0384168152826020820152606060408201525f6126666060830184615030565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261214c60a0830184615030565b602081526001600160a01b03825116602082015260208201516040820152604082015160608201525f6060830151608080840152610e0f60a0840182615030565b6001600160a01b0383168152604060208201525f610e0f6040830184615030565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610ab457610ab4615b11565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615bb1575f80fd5b83018035915067ffffffffffffffff821115615bcb575f80fd5b6020019150368190038213156131c2575f80fd5b828482375f8382015f815283518060208601835e5f910190815295945050505050565b5f815180845260208085019450602084015f5b83811015615c3157815187529582019590820190600101615c15565b509495945050505050565b602081525f6001600160a01b0380845116602084015280602085015116604084015250604083015160a06060840152615c7860c0840182615c02565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016080850152615cb38282615c02565b9150506080840151151560a08401528091505092915050565b6001600160a01b0386168152846020820152831515604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101949350505050565b602081528151602082015260208201516040820152604082015160608201526060820151151560808201525f608083015160a080840152610e0f60c0840182615030565b80820180821115610ab457610ab4615b11565b5f60208284031215615d9f575f80fd5b8151610e3881615001565b5f60208284031215615dba575f80fd5b8151610e38816156ee565b5f6001600160a01b03808a16835280891660208401528088166040840152508560608301528460808301528360a083015260e060c0830152615e0a60e0830184615030565b9998505050505050505050565b5f6001600160a01b038083511684528060208401511660208501525060408201516040840152606082015160608401526080820151608084015260a082015160c060a0850152610e0f60c0850182615030565b602081525f610e386020830184615e17565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b601f821115610cde57805f5260205f20601f840160051c81016020851015615efb5750805b601f840160051c820191505b818110156128a5575f8155600101615f07565b815167ffffffffffffffff811115615f3457615f346150b8565b615f4881615f42845461576a565b84615ed6565b602080601f831160018114615f7b575f8415615f645750858301515b5f19600386901b1c1916600185901b1785556135af565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615fc757888601518255948401946001909101908401615fa8565b5085821015615fe457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60ff83168061600657616006615ea9565b8060ff84160691505092915050565b8082018281125f83128015821682158216171561203657612036615b11565b600181815b8085111561606e57815f190482111561605457616054615b11565b8085161561606157918102915b93841c9390800290616039565b509250929050565b5f8261608457506001610ab4565b8161609057505f610ab4565b81600181146160a657600281146160b0576160cc565b6001915050610ab4565b60ff8411156160c1576160c1615b11565b50506001821b610ab4565b5060208310610133831016604e8410600b84101617156160ef575081810a610ab4565b6160f98383616034565b805f190482111561610c5761610c615b11565b029392505050565b5f610e388383616076565b5f8261612d5761612d615ea9565b500490565b5f7f80000000000000000000000000000000000000000000000000000000000000008203614c6c57614c6c615b1156"; + hex"608060405260043610610337575f3560e01c8063715018a6116101af578063bbec4d06116100eb578063dd62ed3e11610094578063e70689f51161006e578063e70689f5146109ab578063f2fde38b146109ca578063f5647943146109e9578063f5d214f514610a1e5761033e565b8063dd62ed3e146108ed578063e1e6b89814610950578063e5be7d901461098c5761033e565b8063c77b66c2116100c5578063c77b66c2146108b3578063d09edf31146108c6578063db2088f4146108da5761033e565b8063bbec4d0614610875578063c54cafee14610894578063c63d75b6146105635761033e565b80638da5cb5b11610158578063a9059cbb11610132578063a9059cbb146107b8578063ac9650d8146107d7578063ae57de0c14610803578063ae98b39f146108225761033e565b80638da5cb5b14610771578063921a4c421461078557806395d89b41146107a45761033e565b80637a7af70d116101895780637a7af70d1461072057806381c3fcb91461073357806385b68756146107525761033e565b8063715018a6146106ce578063770afee1146106e2578063786cd916146107015761033e565b8063276b11401161027e5780634abe413711610227578063633ac71711610201578063633ac7171461061e5780636ba235211461063d5780636c876b941461069057806370a08231146106af5761033e565b80634abe4137146105c157806356db02e8146105e057806359f89dda146105ff5761033e565b8063402d267d11610258578063402d267d14610563578063439fab9114610583578063488bd7b0146105a25761033e565b8063276b1140146104fe578063313ce5671461051157806338d52e0f146105375761033e565b806318160ddd116102e05780631f6759d3116102ba5780631f6759d31461048d57806323b872dd146104c05780632755c6c7146104df5761033e565b806318160ddd1461043b578063181e7b3b1461044f5780631e4344a11461046e5761033e565b806306fdde031161031157806306fdde03146103e8578063095ea7b3146104095780631423feba146104285761033e565b806301e1d1141461037357806301ffc9a71461039a578063058a628f146103c95761033e565b3661033e57005b7351f78b77edffdb62b8aeb753066c318a46d05d74365f80375f80365f845af43d5f803e80801561036d573d5ff35b3d5ffd5b005b34801561037e575f80fd5b50610387610a51565b6040519081526020015b60405180910390f35b3480156103a5575f80fd5b506103b96103b4366004614f0e565b610a5f565b6040519015158152602001610391565b3480156103d4575f80fd5b506103716103e3366004614f61565b610aba565b3480156103f3575f80fd5b506103fc610ce3565b6040516103919190614faa565b348015610414575f80fd5b506103b9610423366004614fbc565b610db6565b610387610436366004615109565b610dcd565b348015610446575f80fd5b50610387610e17565b34801561045a575f80fd5b50610387610469366004615168565b610e20565b348015610479575f80fd5b50610371610488366004615188565b610e3f565b348015610498575f80fd5b507f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70054610387565b3480156104cb575f80fd5b506103b96104da36600461519f565b610ecb565b3480156104ea575f80fd5b506103716104f9366004614fbc565b610eee565b61038761050c366004615168565b611028565b34801561051c575f80fd5b50610525611053565b60405160ff9091168152602001610391565b348015610542575f80fd5b5061054b6110f8565b6040516001600160a01b039091168152602001610391565b34801561056e575f80fd5b5061038761057d366004614f61565b505f1990565b34801561058e575f80fd5b5061038761059d3660046151dd565b61112c565b3480156105ad575f80fd5b506103876105bc366004615168565b6113d1565b3480156105cc575f80fd5b506103876105db366004614fbc565b6113e9565b3480156105eb575f80fd5b506103876105fa36600461520f565b6114a3565b34801561060a575f80fd5b50610371610619366004615256565b6117e4565b348015610629575f80fd5b50610371610638366004614f61565b61181c565b348015610648575f80fd5b50610387610657366004614f61565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be701602052604090205490565b34801561069b575f80fd5b506103716106aa366004614f61565b611949565b3480156106ba575f80fd5b506103876106c9366004614f61565b611a49565b3480156106d9575f80fd5b50610371611a92565b3480156106ed575f80fd5b506103876106fc366004615256565b611aa5565b34801561070c575f80fd5b5061037161071b366004614fbc565b611c5f565b61038761072e366004615168565b611d90565b34801561073e575f80fd5b5061037161074d3660046151dd565b611da5565b34801561075d575f80fd5b5061038761076c366004614fbc565b611de1565b34801561077c575f80fd5b5061054b611ec4565b348015610790575f80fd5b5061038761079f3660046152ab565b611ecd565b3480156107af575f80fd5b506103fc611efa565b3480156107c3575f80fd5b506103b96107d2366004614fbc565b611f4b565b3480156107e2575f80fd5b506107f66107f136600461531c565b611f58565b604051610391919061538b565b34801561080e575f80fd5b5061038761081d3660046152ab565b61203e565b34801561082d575f80fd5b5061038761083c366004614f61565b6001600160a01b03165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be702602052604090205490565b348015610880575f80fd5b5061038761088f366004615168565b612061565b34801561089f575f80fd5b506103876108ae366004615449565b61206f565b6103876108c1366004615109565b612157565b3480156108d1575f80fd5b5061054b612186565b6103876108e8366004615168565b6121ae565b3480156108f8575f80fd5b506103876109073660046154ae565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b34801561095b575f80fd5b507f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031661054b565b348015610997575f80fd5b506103716109a6366004615557565b6121c2565b3480156109b6575f80fd5b506103716109c53660046155ed565b6122f9565b3480156109d5575f80fd5b506103716109e4366004614f61565b612462565b3480156109f4575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd025442116103b9565b348015610a29575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0154610387565b5f610a5a610e17565b905090565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda000000000000000000000000000000000000000000000000000000001480610ab45750610ab4826124b8565b92915050565b6040517f248a9ca30000000000000000000000000000000000000000000000000000000081527ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f8960048201525f906001600160a01b0383169063248a9ca390602401602060405180830381865afa158015610b37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b5b9190615645565b905080610bca576040517f76728ed90000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201527ffc0b9a47b723baf66339577301d13949cab2da29c3baeaa9cfc1f36c513e8f8960248201526044015b60405180910390fd5b6040517f248a9ca30000000000000000000000000000000000000000000000000000000081527f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e760048201525f906001600160a01b0384169063248a9ca390602401602060405180830381865afa158015610c47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6b9190615645565b905080610cd5576040517f76728ed90000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201527f921a3c774c4abecc1bddc4f7beb397fdb2cde7806021d9571086abb74cd023e76024820152604401610bc1565b610cde836125e6565b505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610d349061565c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d609061565c565b8015610dab5780601f10610d8257610100808354040283529160200191610dab565b820191905f5260205f20905b815481529060010190602001808311610d8e57829003601f168201915b505050505091505090565b5f33610dc38185856125f7565b5060019392505050565b5f80610dd7612604565b90505f610df187610deb335b89865f61265b565b8761266f565b9050610e008787838588612685565b610e0b335b476128ac565b9150505b949350505050565b5f610a5a612955565b5f610e3883670de0b6b3a7640000612ab4565b612ab4565b9392505050565b610e47612ac0565b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7008054821115610e75578181555b7fff9fd4facd8bd30d905cc7ffbd03e8829a414df4c6554d155d132c3377868a42610e9e611ec4565b8254604080516001600160a01b039093168352602083018690528201526060015b60405180910390a15050565b5f33610ed8858285612b0b565b610ee3858585612bbf565b506001949350505050565b610ef6612ac0565b805f03610f3a576040517f5a6084530000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610bc1565b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115610fb7576001600160a01b0383165f90815260028201602052604090208290555b7fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd610fe0611ec4565b6001600160a01b038581165f818152600286016020908152604091829020548251959094168552840191909152820185905260608201526080015b60405180910390a1505050565b5f8061104884611042335b3361103c612604565b5f61265b565b85612c4e565b9050610e3833610e05565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080545f91906001600160a01b0316803b806110905760126110f0565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f091906156a7565b935050505090565b5f807f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326005b546001600160a01b031692915050565b5f80611136612c65565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156111625750825b90505f8267ffffffffffffffff16600114801561117e5750303b155b90508115801561118c575080155b156111c3576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156112245784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61122c612c8d565b5f878060200190518101906112419190615714565b90506112508160200151612cc6565b6020810151516001600160a01b031615611296576040517f8951799200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b03166112d7576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112e030612e39565b80516112eb90612f99565b7ffa89761502e992c8c755fba778ced00f4562485023f656906eb76f5dd65a9fe53360408051808201825284516001600160a01b0316815260208086015190820152905161133a92919061580b565b60405180910390a17fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc396505083156113c75784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b5f610e38836113e4335b3386600161265b565b613021565b5f61141b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015260248201859052919091169062fdd58e90604401602060405180830381865afa15801561147f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e389190615645565b5f6114ac61302e565b825f036114e5576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6115a98461151b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b038a81166004830152602482018a9052919091169062fdd58e90604401602060405180830381865afa15801561157f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a39190615645565b9061305c565b905080156116c6577f88e2280ece62e9296d3578b77647db2c11f9fa7e42578e2db5d4262123ffae3e3387878785886040516115ea969594939291906158af565b60405180910390a17f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663043fa98733883360405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03938416600482015291831660248301529091166044820152606481018890526084810184905260c060a48201525f60c482015260e4015f604051808303815f87803b1580156116af575f80fd5b505af11580156116c1573d5f803e3d5ffd5b505050505b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e36040518060a001604052808c6001600160a01b031681526020018b81526020018a81526020018781526020018981525060405160200161175d91906158f8565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161178a93929190615943565b5f604051808303815f87803b1580156117a1575f80fd5b505af11580156117b3573d5f803e3d5ffd5b5093945050505050610e0f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b8282826040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610bc193929190615943565b611824612ac0565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7009042116118d9576001600160a01b0382165f818152600283016020526040908190205490517f81a7897700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610bc1565b6001600160a01b0382165f9081526002820160205260408120557fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd61191c611ec4565b604080516001600160a01b03928316815291851660208301525f9082018190526060820152608001610ebf565b611951612ac0565b6001600160a01b0381165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700904211611a06576001600160a01b0382165f818152600183016020526040908190205490517ff1b01b5400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610bc1565b6001600160a01b0382165f9081526001820160205260408120557fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af2532695447499161191c611ec4565b5f80611a548361306b565b90505f611a5f61307e565b6001600160a01b0385165f90815260038201602052604081205491925090611a889084906130df565b5095945050505050565b611a9a612ac0565b611aa35f612f99565b565b5f611aae61302e565b825f03611ae7576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611af5846115a387611a49565b90508015611b47577f3fc1c49e72362e91416388fe7a107b92db924642476e83e701eeeb6256d7249e3386868487604051611b3495949392919061596a565b60405180910390a1611b47853383612bbf565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed60405180608001604052808b6001600160a01b031681526020018a815260200187815260200189815250604051602001611bd891906159a1565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401611c0593929190615943565b5f604051808303815f87803b158015611c1c575f80fd5b505af1158015611c2e573d5f803e3d5ffd5b5093945050505050610e3860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b611c67612ac0565b805f03611cab576040517ffd86061b0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610bc1565b6001600160a01b0382165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115611d28576001600160a01b0383165f90815260018201602052604090208290555b7fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af25326954474991611d51611ec4565b6001600160a01b038581165f8181526001860160209081526040918290205482519590941685528401919091528201859052606082015260800161101b565b5f8061104884611d9f33611033565b8561266f565b7fdaffad82f53a38a62340f14cdd6fd3b437c5dcda6b32029dac1e661dbce28b2d3382604051611dd69291906159e2565b60405180910390a150565b5f80611df0848585600161265b565b9050805f03611e02575f915050610ab4565b610e0f611e367f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031690565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260248201879052919091169062fdd58e90604401602060405180830381865afa158015611e9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ebe9190615645565b82612ab4565b5f610a5a61318d565b5f80611ee087610e33878988600161265b565b9050611ef08187878a88886131b5565b9695505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610d349061565c565b5f33610dc3818585612bbf565b604080515f8152602081019091526060908267ffffffffffffffff811115611f8257611f82614fe6565b604051908082528060200260200182016040528015611fb557816020015b6060815260200190600190039081611fa05790505b5091505f5b838110156120365761201130868684818110611fd857611fd8615a43565b9050602002810190611fea9190615a70565b85604051602001611ffd93929190615ad1565b60405160208183030381529060405261357b565b83828151811061202357612023615a43565b6020908102919091010152600101611fba565b505092915050565b5f80612051876113e4878988600161265b565b9050611ef08787878488886131b5565b5f610e3883610e33336113db565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00908511156120f1576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101869052602401610bc1565b5f61210888612102338a8a5f61265b565b5f61266f565b905061214c8888838989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061268592505050565b979650505050505050565b5f80612161612604565b90505f6121778761217133610de3565b87612c4e565b9050610e008187898588612685565b5f807fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0061111c565b5f8061104884670de0b6b3a7640000612102565b6121cf8585858585613616565b6121d98484613679565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080546040805160a0810182526001600160a01b0388811682528781166020830152918101869052606081018590529116906359f89dda9088907f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4890608081016122837fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b151590526040516122979190602001615b2e565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016122c493929190615943565b5f604051808303815f87803b1580156122db575f80fd5b505af11580156122ed573d5f803e3d5ffd5b50505050505050505050565b835f03612332576040517f8672985d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090505f6040518060a001604052808360020154815260200183600201548152602001878152602001861515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250905084806123cc5750816002015486115b156123e05760028201869055602081018690525b7f7ef5cae78e9bd364afb19bb0f8a881a6d156e35a119e28c0d17524e5079581583387878787604051612417959493929190615ba0565b60405180910390a181546001600160a01b03166359f89dda337f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d053391846040516020016122979190615bee565b61246a612ac0565b6001600160a01b0381166124ac576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b6124b581612f99565b50565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fe5be7d9000000000000000000000000000000000000000000000000000000000148061254a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b8061259657507fffffffff0000000000000000000000000000000000000000000000000000000082167fe1e6b89800000000000000000000000000000000000000000000000000000000145b80610ab457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610ab4565b6125ee612ac0565b6124b581612e39565b610cde8383836001613739565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090612655906001615c32565b91505090565b5f670de0b6b3a76400005b95945050505050565b5f61267a8284613861565b610e0f84845f6138a5565b61268d61302e565b845f036126c6576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f036126ff576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03841661273f576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f0361277a576040517fe4a471820000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b7f3377bcbed49a0c0005e53931cd8fe7334b5371523e5de784c0d0d3d01089cfea3385878686866040516127b3969594939291906158af565b60405180910390a16127c885858585856138ba565b6127d28484613915565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517f6d5b3f780000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690636d5b3f7890612842903390889087908990889060040161596a565b5f604051808303815f87803b158015612859575f80fd5b505af115801561286b573d5f803e3d5ffd5b5050505061287c8585858585613962565b6128a560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b804710156128ef576040517fcf47918100000000000000000000000000000000000000000000000000000000815247600482015260248101829052604401610bc1565b612908828260405180602001604052805f815250613a0e565b15612911575050565b3d156129235761291f613a23565b5050565b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8061295f61307e565b60028101549091505f0361297557612655613a2e565b5f6129845f1960036001613a93565b90505f5b5f198214610e38575f8360020183815481106129a6576129a6615a43565b905f5260205f2090600502015f0154905060028103612a83575f612a738560020185815481106129d8576129d8615a43565b905f5260205f20906005020160040180546129f29061565c565b80601f0160208091040260200160405190810160405280929190818152602001828054612a1e9061565c565b8015612a695780601f10612a4057610100808354040283529160200191612a69565b820191905f5260205f20905b815481529060010190602001808311612a4c57829003601f168201915b5050505050613b8e565b9050612a7f8382613ba3565b9250505b5f838152600485016020526040902054612a9d9083615c32565b9150612aac8360036001613a93565b925050612988565b5f610e38838383613c27565b33612ac9611ec4565b6001600160a01b031614611aa3576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610bc1565b6001600160a01b038381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220545f19811015612bb95781811015612bab576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610bc1565b612bb984848484035f613739565b50505050565b6001600160a01b038316612c01576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b6001600160a01b038216612c43576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b610cde838383613c3c565b5f612c598284613861565b610e0f84846001613c27565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610ab4565b425f03611aa3576040517f789a532d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cce613c8f565b612ce081602001518260400151613c97565b80517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0393841617825560608401517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601805490921693169283179055604080517f481c6a75000000000000000000000000000000000000000000000000000000008152905191925f92909163481c6a759160048083019260209291908290030181865afa158015612dc0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612de49190615c45565b90506001600160a01b0381163014610cde576040517f7935475e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0382166024820152604401610bc1565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f59f89dda0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015612eb4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed89190615c60565b612f0e576040517ffd12061600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03831690811782556040805133815260208101929092527fa8c713fe8fb360697fc0daab836d85208a605d485fbc265aea0f773fc6cdd71a9101610ebf565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f610e38838360016138a5565b613036613ca9565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f828218828410028218610e38565b5f8061307683613d04565b549392505050565b5f8060ff196130ae60017f2f8f8ecf1b7a1a3ceda8d15a9a2247a2377b3434535a87f1728021c13fec2e71615a30565b6040516020016130c091815260200190565b60408051601f1981840301815291905280516020909101201692915050565b5f8082816130eb61307e565b9050855f6130fc8760036001613a93565b90505b5f19811461317e57925082811580159061313c5750600283600201828154811061312b5761312b615a43565b905f5260205f2090600502015f0154145b1561316a575f61315a8460020183815481106129d8576129d8615a43565b90506131668382613ba3565b9250505b6131778160036001613a93565b90506130ff565b509350909150505b9250929050565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930061111c565b6131bd61302e565b855f036131f6576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f0361322f576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03851661326f576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166132af576040517f9905827b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f036132eb576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101839052602401610bc1565b7f2845b9458bcc357e1abfe8de7f6832dfe7220596a053496b33d0deb6577d8d2a338686898787876040516133269796959493929190615c7b565b60405180910390a16001600160a01b038416331461349557613349843385612b0b565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b03166001600160a01b031663e985e9c585336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa1580156133e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134099190615c60565b613495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610bc1565b61349f8484613d71565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517fc2530e390000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c2530e399061350f903390889087908990889060040161596a565b5f604051808303815f87803b158015613526575f80fd5b505af1158015613538573d5f803e3d5ffd5b5050505061354a868686868686613dbe565b61357360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b60605f6135888484613ec7565b90508080156135a957505f3d11806135a957505f846001600160a01b03163b115b156135be576135b6613eda565b915050610ab4565b8015613601576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610bc1565b3d156129235761360f613a23565b5092915050565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546001600160a01b031633146128a5576040517f8813aac300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700805442118015906136c257506001600160a01b0383165f908152600182016020526040902054155b80156136e557506001600160a01b0382165f908152600282016020526040902054155b15610cde5780546040517f79d7155100000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b03808516602483015283166044820152606401610bc1565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b03851661379c576040517fe602df050000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b6001600160a01b0384166137de576040517f94280d620000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156128a557836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161385291815260200190565b60405180910390a35050505050565b8181101561291f576040517fa3e322340000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610bc1565b5f610e0f8484670de0b6b3a764000085613ef3565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01547fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00906139089084613f35565b6001909101555050505050565b6001600160a01b038216613957576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b61291f5f8383613c3c565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216040518060c001604052806139cb3390565b6001600160a01b031681526020018a6001600160a01b031681526020018881526020018b8152602001898152602001878152506040516020016122979190615d20565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b5f8060ff19613a5e60017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615a30565b604051602001613a7091815260200190565b60408051808303601f190181529190528051602090910120166002015492915050565b5f600783168103613ad0576040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613ad961307e565b60028101549091505f03613af1575f19915050610e38565b5f5f198614613b2457816002018681548110613b0f57613b0f615a43565b905f5260205f20906005020160030154613b27565b81545b90506002846002811115613b3d57613b3d615d32565b03613b5f57613b5682613b508484613f44565b87613fbf565b92505050610e38565b6001846002811115613b7357613b73615d32565b03613b8357613b56828287614017565b611ef0828287613fbf565b5f81806020019051810190610ab49190615645565b5f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613c01576040517fbf463fe900000000000000000000000000000000000000000000000000000000815260048101849052602401610bc1565b5f613c1e613c18613c12865f614084565b856140de565b5f614140565b50949350505050565b5f610e0f84670de0b6b3a76400008585613ef3565b613c44614181565b613c4d836141e7565b613c56826141e7565b613c618383836142d4565b6001600160a01b038316613c7857610cde81614434565b6001600160a01b038216610cde57610cde81614477565b611aa36144b1565b613c9f6144b1565b61291f82826144ef565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203611aa3576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060ff19613d3460017fb750591399365444a618527b69a54ce09476c8bde1ecff60f5aa1fe2b52605ff615a30565b604051602001613d4691815260200190565b60408051601f1981840301815291815281516020928301205f96875292909216905290922092915050565b6001600160a01b038216613db3576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610bc1565b61291f825f83613c3c565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696040518060c001604052808a6001600160a01b031681526020018b6001600160a01b031681526020018881526020018c815260200189815260200187815250604051602001613e649190615d20565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401613e9193929190615943565b5f604051808303815f87803b158015613ea8575f80fd5b505af1158015613eba573d5f803e3d5ffd5b5050505050505050505050565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b5f613f20613f0083614552565b8015613f1b57505f8480613f1657613f16615d5f565b868809115b151590565b613f2b86868661457e565b6126669190615c32565b5f828218828411028218610e38565b5f5b5f198214158015613f88575042836002018381548110613f6857613f68615a43565b5f91825260209091206001600590920201015467ffffffffffffffff1611155b15613fb957826002018281548110613fa257613fa2615a43565b905f5260205f209060050201600301549150613f46565b50919050565b5f5b5f19831461400d575f846002018481548110613fdf57613fdf615a43565b905f5260205f209060050201905082815f0154165f146140025783915050610e38565b600301549250613fc1565b505f199392505050565b5f5b5f19831461400d575f84600201848154811061403757614037615a43565b5f918252602090912060059091020160018101549091504267ffffffffffffffff9091161115614067575061400d565b80548316156140795783915050610e38565b600301549250614019565b5f805f614091858561462e565b91509150806140d6576040517f22c9f7bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610bc1565b509392505050565b5f7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838116601b90810b9160e086811d9291861690910b9085901d848061412386868686614734565b915091505f6141328383614853565b9a9950505050505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416601b0b60e085901d6141748282876148b1565b9350935050509250929050565b5f61418a61307e565b60028101549091505f0361419b5750565b5f6141b0826005015460026001176001613a93565b90505f195b5f1982146141d35750806141cc8160036001613a93565b91506141b5565b5f198114610cde5760058301819055505050565b6001600160a01b0381166141f85750565b5f61420161307e565b6001600160a01b0383165f9081526003820160205260408120549192506142278461306b565b90505f8061423583856130df565b9150915083810361424857505050505050565b6001600160a01b0386165f9081526003860160205260409020819055818314614275576142758683614a9c565b6040805185815260208101839052908101849052606081018390526001600160a01b038716907f36a2eb39b73568d38e98721588b15b309c9380e1b1ab575c2c3d71d5148ccb4a9060800160405180910390a261357384848385614aae565b6142de8383613679565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080549091506001600160a01b03166359f89dda337f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a6040518060800160405280896001600160a01b03168152602001886001600160a01b0316815260200187815260200161438e7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b151590526040805182516001600160a01b03908116602080840191909152840151168183015290820151606080830191909152909101511515608082015260a0016040516020818303038152906040526040518463ffffffff1660e01b81526004016143fc93929190615943565b5f604051808303815f87803b158015614413575f80fd5b505af1158015614425573d5f803e3d5ffd5b50505050612bb9848484614b0b565b5f61443d61307e565b60028101549091501561291f5760058101545f9081526004820160205260408120805484929061446e908490615c32565b90915550505050565b5f61448061307e565b60028101549091501561291f5760058101545f9081526004820160205260408120805484929061446e908490615a30565b6144b9614b16565b611aa3576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6144f76144b1565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036145438482615dd0565b5060048101612bb98382615dd0565b5f600282600381111561456757614567615d32565b6145719190615e8c565b60ff166001149050919050565b5f805f61458b8686614b34565b91509150815f036145af578381816145a5576145a5615d5f565b0492505050610e38565b8184116145c6576145c66003851502601118614b50565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f601b83900b8314838382614692577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000086051561467257620186a0860595506005850194505b8586601b0b1461468d57600a86059550846001019450614672565b6146a8565b855f036146a857505f9250600191506131869050565b848560030b14614704575f8512156146c857505f92508291506131869050565b6040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610bc1565b50507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b5f808515841517801561474c575f92505f9150614849565b6147568487615ead565b91505f61476288614b61565b90505f61476e87614b61565b90505f61477b8383614b34565b5090505f6f0785ee10d5da46d900f436a0000000008211156147b0576f0785ee10d5da46d900f436a000000000820491506025015b670de0b6b3a76400008211156147d157670de0b6b3a7640000820491506012015b633b9aca008211156147ea57633b9aca00820491506009015b6127108211156147ff57612710820491506004015b811561481357600a820491506001016147ff565b61481d8187615ead565b955061483f8b8a614839878761483487600a615fac565b614bc2565b89614c9d565b9097509550505050505b5094509492505050565b5f805f614860858561462e565b9150915080158015614870575081155b156140d6576040517f8eba4d070000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610bc1565b5f805f8512156148f7576040517f4a7d166b0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610bc1565b845f0361490957505f90506001614a94565b8460ff8416850185811215614954576040517fd556b1110000000000000000000000000000000000000000000000000000000081526004810188905260248101879052604401610bc1565b5f805f8312156149be577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb3831215614995575f809550955050505050614a94565b825f03600a0a91508184816149ac576149ac615d5f565b0495505084029091149150614a949050565b5f831315614a8957604d831315614a14576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610bc1565b82600a0a9150815f1981614a2a57614a2a615d5f565b04841115614a77576040517fc849483b000000000000000000000000000000000000000000000000000000008152600481018a90526024810189905260ff88166044820152606401610bc1565b5091909102925060019150614a949050565b509193506001925050505b935093915050565b5f614aa683613d04565b919091555050565b5f614ab761307e565b905083816004015f8781526020019081526020015f205f828254614adb9190615a30565b90915550505f83815260048201602052604081208054849290614aff908490615c32565b90915550505050505050565b610cde838383614da9565b5f614b1f612c65565b5468010000000000000000900460ff16919050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f80821215614bbe577f80000000000000000000000000000000000000000000000000000000000000008203614bb857507f8000000000000000000000000000000000000000000000000000000000000000919050565b505f0390565b5090565b5f805f614bcf8686614b34565b91509150815f03614be9578381816145a5576145a5615d5f565b838210614c33576040517f6c59da12000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606401610bc1565b5f84868809600186198101871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103025f82900382900490920185841190960395909502919093039390930492909217029150509392505050565b5f805f8587181215614d67577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614d5457614cfc7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001615c32565b8403614d2c57507f8000000000000000000000000000000000000000000000000000000000000000905081614da0565b614d37600a85615fb7565b614d4090615fca565b614d4b846001615ead565b91509150614da0565b614d5d84615fca565b8391509150614da0565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841115614d9a57614d40600a85615fb7565b50829050815b94509492505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038416614df65781816002015f828254614deb9190615c32565b90915550614e7f9050565b6001600160a01b0384165f9081526020829052604090205482811015614e61576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810182905260448101849052606401610bc1565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316614e9d576002810180548390039055614ebb565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051614f0091815260200190565b60405180910390a350505050565b5f60208284031215614f1e575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e38575f80fd5b6001600160a01b03811681146124b5575f80fd5b5f60208284031215614f71575f80fd5b8135610e3881614f4d565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610e386020830184614f7c565b5f8060408385031215614fcd575f80fd5b8235614fd881614f4d565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561503657615036614fe6565b60405290565b6040516080810167ffffffffffffffff8111828210171561503657615036614fe6565b604051601f8201601f1916810167ffffffffffffffff8111828210171561508857615088614fe6565b604052919050565b5f67ffffffffffffffff8211156150a9576150a9614fe6565b50601f01601f191660200190565b5f82601f8301126150c6575f80fd5b81356150d96150d482615090565b61505f565b8181528460208386010111156150ed575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f806080858703121561511c575f80fd5b84359350602085013561512e81614f4d565b925060408501359150606085013567ffffffffffffffff811115615150575f80fd5b61515c878288016150b7565b91505092959194509250565b5f8060408385031215615179575f80fd5b50508035926020909101359150565b5f60208284031215615198575f80fd5b5035919050565b5f805f606084860312156151b1575f80fd5b83356151bc81614f4d565b925060208401356151cc81614f4d565b929592945050506040919091013590565b5f602082840312156151ed575f80fd5b813567ffffffffffffffff811115615203575f80fd5b610e0f848285016150b7565b5f805f8060808587031215615222575f80fd5b843561522d81614f4d565b93506020850135925060408501359150606085013567ffffffffffffffff811115615150575f80fd5b5f805f60608486031215615268575f80fd5b833561527381614f4d565b925060208401359150604084013567ffffffffffffffff811115615295575f80fd5b6152a1868287016150b7565b9150509250925092565b5f805f805f60a086880312156152bf575f80fd5b8535945060208601356152d181614f4d565b935060408601356152e181614f4d565b925060608601359150608086013567ffffffffffffffff811115615303575f80fd5b61530f888289016150b7565b9150509295509295909350565b5f806020838503121561532d575f80fd5b823567ffffffffffffffff80821115615344575f80fd5b818501915085601f830112615357575f80fd5b813581811115615365575f80fd5b8660208260051b8501011115615379575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b828110156153fe577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526153ec858351614f7c565b945092850192908501906001016153b2565b5092979650505050505050565b5f8083601f84011261541b575f80fd5b50813567ffffffffffffffff811115615432575f80fd5b602083019150836020828501011115613186575f80fd5b5f805f805f6080868803121561545d575f80fd5b85359450602086013561546f81614f4d565b935060408601359250606086013567ffffffffffffffff811115615491575f80fd5b61549d8882890161540b565b969995985093965092949392505050565b5f80604083850312156154bf575f80fd5b82356154ca81614f4d565b915060208301356154da81614f4d565b809150509250929050565b5f82601f8301126154f4575f80fd5b8135602067ffffffffffffffff82111561551057615510614fe6565b8160051b61551f82820161505f565b9283528481018201928281019087851115615538575f80fd5b83870192505b8483101561214c5782358252918301919083019061553e565b5f805f805f60a0868803121561556b575f80fd5b853561557681614f4d565b9450602086013561558681614f4d565b9350604086013561559681614f4d565b9250606086013567ffffffffffffffff808211156155b2575f80fd5b6155be89838a016154e5565b935060808801359150808211156155d3575f80fd5b5061530f888289016154e5565b80151581146124b5575f80fd5b5f805f8060608587031215615600575f80fd5b843593506020850135615612816155e0565b9250604085013567ffffffffffffffff81111561562d575f80fd5b6156398782880161540b565b95989497509550505050565b5f60208284031215615655575f80fd5b5051919050565b600181811c9082168061567057607f821691505b602082108103613fb9577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f602082840312156156b7575f80fd5b815160ff81168114610e38575f80fd5b5f82601f8301126156d6575f80fd5b81516156e46150d482615090565b8181528460208386010111156156f8575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215615724575f80fd5b815167ffffffffffffffff8082111561573b575f80fd5b908301906040828603121561574e575f80fd5b615756615013565b825161576181614f4d565b8152602083015182811115615774575f80fd5b929092019160808387031215615788575f80fd5b61579061503c565b835161579b81614f4d565b81526020840151838111156157ae575f80fd5b6157ba888287016156c7565b6020830152506040840151838111156157d1575f80fd5b6157dd888287016156c7565b604083015250606084015193506157f384614f4d565b60608101939093526020810192909252509392505050565b5f6001600160a01b038085168352604060208401528084511660408401526020840151604060608501528181511660808501526020810151608060a0860152615858610100860182614f7c565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808683030160c08701526158938282614f7c565b9150508260608301511660e08601528093505050509392505050565b5f6001600160a01b03808916835280881660208401525085604083015284606083015283608083015260c060a08301526158ec60c0830184614f7c565b98975050505050505050565b602081526001600160a01b0382511660208201526020820151604082015260408201516060820152606082015160808201525f608083015160a080840152610e0f60c0840182614f7c565b6001600160a01b0384168152826020820152606060408201525f6126666060830184614f7c565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261214c60a0830184614f7c565b602081526001600160a01b03825116602082015260208201516040820152604082015160608201525f6060830151608080840152610e0f60a0840182614f7c565b6001600160a01b0383168152604060208201525f610e0f6040830184614f7c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610ab457610ab4615a03565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615aa3575f80fd5b83018035915067ffffffffffffffff821115615abd575f80fd5b602001915036819003821315613186575f80fd5b828482375f8382015f815283518060208601835e5f910190815295945050505050565b5f815180845260208085019450602084015f5b83811015615b2357815187529582019590820190600101615b07565b509495945050505050565b602081525f6001600160a01b0380845116602084015280602085015116604084015250604083015160a06060840152615b6a60c0840182615af4565b90506060840151601f19848303016080850152615b878282615af4565b9150506080840151151560a08401528091505092915050565b6001600160a01b0386168152846020820152831515604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f909201601f19160101949350505050565b602081528151602082015260208201516040820152604082015160608201526060820151151560808201525f608083015160a080840152610e0f60c0840182614f7c565b80820180821115610ab457610ab4615a03565b5f60208284031215615c55575f80fd5b8151610e3881614f4d565b5f60208284031215615c70575f80fd5b8151610e38816155e0565b5f6001600160a01b03808a16835280891660208401528088166040840152508560608301528460808301528360a083015260e060c0830152615cc060e0830184614f7c565b9998505050505050505050565b5f6001600160a01b038083511684528060208401511660208501525060408201516040840152606082015160608401526080820151608084015260a082015160c060a0850152610e0f60c0850182614f7c565b602081525f610e386020830184615ccd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b601f821115610cde57805f5260205f20601f840160051c81016020851015615db15750805b601f840160051c820191505b818110156128a5575f8155600101615dbd565b815167ffffffffffffffff811115615dea57615dea614fe6565b615dfe81615df8845461565c565b84615d8c565b602080601f831160018114615e31575f8415615e1a5750858301515b5f19600386901b1c1916600185901b178555613573565b5f85815260208120601f198616915b82811015615e5f57888601518255948401946001909101908401615e40565b5085821015615e7c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60ff831680615e9e57615e9e615d5f565b8060ff84160691505092915050565b8082018281125f83128015821682158216171561203657612036615a03565b600181815b80851115615f0657815f1904821115615eec57615eec615a03565b80851615615ef957918102915b93841c9390800290615ed1565b509250929050565b5f82615f1c57506001610ab4565b81615f2857505f610ab4565b8160018114615f3e5760028114615f4857615f64565b6001915050610ab4565b60ff841115615f5957615f59615a03565b50506001821b610ab4565b5060208310610133831016604e8410600b8410161715615f87575081810a610ab4565b615f918383615ecc565b805f1904821115615fa457615fa4615a03565b029392505050565b5f610e388383615f0e565b5f82615fc557615fc5615d5f565b500490565b5f7f80000000000000000000000000000000000000000000000000000000000000008203614bb857614bb8615a0356"; diff --git a/src/generated/StoxUnifiedDeployer.pointers.sol b/src/generated/StoxUnifiedDeployer.pointers.sol index 1b481698..e0587d20 100644 --- a/src/generated/StoxUnifiedDeployer.pointers.sol +++ b/src/generated/StoxUnifiedDeployer.pointers.sol @@ -10,16 +10,16 @@ pragma solidity ^0.8.25; // file needs the contract to exist so that it can be compiled. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xf5a36af1ab8fa8d7fbb704c54bb752c1c1e76f3619e52dae83088c231f1771e3); +bytes32 constant BYTECODE_HASH = bytes32(0x91035080d8e610cc0657d7f44efa8fbf57ce5800e6a35694d107c05987d24e3f); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x4125e8d2CAd6Cbc1651ea03B53E2EF12085f8083); +address constant DEPLOYED_ADDRESS = address(0x81D0ecD58346bf2d484E7774f55EABc1AA3F4bcc); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b506106308061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c806301ffc9a714610038578063733e1f8d1461005f575b5f80fd5b61004b6100463660046102a3565b610074565b604051901515815260200160405180910390f35b61007261006d36600461042d565b61010c565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f733e1f8d00000000000000000000000000000000000000000000000000000000148061010657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f4904fab30000000000000000000000000000000000000000000000000000000081525f9073278897319b6969bf84c59882403925ef214513a190634904fab39061015e908590600401610570565b6020604051808303815f875af115801561017a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061019e9190610615565b6040517fd786858b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201529091505f9073326edc56e8f7cca3555482d65ce4627a021c52fd9063d786858b906024016020604051808303815f875af1158015610220573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102449190610615565b6040805133815273ffffffffffffffffffffffffffffffffffffffff858116602083015283168183015290519192507fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b919081900360600190a1505050565b5f602082840312156102b3575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146102e2575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715610339576103396102e9565b60405290565b6040516080810167ffffffffffffffff81118282101715610339576103396102e9565b73ffffffffffffffffffffffffffffffffffffffff81168114610383575f80fd5b50565b5f82601f830112610395575f80fd5b813567ffffffffffffffff808211156103b0576103b06102e9565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156103f6576103f66102e9565b8160405283815286602085880101111561040e575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561043d575f80fd5b813567ffffffffffffffff80821115610454575f80fd5b9083019060408286031215610467575f80fd5b61046f610316565b823561047a81610362565b815260208301358281111561048d575f80fd5b9290920191608083870312156104a1575f80fd5b6104a961033f565b83356104b481610362565b81526020840135838111156104c7575f80fd5b6104d388828701610386565b6020830152506040840135838111156104ea575f80fd5b6104f688828701610386565b6040830152506060840135935061050c84610362565b60608101939093526020810192909252509392505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f73ffffffffffffffffffffffffffffffffffffffff808451166020840152602084015160408085015281815116606085015260208101516080808601526105bf60e0860182610524565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a08701526105fa8282610524565b9150508260608301511660c086015280935050505092915050565b5f60208284031215610625575f80fd5b81516102e28161036256"; + hex"6080604052348015600e575f80fd5b506106308061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c806301ffc9a714610038578063733e1f8d1461005f575b5f80fd5b61004b6100463660046102a3565b610074565b604051901515815260200160405180910390f35b61007261006d36600461042d565b61010c565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f733e1f8d00000000000000000000000000000000000000000000000000000000148061010657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f4904fab30000000000000000000000000000000000000000000000000000000081525f9073d64246e6b25f745f005e6233e050c9b879e660dc90634904fab39061015e908590600401610570565b6020604051808303815f875af115801561017a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061019e9190610615565b6040517fd786858b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201529091505f9073be5f05c4576e6d3e7bccb4e64f08fc4f46adf0ca9063d786858b906024016020604051808303815f875af1158015610220573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102449190610615565b6040805133815273ffffffffffffffffffffffffffffffffffffffff858116602083015283168183015290519192507fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b919081900360600190a1505050565b5f602082840312156102b3575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146102e2575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715610339576103396102e9565b60405290565b6040516080810167ffffffffffffffff81118282101715610339576103396102e9565b73ffffffffffffffffffffffffffffffffffffffff81168114610383575f80fd5b50565b5f82601f830112610395575f80fd5b813567ffffffffffffffff808211156103b0576103b06102e9565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156103f6576103f66102e9565b8160405283815286602085880101111561040e575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561043d575f80fd5b813567ffffffffffffffff80821115610454575f80fd5b9083019060408286031215610467575f80fd5b61046f610316565b823561047a81610362565b815260208301358281111561048d575f80fd5b9290920191608083870312156104a1575f80fd5b6104a961033f565b83356104b481610362565b81526020840135838111156104c7575f80fd5b6104d388828701610386565b6020830152506040840135838111156104ea575f80fd5b6104f688828701610386565b6040830152506060840135935061050c84610362565b60608101939093526020810192909252509392505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f73ffffffffffffffffffffffffffffffffffffffff808451166020840152602084015160408085015281815116606085015260208101516080808601526105bf60e0860182610524565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a08701526105fa8282610524565b9150508260608301511660c086015280935050505092915050565b5f60208284031215610625575f80fd5b81516102e28161036256"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b5060043610610034575f3560e01c806301ffc9a714610038578063733e1f8d1461005f575b5f80fd5b61004b6100463660046102a3565b610074565b604051901515815260200160405180910390f35b61007261006d36600461042d565b61010c565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f733e1f8d00000000000000000000000000000000000000000000000000000000148061010657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f4904fab30000000000000000000000000000000000000000000000000000000081525f9073278897319b6969bf84c59882403925ef214513a190634904fab39061015e908590600401610570565b6020604051808303815f875af115801561017a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061019e9190610615565b6040517fd786858b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201529091505f9073326edc56e8f7cca3555482d65ce4627a021c52fd9063d786858b906024016020604051808303815f875af1158015610220573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102449190610615565b6040805133815273ffffffffffffffffffffffffffffffffffffffff858116602083015283168183015290519192507fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b919081900360600190a1505050565b5f602082840312156102b3575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146102e2575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715610339576103396102e9565b60405290565b6040516080810167ffffffffffffffff81118282101715610339576103396102e9565b73ffffffffffffffffffffffffffffffffffffffff81168114610383575f80fd5b50565b5f82601f830112610395575f80fd5b813567ffffffffffffffff808211156103b0576103b06102e9565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156103f6576103f66102e9565b8160405283815286602085880101111561040e575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561043d575f80fd5b813567ffffffffffffffff80821115610454575f80fd5b9083019060408286031215610467575f80fd5b61046f610316565b823561047a81610362565b815260208301358281111561048d575f80fd5b9290920191608083870312156104a1575f80fd5b6104a961033f565b83356104b481610362565b81526020840135838111156104c7575f80fd5b6104d388828701610386565b6020830152506040840135838111156104ea575f80fd5b6104f688828701610386565b6040830152506060840135935061050c84610362565b60608101939093526020810192909252509392505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f73ffffffffffffffffffffffffffffffffffffffff808451166020840152602084015160408085015281815116606085015260208101516080808601526105bf60e0860182610524565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a08701526105fa8282610524565b9150508260608301511660c086015280935050505092915050565b5f60208284031215610625575f80fd5b81516102e28161036256"; + hex"608060405234801561000f575f80fd5b5060043610610034575f3560e01c806301ffc9a714610038578063733e1f8d1461005f575b5f80fd5b61004b6100463660046102a3565b610074565b604051901515815260200160405180910390f35b61007261006d36600461042d565b61010c565b005b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f733e1f8d00000000000000000000000000000000000000000000000000000000148061010657507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f4904fab30000000000000000000000000000000000000000000000000000000081525f9073d64246e6b25f745f005e6233e050c9b879e660dc90634904fab39061015e908590600401610570565b6020604051808303815f875af115801561017a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061019e9190610615565b6040517fd786858b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201529091505f9073be5f05c4576e6d3e7bccb4e64f08fc4f46adf0ca9063d786858b906024016020604051808303815f875af1158015610220573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102449190610615565b6040805133815273ffffffffffffffffffffffffffffffffffffffff858116602083015283168183015290519192507fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b919081900360600190a1505050565b5f602082840312156102b3575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146102e2575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715610339576103396102e9565b60405290565b6040516080810167ffffffffffffffff81118282101715610339576103396102e9565b73ffffffffffffffffffffffffffffffffffffffff81168114610383575f80fd5b50565b5f82601f830112610395575f80fd5b813567ffffffffffffffff808211156103b0576103b06102e9565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156103f6576103f66102e9565b8160405283815286602085880101111561040e575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561043d575f80fd5b813567ffffffffffffffff80821115610454575f80fd5b9083019060408286031215610467575f80fd5b61046f610316565b823561047a81610362565b815260208301358281111561048d575f80fd5b9290920191608083870312156104a1575f80fd5b6104a961033f565b83356104b481610362565b81526020840135838111156104c7575f80fd5b6104d388828701610386565b6020830152506040840135838111156104ea575f80fd5b6104f688828701610386565b6040830152506060840135935061050c84610362565b60608101939093526020810192909252509392505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f73ffffffffffffffffffffffffffffffffffffffff808451166020840152602084015160408085015281815116606085015260208101516080808601526105bf60e0860182610524565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a08701526105fa8282610524565b9150508260608301511660c086015280935050505092915050565b5f60208284031215610625575f80fd5b81516102e28161036256"; diff --git a/src/generated/StoxWrappedTokenVault.pointers.sol b/src/generated/StoxWrappedTokenVault.pointers.sol index ffb3022f..18c6e307 100644 --- a/src/generated/StoxWrappedTokenVault.pointers.sol +++ b/src/generated/StoxWrappedTokenVault.pointers.sol @@ -10,16 +10,16 @@ pragma solidity ^0.8.25; // file needs the contract to exist so that it can be compiled. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xdbec9bf08b1123b03e631604066a61a6ed640018baa9527445b6138312fc05f3); +bytes32 constant BYTECODE_HASH = bytes32(0x6de4c556c1811293da4ad2e509ee476f3eb635f019845087e1d2777a1b272034); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xDEa4812b74b7Cc18abcb8aDd388fCBaC9109Ac65); +address constant DEPLOYED_ADDRESS = address(0x0D99e0174DbF885ceD6AE8dEb939b0F890450099); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b612201806100d65f395ff3fe608060405234801561000f575f80fd5b50600436106101b0575f3560e01c806370a08231116100f3578063c4d66de811610093578063ce96cb771161006e578063ce96cb7714610402578063d905777e14610415578063dd62ed3e14610428578063ef8b30f7146103ef575f80fd5b8063c4d66de8146103dc578063c63d75b6146102c8578063c6e6f592146103ef575f80fd5b8063a9059cbb116100ce578063a9059cbb14610390578063b3d7f6b9146103a3578063b460af94146103b6578063ba087652146103c9575f80fd5b806370a082311461032157806394bf804d1461037557806395d89b4114610388575f80fd5b806323b872dd1161015e578063402d267d11610139578063402d267d146102c8578063439fab91146102fb5780634cdad506146101e45780636e553f651461030e575f80fd5b806323b872dd14610254578063313ce5671461026757806338d52e0f14610281575f80fd5b8063095ea7b31161018e578063095ea7b3146101f75780630a28a4771461021a57806318160ddd1461022d575f80fd5b806301e1d114146101b457806306fdde03146101cf57806307a2d13a146101e4575b5f80fd5b6101bc61048c565b6040519081526020015b60405180910390f35b6101d761055e565b6040516101c69190611a92565b6101bc6101f2366004611ae5565b61064e565b61020a610205366004611b1d565b61065f565b60405190151581526020016101c6565b6101bc610228366004611ae5565b610676565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546101bc565b61020a610262366004611b47565b610682565b61026f6106a7565b60405160ff90911681526020016101c6565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c6565b6101bc6102d6366004611b85565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b6101bc610309366004611ba0565b6106fa565b6101bc61031c366004611c0c565b61094f565b6101bc61032f366004611b85565b73ffffffffffffffffffffffffffffffffffffffff165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00602052604090205490565b6101bc610383366004611c0c565b61099f565b6101d76109d9565b61020a61039e366004611b1d565b610ab5565b6101bc6103b1366004611ae5565b610ac2565b6101bc6103c4366004611c3a565b610ace565b6101bc6103d7366004611c3a565b610b5d565b6101bc6103ea366004611b85565b610be3565b6101bc6103fd366004611ae5565b610c16565b6101bc610410366004611b85565b610c21565b6101bc610423366004611b85565b610c2a565b6101bc610436366004611c79565b73ffffffffffffffffffffffffffffffffffffffff9182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f6104cb7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610535573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105599190611ca5565b905090565b606061059e7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa1580156105e5573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261062a9190810190611ce9565b60405160200161063a9190611dc9565b604051602081830303815290604052905090565b5f610659825f610c73565b92915050565b5f3361066c818585610cca565b5060019392505050565b5f610659826001610cdc565b5f3361068f858285610d2a565b61069a858585610e17565b60019150505b9392505050565b5f807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090505f81546106f4919074010000000000000000000000000000000000000000900460ff16611e27565b91505090565b5f80610704610ec0565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156107305750825b90505f8267ffffffffffffffff16600114801561074c5750303b155b90508115801561075a575080155b15610791576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156107f25784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f6107ff888a018a611b85565b905073ffffffffffffffffffffffffffffffffffffffff811661084e576040517f7cde9b7200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61085781610ee8565b61087d60405180602001604052805f81525060405180602001604052805f815250610efc565b60405173ffffffffffffffffffffffffffffffffffffffff82169033907fdf5fabff9e49f8c35d69a1f2d0c5e80c933c31cf836cf70de57e3a6e7dc86ebb905f90a37fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc396505083156109445784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505092915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61097f565b60405180910390fd5b5f61098985610c16565b905061099733858784610f12565b949350505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f6109cb85610ac2565b905061099733858388610f12565b6060610a197f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610a60573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610aa59190810190611ce9565b60405160200161063a9190611e40565b5f3361066c818585610e17565b5f610659826001610c73565b5f80610ad983610c21565b905080851115610b3b576040517ffe9cceec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810186905260448101829052606401610976565b5f610b4586610676565b9050610b543386868985610f9c565b95945050505050565b5f80610b6883610c2a565b905080851115610bca576040517fb94abeec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810186905260448101829052606401610976565b5f610bd48661064e565b9050610b54338686848a610f9c565b5f6040517faf1fbb2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610659825f610cdc565b5f6106596101f2835b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006020526040812054610659565b5f6106a0610c7f61048c565b610c8a906001611e71565b610c955f600a611fa2565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610cc19190611e71565b8591908561107c565b610cd783838360016110be565b505050565b5f6106a0610ceb82600a611fa2565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610d179190611e71565b610d1f61048c565b610cc1906001611e71565b73ffffffffffffffffffffffffffffffffffffffff8381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610e115781811015610e03576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401610976565b610e1184848484035f6110be565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e66576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b73ffffffffffffffffffffffffffffffffffffffff8216610eb5576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b610cd7838383611228565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610659565b610ef06113e7565b610ef981611427565b50565b610f046113e7565b610f0e82826114f8565b5050565b610f1c848361155b565b610f2683826115a4565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78484604051610f8e929190918252602082015260400190565b60405180910390a350505050565b8273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610fda57610fda838683610d2a565b610fe483826115fe565b610fee8483611658565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db858560405161106d929190918252602082015260400190565b60405180910390a45050505050565b5f6110a9611089836116a0565b80156110a457505f848061109f5761109f611fb0565b868809115b151590565b6110b48686866116cc565b610b549190611e71565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0073ffffffffffffffffffffffffffffffffffffffff851661112e576040517fe602df050000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b73ffffffffffffffffffffffffffffffffffffffff841661117d576040517f94280d620000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b73ffffffffffffffffffffffffffffffffffffffff8086165f90815260018301602090815260408083209388168352929052208390558115611221578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161121891815260200190565b60405180910390a35b5050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0073ffffffffffffffffffffffffffffffffffffffff84166112825781816002015f8282546112779190611e71565b909155506113329050565b73ffffffffffffffffffffffffffffffffffffffff84165f9081526020829052604090205482811015611307576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024810182905260448101849052606401610976565b73ffffffffffffffffffffffffffffffffffffffff85165f9081526020839052604090209083900390555b73ffffffffffffffffffffffffffffffffffffffff831661135d576002810180548390039055611388565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020829052604090208054830190555b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f8e91815260200190565b6113ef61177c565b611425576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61142f6113e7565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005f8061145b8461179a565b915091508161146b57601261146d565b805b83547fffffffffffffffffffffff000000000000000000000000000000000000000000167401000000000000000000000000000000000000000060ff92909216919091027fffffffffffffffffffffffff0000000000000000000000000000000000000000161773ffffffffffffffffffffffffffffffffffffffff94909416939093179091555050565b6115006113e7565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0361154c8482612072565b5060048101610e118382612072565b610f0e61159c7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005473ffffffffffffffffffffffffffffffffffffffff1690565b833084611853565b73ffffffffffffffffffffffffffffffffffffffff82166115f3576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b610f0e5f8383611228565b73ffffffffffffffffffffffffffffffffffffffff821661164d576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b610f0e825f83611228565b610f0e6116997f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005473ffffffffffffffffffffffffffffffffffffffff1690565b83836118af565b5f60028260038111156116b5576116b561218e565b6116bf91906121bb565b60ff166001149050919050565b5f805f6116d9868661190a565b91509150815f036116fd578381816116f3576116f3611fb0565b04925050506106a0565b818411611714576117146003851502601118611945565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f611785610ec0565b5468010000000000000000900460ff16919050565b5f805f6117a660405190565b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce567000000000000000000000000000000000000000000000000000000001790529091505f90819061180f908790611956565b509150915061181d83604052565b81801561182b575060203d10155b8015611838575060ff8111155b611843575f80611847565b6001815b94509450505050915091565b611861848484846001611977565b610e11576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610976565b6118bc8383836001611a0a565b610cd7576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610976565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f805f60405f855160208701885afa92505f51915060205190509250925092565b6040517f23b872dd000000000000000000000000000000000000000000000000000000005f81815273ffffffffffffffffffffffffffffffffffffffff8781166004528616602452604485905291602083606481808c5af1925060015f511483166119f95783831516156119ed573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000005f81815273ffffffffffffffffffffffffffffffffffffffff8616600452602485905291602083604481808b5af1925060015f51148316611a86578383151615611a7a573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f60208284031215611af5575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610ef9575f80fd5b5f8060408385031215611b2e575f80fd5b8235611b3981611afc565b946020939093013593505050565b5f805f60608486031215611b59575f80fd5b8335611b6481611afc565b92506020840135611b7481611afc565b929592945050506040919091013590565b5f60208284031215611b95575f80fd5b81356106a081611afc565b5f8060208385031215611bb1575f80fd5b823567ffffffffffffffff80821115611bc8575f80fd5b818501915085601f830112611bdb575f80fd5b813581811115611be9575f80fd5b866020828501011115611bfa575f80fd5b60209290920196919550909350505050565b5f8060408385031215611c1d575f80fd5b823591506020830135611c2f81611afc565b809150509250929050565b5f805f60608486031215611c4c575f80fd5b833592506020840135611c5e81611afc565b91506040840135611c6e81611afc565b809150509250925092565b5f8060408385031215611c8a575f80fd5b8235611c9581611afc565b91506020830135611c2f81611afc565b5f60208284031215611cb5575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215611cf9575f80fd5b815167ffffffffffffffff80821115611d10575f80fd5b818401915084601f830112611d23575f80fd5b815181811115611d3557611d35611cbc565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611d7b57611d7b611cbc565b81604052828152876020848701011115611d93575f80fd5b8260208601602083015e5f928101602001929092525095945050505050565b5f81518060208401855e5f93019283525090919050565b7f577261707065642000000000000000000000000000000000000000000000000081525f6106a06008830184611db2565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b60ff818116838216019081111561065957610659611dfa565b7f770000000000000000000000000000000000000000000000000000000000000081525f6106a06001830184611db2565b8082018082111561065957610659611dfa565b600181815b80851115611edd57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611ec357611ec3611dfa565b80851615611ed057918102915b93841c9390800290611e89565b509250929050565b5f82611ef357506001610659565b81611eff57505f610659565b8160018114611f155760028114611f1f57611f3b565b6001915050610659565b60ff841115611f3057611f30611dfa565b50506001821b610659565b5060208310610133831016604e8410600b8410161715611f5e575081810a610659565b611f688383611e84565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611f9a57611f9a611dfa565b029392505050565b5f6106a060ff841683611ee5565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b600181811c90821680611ff157607f821691505b602082108103612028577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610cd757805f5260205f20601f840160051c810160208510156120535750805b601f840160051c820191505b81811015611221575f815560010161205f565b815167ffffffffffffffff81111561208c5761208c611cbc565b6120a08161209a8454611fdd565b8461202e565b602080601f8311600181146120f2575f84156120bc5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612186565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561213e5788860151825594840194600190910190840161211f565b508582101561217a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b505060018460011b0185555b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60ff8316806121f2577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b8060ff8416069150509291505056"; + hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b611de4806100d65f395ff3fe608060405234801561000f575f80fd5b50600436106101b0575f3560e01c806370a08231116100f3578063c4d66de811610093578063ce96cb771161006e578063ce96cb77146103c9578063d905777e146103dc578063dd62ed3e146103ef578063ef8b30f7146103b6575f80fd5b8063c4d66de8146103a3578063c63d75b6146102bb578063c6e6f592146103b6575f80fd5b8063a9059cbb116100ce578063a9059cbb14610357578063b3d7f6b91461036a578063b460af941461037d578063ba08765214610390575f80fd5b806370a08231146102f557806394bf804d1461033c57806395d89b411461034f575f80fd5b806323b872dd1161015e578063402d267d11610139578063402d267d146102bb578063439fab91146102cf5780634cdad506146101e45780636e553f65146102e2575f80fd5b806323b872dd14610254578063313ce5671461026757806338d52e0f14610281575f80fd5b8063095ea7b31161018e578063095ea7b3146101f75780630a28a4771461021a57806318160ddd1461022d575f80fd5b806301e1d114146101b457806306fdde03146101cf57806307a2d13a146101e4575b5f80fd5b6101bc610446565b6040519081526020015b60405180910390f35b6101d76104fe565b6040516101c69190611758565b6101bc6101f236600461178d565b6105b6565b61020a6102053660046117b8565b6105c7565b60405190151581526020016101c6565b6101bc61022836600461178d565b6105de565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546101bc565b61020a6102623660046117e2565b6105ea565b61026f61060f565b60405160ff90911681526020016101c6565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546040516001600160a01b0390911681526020016101c6565b6101bc6102c9366004611820565b505f1990565b6101bc6102dd36600461183b565b610662565b6101bc6102f03660046118a7565b61089d565b6101bc610303366004611820565b6001600160a01b03165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00602052604090205490565b6101bc61034a3660046118a7565b6108ce565b6101d76108e9565b61020a6103653660046117b8565b61098d565b6101bc61037836600461178d565b61099a565b6101bc61038b3660046118d5565b6109a6565b6101bc61039e3660046118d5565b610a28565b6101bc6103b1366004611820565b610aa1565b6101bc6103c436600461178d565b610ad4565b6101bc6103d7366004611820565b610adf565b6101bc6103ea366004611820565b610ae8565b6101bc6103fd366004611914565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f6104787f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156104d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104f99190611940565b905090565b60606105317f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b6001600160a01b03166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa15801561056b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105929190810190611984565b6040516020016105a29190611a46565b604051602081830303815290604052905090565b5f6105c1825f610b24565b92915050565b5f336105d4818585610b7b565b5060019392505050565b5f6105c1826001610b8d565b5f336105f7858285610bdb565b610602858585610c8f565b60019150505b9392505050565b5f807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090505f815461065c919074010000000000000000000000000000000000000000900460ff16611aa4565b91505090565b5f8061066c610d1e565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156106985750825b90505f8267ffffffffffffffff1660011480156106b45750303b155b9050811580156106c2575080155b156106f9576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001178555831561075a5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f610767888a018a611820565b90506001600160a01b0381166107a9576040517f7cde9b7200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107b281610d46565b6107d860405180602001604052805f81525060405180602001604052805f815250610d5a565b6040516001600160a01b0382169033907fdf5fabff9e49f8c35d69a1f2d0c5e80c933c31cf836cf70de57e3a6e7dc86ebb905f90a37fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc396505083156108925784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505092915050565b5f5f196108ae565b60405180910390fd5b5f6108b885610ad4565b90506108c633858784610d70565b949350505050565b5f5f195f6108db8561099a565b90506108c633858388610d70565b606061091c7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b6001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610956573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261097d9190810190611984565b6040516020016105a29190611abd565b5f336105d4818585610c8f565b5f6105c1826001610b24565b5f806109b183610adf565b905080851115610a06576040517ffe9cceec0000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101869052604481018290526064016108a5565b5f610a10866105de565b9050610a1f3386868985610de0565b95945050505050565b5f80610a3383610ae8565b905080851115610a88576040517fb94abeec0000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101869052604481018290526064016108a5565b5f610a92866105b6565b9050610a1f338686848a610de0565b5f6040517faf1fbb2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6105c1825f610b8d565b5f6105c16101f2835b6001600160a01b0381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0060205260408120546105c1565b5f610608610b30610446565b610b3b906001611aee565b610b465f600a611be1565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610b729190611aee565b85919085610e7f565b610b888383836001610ec1565b505050565b5f610608610b9c82600a611be1565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610bc89190611aee565b610bd0610446565b610b72906001611aee565b6001600160a01b038381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220545f19811015610c895781811015610c7b576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101829052604481018390526064016108a5565b610c8984848484035f610ec1565b50505050565b6001600160a01b038316610cd1576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f60048201526024016108a5565b6001600160a01b038216610d13576040517fec442f050000000000000000000000000000000000000000000000000000000081525f60048201526024016108a5565b610b88838383610fea565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006105c1565b610d4e611141565b610d5781611181565b50565b610d62611141565b610d6c8282611245565b5050565b610d7a84836112a8565b610d8483826112e4565b826001600160a01b0316846001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78484604051610dd2929190918252602082015260400190565b60405180910390a350505050565b826001600160a01b0316856001600160a01b031614610e0457610e04838683610bdb565b610e0e8382611331565b610e18848361137e565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8585604051610e70929190918252602082015260400190565b60405180910390a45050505050565b5f610eac610e8c836113b9565b8015610ea757505f8480610ea257610ea2611bef565b868809115b151590565b610eb78686866113e5565b610a1f9190611aee565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038516610f24576040517fe602df050000000000000000000000000000000000000000000000000000000081525f60048201526024016108a5565b6001600160a01b038416610f66576040517f94280d620000000000000000000000000000000000000000000000000000000081525f60048201526024016108a5565b6001600160a01b038086165f90815260018301602090815260408083209388168352929052208390558115610fe357836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610fda91815260200190565b60405180910390a35b5050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b0384166110375781816002015f82825461102c9190611aee565b909155506110c09050565b6001600160a01b0384165f90815260208290526040902054828110156110a2576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b038616600482015260248101829052604481018490526064016108a5565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b0383166110de5760028101805483900390556110fc565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610dd291815260200190565b611149611495565b61117f576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611189611141565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005f806111b5846114b3565b91509150816111c55760126111c7565b805b83547fffffffffffffffffffffff000000000000000000000000000000000000000000167401000000000000000000000000000000000000000060ff92909216919091027fffffffffffffffffffffffff000000000000000000000000000000000000000016176001600160a01b0394909416939093179091555050565b61124d611141565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036112998482611cb1565b5060048101610c898382611cb1565b610d6c6112dc7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b83308461156c565b6001600160a01b038216611326576040517fec442f050000000000000000000000000000000000000000000000000000000081525f60048201526024016108a5565b610d6c5f8383610fea565b6001600160a01b038216611373576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f60048201526024016108a5565b610d6c825f83610fea565b610d6c6113b27f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b83836115bb565b5f60028260038111156113ce576113ce611d71565b6113d89190611d9e565b60ff166001149050919050565b5f805f6113f28686611609565b91509150815f036114165783818161140c5761140c611bef565b0492505050610608565b81841161142d5761142d6003851502601118611625565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f61149e610d1e565b5468010000000000000000900460ff16919050565b5f805f6114bf60405190565b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce567000000000000000000000000000000000000000000000000000000001790529091505f908190611528908790611636565b509150915061153683604052565b818015611544575060203d10155b8015611551575060ff8111155b61155c575f80611560565b6001815b94509450505050915091565b61157a848484846001611657565b610c89576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016108a5565b6115c883838360016116dd565b610b88576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016108a5565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f805f60405f855160208701885afa92505f51915060205190509250925092565b6040517f23b872dd000000000000000000000000000000000000000000000000000000005f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f511483166116cc5783831516156116c0573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000005f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661174c578383151615611740573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561179d575f80fd5b5035919050565b6001600160a01b0381168114610d57575f80fd5b5f80604083850312156117c9575f80fd5b82356117d4816117a4565b946020939093013593505050565b5f805f606084860312156117f4575f80fd5b83356117ff816117a4565b9250602084013561180f816117a4565b929592945050506040919091013590565b5f60208284031215611830575f80fd5b8135610608816117a4565b5f806020838503121561184c575f80fd5b823567ffffffffffffffff80821115611863575f80fd5b818501915085601f830112611876575f80fd5b813581811115611884575f80fd5b866020828501011115611895575f80fd5b60209290920196919550909350505050565b5f80604083850312156118b8575f80fd5b8235915060208301356118ca816117a4565b809150509250929050565b5f805f606084860312156118e7575f80fd5b8335925060208401356118f9816117a4565b91506040840135611909816117a4565b809150509250925092565b5f8060408385031215611925575f80fd5b8235611930816117a4565b915060208301356118ca816117a4565b5f60208284031215611950575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215611994575f80fd5b815167ffffffffffffffff808211156119ab575f80fd5b818401915084601f8301126119be575f80fd5b8151818111156119d0576119d0611957565b604051601f8201601f19908116603f011681019083821181831017156119f8576119f8611957565b81604052828152876020848701011115611a10575f80fd5b8260208601602083015e5f928101602001929092525095945050505050565b5f81518060208401855e5f93019283525090919050565b7f577261707065642000000000000000000000000000000000000000000000000081525f6106086008830184611a2f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b60ff81811683821601908111156105c1576105c1611a77565b7f770000000000000000000000000000000000000000000000000000000000000081525f6106086001830184611a2f565b808201808211156105c1576105c1611a77565b600181815b80851115611b3b57815f1904821115611b2157611b21611a77565b80851615611b2e57918102915b93841c9390800290611b06565b509250929050565b5f82611b51575060016105c1565b81611b5d57505f6105c1565b8160018114611b735760028114611b7d57611b99565b60019150506105c1565b60ff841115611b8e57611b8e611a77565b50506001821b6105c1565b5060208310610133831016604e8410600b8410161715611bbc575081810a6105c1565b611bc68383611b01565b805f1904821115611bd957611bd9611a77565b029392505050565b5f61060860ff841683611b43565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b600181811c90821680611c3057607f821691505b602082108103611c67577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610b8857805f5260205f20601f840160051c81016020851015611c925750805b601f840160051c820191505b81811015610fe3575f8155600101611c9e565b815167ffffffffffffffff811115611ccb57611ccb611957565b611cdf81611cd98454611c1c565b84611c6d565b602080601f831160018114611d12575f8415611cfb5750858301515b5f19600386901b1c1916600185901b178555611d69565b5f85815260208120601f198616915b82811015611d4057888601518255948401946001909101908401611d21565b5085821015611d5d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60ff831680611dd5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b8060ff8416069150509291505056"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b50600436106101b0575f3560e01c806370a08231116100f3578063c4d66de811610093578063ce96cb771161006e578063ce96cb7714610402578063d905777e14610415578063dd62ed3e14610428578063ef8b30f7146103ef575f80fd5b8063c4d66de8146103dc578063c63d75b6146102c8578063c6e6f592146103ef575f80fd5b8063a9059cbb116100ce578063a9059cbb14610390578063b3d7f6b9146103a3578063b460af94146103b6578063ba087652146103c9575f80fd5b806370a082311461032157806394bf804d1461037557806395d89b4114610388575f80fd5b806323b872dd1161015e578063402d267d11610139578063402d267d146102c8578063439fab91146102fb5780634cdad506146101e45780636e553f651461030e575f80fd5b806323b872dd14610254578063313ce5671461026757806338d52e0f14610281575f80fd5b8063095ea7b31161018e578063095ea7b3146101f75780630a28a4771461021a57806318160ddd1461022d575f80fd5b806301e1d114146101b457806306fdde03146101cf57806307a2d13a146101e4575b5f80fd5b6101bc61048c565b6040519081526020015b60405180910390f35b6101d761055e565b6040516101c69190611a92565b6101bc6101f2366004611ae5565b61064e565b61020a610205366004611b1d565b61065f565b60405190151581526020016101c6565b6101bc610228366004611ae5565b610676565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546101bc565b61020a610262366004611b47565b610682565b61026f6106a7565b60405160ff90911681526020016101c6565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c6565b6101bc6102d6366004611b85565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b6101bc610309366004611ba0565b6106fa565b6101bc61031c366004611c0c565b61094f565b6101bc61032f366004611b85565b73ffffffffffffffffffffffffffffffffffffffff165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00602052604090205490565b6101bc610383366004611c0c565b61099f565b6101d76109d9565b61020a61039e366004611b1d565b610ab5565b6101bc6103b1366004611ae5565b610ac2565b6101bc6103c4366004611c3a565b610ace565b6101bc6103d7366004611c3a565b610b5d565b6101bc6103ea366004611b85565b610be3565b6101bc6103fd366004611ae5565b610c16565b6101bc610410366004611b85565b610c21565b6101bc610423366004611b85565b610c2a565b6101bc610436366004611c79565b73ffffffffffffffffffffffffffffffffffffffff9182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f6104cb7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610535573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105599190611ca5565b905090565b606061059e7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa1580156105e5573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261062a9190810190611ce9565b60405160200161063a9190611dc9565b604051602081830303815290604052905090565b5f610659825f610c73565b92915050565b5f3361066c818585610cca565b5060019392505050565b5f610659826001610cdc565b5f3361068f858285610d2a565b61069a858585610e17565b60019150505b9392505050565b5f807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090505f81546106f4919074010000000000000000000000000000000000000000900460ff16611e27565b91505090565b5f80610704610ec0565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156107305750825b90505f8267ffffffffffffffff16600114801561074c5750303b155b90508115801561075a575080155b15610791576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156107f25784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f6107ff888a018a611b85565b905073ffffffffffffffffffffffffffffffffffffffff811661084e576040517f7cde9b7200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61085781610ee8565b61087d60405180602001604052805f81525060405180602001604052805f815250610efc565b60405173ffffffffffffffffffffffffffffffffffffffff82169033907fdf5fabff9e49f8c35d69a1f2d0c5e80c933c31cf836cf70de57e3a6e7dc86ebb905f90a37fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc396505083156109445784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505092915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61097f565b60405180910390fd5b5f61098985610c16565b905061099733858784610f12565b949350505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f6109cb85610ac2565b905061099733858388610f12565b6060610a197f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610a60573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610aa59190810190611ce9565b60405160200161063a9190611e40565b5f3361066c818585610e17565b5f610659826001610c73565b5f80610ad983610c21565b905080851115610b3b576040517ffe9cceec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810186905260448101829052606401610976565b5f610b4586610676565b9050610b543386868985610f9c565b95945050505050565b5f80610b6883610c2a565b905080851115610bca576040517fb94abeec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810186905260448101829052606401610976565b5f610bd48661064e565b9050610b54338686848a610f9c565b5f6040517faf1fbb2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610659825f610cdc565b5f6106596101f2835b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006020526040812054610659565b5f6106a0610c7f61048c565b610c8a906001611e71565b610c955f600a611fa2565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610cc19190611e71565b8591908561107c565b610cd783838360016110be565b505050565b5f6106a0610ceb82600a611fa2565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610d179190611e71565b610d1f61048c565b610cc1906001611e71565b73ffffffffffffffffffffffffffffffffffffffff8381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610e115781811015610e03576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401610976565b610e1184848484035f6110be565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e66576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b73ffffffffffffffffffffffffffffffffffffffff8216610eb5576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b610cd7838383611228565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610659565b610ef06113e7565b610ef981611427565b50565b610f046113e7565b610f0e82826114f8565b5050565b610f1c848361155b565b610f2683826115a4565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78484604051610f8e929190918252602082015260400190565b60405180910390a350505050565b8273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610fda57610fda838683610d2a565b610fe483826115fe565b610fee8483611658565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db858560405161106d929190918252602082015260400190565b60405180910390a45050505050565b5f6110a9611089836116a0565b80156110a457505f848061109f5761109f611fb0565b868809115b151590565b6110b48686866116cc565b610b549190611e71565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0073ffffffffffffffffffffffffffffffffffffffff851661112e576040517fe602df050000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b73ffffffffffffffffffffffffffffffffffffffff841661117d576040517f94280d620000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b73ffffffffffffffffffffffffffffffffffffffff8086165f90815260018301602090815260408083209388168352929052208390558115611221578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161121891815260200190565b60405180910390a35b5050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0073ffffffffffffffffffffffffffffffffffffffff84166112825781816002015f8282546112779190611e71565b909155506113329050565b73ffffffffffffffffffffffffffffffffffffffff84165f9081526020829052604090205482811015611307576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024810182905260448101849052606401610976565b73ffffffffffffffffffffffffffffffffffffffff85165f9081526020839052604090209083900390555b73ffffffffffffffffffffffffffffffffffffffff831661135d576002810180548390039055611388565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020829052604090208054830190555b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f8e91815260200190565b6113ef61177c565b611425576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61142f6113e7565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005f8061145b8461179a565b915091508161146b57601261146d565b805b83547fffffffffffffffffffffff000000000000000000000000000000000000000000167401000000000000000000000000000000000000000060ff92909216919091027fffffffffffffffffffffffff0000000000000000000000000000000000000000161773ffffffffffffffffffffffffffffffffffffffff94909416939093179091555050565b6115006113e7565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0361154c8482612072565b5060048101610e118382612072565b610f0e61159c7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005473ffffffffffffffffffffffffffffffffffffffff1690565b833084611853565b73ffffffffffffffffffffffffffffffffffffffff82166115f3576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b610f0e5f8383611228565b73ffffffffffffffffffffffffffffffffffffffff821661164d576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b610f0e825f83611228565b610f0e6116997f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005473ffffffffffffffffffffffffffffffffffffffff1690565b83836118af565b5f60028260038111156116b5576116b561218e565b6116bf91906121bb565b60ff166001149050919050565b5f805f6116d9868661190a565b91509150815f036116fd578381816116f3576116f3611fb0565b04925050506106a0565b818411611714576117146003851502601118611945565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f611785610ec0565b5468010000000000000000900460ff16919050565b5f805f6117a660405190565b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce567000000000000000000000000000000000000000000000000000000001790529091505f90819061180f908790611956565b509150915061181d83604052565b81801561182b575060203d10155b8015611838575060ff8111155b611843575f80611847565b6001815b94509450505050915091565b611861848484846001611977565b610e11576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610976565b6118bc8383836001611a0a565b610cd7576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610976565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f805f60405f855160208701885afa92505f51915060205190509250925092565b6040517f23b872dd000000000000000000000000000000000000000000000000000000005f81815273ffffffffffffffffffffffffffffffffffffffff8781166004528616602452604485905291602083606481808c5af1925060015f511483166119f95783831516156119ed573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000005f81815273ffffffffffffffffffffffffffffffffffffffff8616600452602485905291602083604481808b5af1925060015f51148316611a86578383151615611a7a573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f60208284031215611af5575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610ef9575f80fd5b5f8060408385031215611b2e575f80fd5b8235611b3981611afc565b946020939093013593505050565b5f805f60608486031215611b59575f80fd5b8335611b6481611afc565b92506020840135611b7481611afc565b929592945050506040919091013590565b5f60208284031215611b95575f80fd5b81356106a081611afc565b5f8060208385031215611bb1575f80fd5b823567ffffffffffffffff80821115611bc8575f80fd5b818501915085601f830112611bdb575f80fd5b813581811115611be9575f80fd5b866020828501011115611bfa575f80fd5b60209290920196919550909350505050565b5f8060408385031215611c1d575f80fd5b823591506020830135611c2f81611afc565b809150509250929050565b5f805f60608486031215611c4c575f80fd5b833592506020840135611c5e81611afc565b91506040840135611c6e81611afc565b809150509250925092565b5f8060408385031215611c8a575f80fd5b8235611c9581611afc565b91506020830135611c2f81611afc565b5f60208284031215611cb5575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215611cf9575f80fd5b815167ffffffffffffffff80821115611d10575f80fd5b818401915084601f830112611d23575f80fd5b815181811115611d3557611d35611cbc565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611d7b57611d7b611cbc565b81604052828152876020848701011115611d93575f80fd5b8260208601602083015e5f928101602001929092525095945050505050565b5f81518060208401855e5f93019283525090919050565b7f577261707065642000000000000000000000000000000000000000000000000081525f6106a06008830184611db2565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b60ff818116838216019081111561065957610659611dfa565b7f770000000000000000000000000000000000000000000000000000000000000081525f6106a06001830184611db2565b8082018082111561065957610659611dfa565b600181815b80851115611edd57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611ec357611ec3611dfa565b80851615611ed057918102915b93841c9390800290611e89565b509250929050565b5f82611ef357506001610659565b81611eff57505f610659565b8160018114611f155760028114611f1f57611f3b565b6001915050610659565b60ff841115611f3057611f30611dfa565b50506001821b610659565b5060208310610133831016604e8410600b8410161715611f5e575081810a610659565b611f688383611e84565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611f9a57611f9a611dfa565b029392505050565b5f6106a060ff841683611ee5565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b600181811c90821680611ff157607f821691505b602082108103612028577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610cd757805f5260205f20601f840160051c810160208510156120535750805b601f840160051c820191505b81811015611221575f815560010161205f565b815167ffffffffffffffff81111561208c5761208c611cbc565b6120a08161209a8454611fdd565b8461202e565b602080601f8311600181146120f2575f84156120bc5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612186565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561213e5788860151825594840194600190910190840161211f565b508582101561217a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b505060018460011b0185555b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60ff8316806121f2577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b8060ff8416069150509291505056"; + hex"608060405234801561000f575f80fd5b50600436106101b0575f3560e01c806370a08231116100f3578063c4d66de811610093578063ce96cb771161006e578063ce96cb77146103c9578063d905777e146103dc578063dd62ed3e146103ef578063ef8b30f7146103b6575f80fd5b8063c4d66de8146103a3578063c63d75b6146102bb578063c6e6f592146103b6575f80fd5b8063a9059cbb116100ce578063a9059cbb14610357578063b3d7f6b91461036a578063b460af941461037d578063ba08765214610390575f80fd5b806370a08231146102f557806394bf804d1461033c57806395d89b411461034f575f80fd5b806323b872dd1161015e578063402d267d11610139578063402d267d146102bb578063439fab91146102cf5780634cdad506146101e45780636e553f65146102e2575f80fd5b806323b872dd14610254578063313ce5671461026757806338d52e0f14610281575f80fd5b8063095ea7b31161018e578063095ea7b3146101f75780630a28a4771461021a57806318160ddd1461022d575f80fd5b806301e1d114146101b457806306fdde03146101cf57806307a2d13a146101e4575b5f80fd5b6101bc610446565b6040519081526020015b60405180910390f35b6101d76104fe565b6040516101c69190611758565b6101bc6101f236600461178d565b6105b6565b61020a6102053660046117b8565b6105c7565b60405190151581526020016101c6565b6101bc61022836600461178d565b6105de565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546101bc565b61020a6102623660046117e2565b6105ea565b61026f61060f565b60405160ff90911681526020016101c6565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546040516001600160a01b0390911681526020016101c6565b6101bc6102c9366004611820565b505f1990565b6101bc6102dd36600461183b565b610662565b6101bc6102f03660046118a7565b61089d565b6101bc610303366004611820565b6001600160a01b03165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00602052604090205490565b6101bc61034a3660046118a7565b6108ce565b6101d76108e9565b61020a6103653660046117b8565b61098d565b6101bc61037836600461178d565b61099a565b6101bc61038b3660046118d5565b6109a6565b6101bc61039e3660046118d5565b610a28565b6101bc6103b1366004611820565b610aa1565b6101bc6103c436600461178d565b610ad4565b6101bc6103d7366004611820565b610adf565b6101bc6103ea366004611820565b610ae8565b6101bc6103fd366004611914565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f6104787f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156104d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104f99190611940565b905090565b60606105317f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b6001600160a01b03166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa15801561056b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105929190810190611984565b6040516020016105a29190611a46565b604051602081830303815290604052905090565b5f6105c1825f610b24565b92915050565b5f336105d4818585610b7b565b5060019392505050565b5f6105c1826001610b8d565b5f336105f7858285610bdb565b610602858585610c8f565b60019150505b9392505050565b5f807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090505f815461065c919074010000000000000000000000000000000000000000900460ff16611aa4565b91505090565b5f8061066c610d1e565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156106985750825b90505f8267ffffffffffffffff1660011480156106b45750303b155b9050811580156106c2575080155b156106f9576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001178555831561075a5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f610767888a018a611820565b90506001600160a01b0381166107a9576040517f7cde9b7200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107b281610d46565b6107d860405180602001604052805f81525060405180602001604052805f815250610d5a565b6040516001600160a01b0382169033907fdf5fabff9e49f8c35d69a1f2d0c5e80c933c31cf836cf70de57e3a6e7dc86ebb905f90a37fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc396505083156108925784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505092915050565b5f5f196108ae565b60405180910390fd5b5f6108b885610ad4565b90506108c633858784610d70565b949350505050565b5f5f195f6108db8561099a565b90506108c633858388610d70565b606061091c7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b6001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610956573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261097d9190810190611984565b6040516020016105a29190611abd565b5f336105d4818585610c8f565b5f6105c1826001610b24565b5f806109b183610adf565b905080851115610a06576040517ffe9cceec0000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101869052604481018290526064016108a5565b5f610a10866105de565b9050610a1f3386868985610de0565b95945050505050565b5f80610a3383610ae8565b905080851115610a88576040517fb94abeec0000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101869052604481018290526064016108a5565b5f610a92866105b6565b9050610a1f338686848a610de0565b5f6040517faf1fbb2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6105c1825f610b8d565b5f6105c16101f2835b6001600160a01b0381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0060205260408120546105c1565b5f610608610b30610446565b610b3b906001611aee565b610b465f600a611be1565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610b729190611aee565b85919085610e7f565b610b888383836001610ec1565b505050565b5f610608610b9c82600a611be1565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610bc89190611aee565b610bd0610446565b610b72906001611aee565b6001600160a01b038381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220545f19811015610c895781811015610c7b576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101829052604481018390526064016108a5565b610c8984848484035f610ec1565b50505050565b6001600160a01b038316610cd1576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f60048201526024016108a5565b6001600160a01b038216610d13576040517fec442f050000000000000000000000000000000000000000000000000000000081525f60048201526024016108a5565b610b88838383610fea565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006105c1565b610d4e611141565b610d5781611181565b50565b610d62611141565b610d6c8282611245565b5050565b610d7a84836112a8565b610d8483826112e4565b826001600160a01b0316846001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78484604051610dd2929190918252602082015260400190565b60405180910390a350505050565b826001600160a01b0316856001600160a01b031614610e0457610e04838683610bdb565b610e0e8382611331565b610e18848361137e565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8585604051610e70929190918252602082015260400190565b60405180910390a45050505050565b5f610eac610e8c836113b9565b8015610ea757505f8480610ea257610ea2611bef565b868809115b151590565b610eb78686866113e5565b610a1f9190611aee565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038516610f24576040517fe602df050000000000000000000000000000000000000000000000000000000081525f60048201526024016108a5565b6001600160a01b038416610f66576040517f94280d620000000000000000000000000000000000000000000000000000000081525f60048201526024016108a5565b6001600160a01b038086165f90815260018301602090815260408083209388168352929052208390558115610fe357836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610fda91815260200190565b60405180910390a35b5050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b0384166110375781816002015f82825461102c9190611aee565b909155506110c09050565b6001600160a01b0384165f90815260208290526040902054828110156110a2576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b038616600482015260248101829052604481018490526064016108a5565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b0383166110de5760028101805483900390556110fc565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610dd291815260200190565b611149611495565b61117f576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611189611141565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005f806111b5846114b3565b91509150816111c55760126111c7565b805b83547fffffffffffffffffffffff000000000000000000000000000000000000000000167401000000000000000000000000000000000000000060ff92909216919091027fffffffffffffffffffffffff000000000000000000000000000000000000000016176001600160a01b0394909416939093179091555050565b61124d611141565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036112998482611cb1565b5060048101610c898382611cb1565b610d6c6112dc7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b83308461156c565b6001600160a01b038216611326576040517fec442f050000000000000000000000000000000000000000000000000000000081525f60048201526024016108a5565b610d6c5f8383610fea565b6001600160a01b038216611373576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f60048201526024016108a5565b610d6c825f83610fea565b610d6c6113b27f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00546001600160a01b031690565b83836115bb565b5f60028260038111156113ce576113ce611d71565b6113d89190611d9e565b60ff166001149050919050565b5f805f6113f28686611609565b91509150815f036114165783818161140c5761140c611bef565b0492505050610608565b81841161142d5761142d6003851502601118611625565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f61149e610d1e565b5468010000000000000000900460ff16919050565b5f805f6114bf60405190565b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce567000000000000000000000000000000000000000000000000000000001790529091505f908190611528908790611636565b509150915061153683604052565b818015611544575060203d10155b8015611551575060ff8111155b61155c575f80611560565b6001815b94509450505050915091565b61157a848484846001611657565b610c89576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016108a5565b6115c883838360016116dd565b610b88576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016108a5565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f805f60405f855160208701885afa92505f51915060205190509250925092565b6040517f23b872dd000000000000000000000000000000000000000000000000000000005f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f511483166116cc5783831516156116c0573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000005f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661174c578383151615611740573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561179d575f80fd5b5035919050565b6001600160a01b0381168114610d57575f80fd5b5f80604083850312156117c9575f80fd5b82356117d4816117a4565b946020939093013593505050565b5f805f606084860312156117f4575f80fd5b83356117ff816117a4565b9250602084013561180f816117a4565b929592945050506040919091013590565b5f60208284031215611830575f80fd5b8135610608816117a4565b5f806020838503121561184c575f80fd5b823567ffffffffffffffff80821115611863575f80fd5b818501915085601f830112611876575f80fd5b813581811115611884575f80fd5b866020828501011115611895575f80fd5b60209290920196919550909350505050565b5f80604083850312156118b8575f80fd5b8235915060208301356118ca816117a4565b809150509250929050565b5f805f606084860312156118e7575f80fd5b8335925060208401356118f9816117a4565b91506040840135611909816117a4565b809150509250925092565b5f8060408385031215611925575f80fd5b8235611930816117a4565b915060208301356118ca816117a4565b5f60208284031215611950575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215611994575f80fd5b815167ffffffffffffffff808211156119ab575f80fd5b818401915084601f8301126119be575f80fd5b8151818111156119d0576119d0611957565b604051601f8201601f19908116603f011681019083821181831017156119f8576119f8611957565b81604052828152876020848701011115611a10575f80fd5b8260208601602083015e5f928101602001929092525095945050505050565b5f81518060208401855e5f93019283525090919050565b7f577261707065642000000000000000000000000000000000000000000000000081525f6106086008830184611a2f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b60ff81811683821601908111156105c1576105c1611a77565b7f770000000000000000000000000000000000000000000000000000000000000081525f6106086001830184611a2f565b808201808211156105c1576105c1611a77565b600181815b80851115611b3b57815f1904821115611b2157611b21611a77565b80851615611b2e57918102915b93841c9390800290611b06565b509250929050565b5f82611b51575060016105c1565b81611b5d57505f6105c1565b8160018114611b735760028114611b7d57611b99565b60019150506105c1565b60ff841115611b8e57611b8e611a77565b50506001821b6105c1565b5060208310610133831016604e8410600b8410161715611bbc575081810a6105c1565b611bc68383611b01565b805f1904821115611bd957611bd9611a77565b029392505050565b5f61060860ff841683611b43565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b600181811c90821680611c3057607f821691505b602082108103611c67577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610b8857805f5260205f20601f840160051c81016020851015611c925750805b601f840160051c820191505b81811015610fe3575f8155600101611c9e565b815167ffffffffffffffff811115611ccb57611ccb611957565b611cdf81611cd98454611c1c565b84611c6d565b602080601f831160018114611d12575f8415611cfb5750858301515b5f19600386901b1c1916600185901b178555611d69565b5f85815260208120601f198616915b82811015611d4057888601518255948401946001909101908401611d21565b5085821015611d5d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60ff831680611dd5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b8060ff8416069150509291505056"; diff --git a/src/generated/StoxWrappedTokenVaultBeacon.pointers.sol b/src/generated/StoxWrappedTokenVaultBeacon.pointers.sol index bb73d27c..438a674d 100644 --- a/src/generated/StoxWrappedTokenVaultBeacon.pointers.sol +++ b/src/generated/StoxWrappedTokenVaultBeacon.pointers.sol @@ -14,11 +14,11 @@ bytes32 constant BYTECODE_HASH = bytes32(0x8e95867e52db417944afd90f3b6c3c9809628 /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x96f85E33a881dF30275d9bA7058D9270b050E6F9); +address constant DEPLOYED_ADDRESS = address(0x9FD790f65CA3aF2772358c653F097f0a4c7EE7d2); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"608060405234801561000f575f80fd5b5073dea4812b74b7cc18abcb8add388fcbac9109ac65738e4bdeec7ceb9570d440676345da1dce10329f5b80610049565b60405180910390fd5b61005281610063565b5061005c826100b2565b5050610130565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100e75760405163211eb15960e21b81526001600160a01b0382166004820152602401610040565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b61035a8061013d5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063715018a61161004d578063715018a6146100c05780638da5cb5b146100c8578063f2fde38b146100e5575f80fd5b80633659cfe6146100685780635c60da1b1461007d575b5f80fd5b61007b610076366004610320565b6100f8565b005b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b61010c565b5f5473ffffffffffffffffffffffffffffffffffffffff16610097565b61007b6100f3366004610320565b61011f565b610100610184565b610109816101d6565b50565b610114610184565b61011d5f6102ac565b565b610127610184565b73ffffffffffffffffffffffffffffffffffffffff811661017b576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610109816102ac565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461011d576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610172565b8073ffffffffffffffffffffffffffffffffffffffff163b5f0361023e576040517f847ac56400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610172565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610330575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610353575f80fd5b939250505056"; + hex"608060405234801561000f575f80fd5b50730d99e0174dbf885ced6ae8deb939b0f890450099738e4bdeec7ceb9570d440676345da1dce10329f5b80610049565b60405180910390fd5b61005281610063565b5061005c826100b2565b5050610130565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100e75760405163211eb15960e21b81526001600160a01b0382166004820152602401610040565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b61035a8061013d5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063715018a61161004d578063715018a6146100c05780638da5cb5b146100c8578063f2fde38b146100e5575f80fd5b80633659cfe6146100685780635c60da1b1461007d575b5f80fd5b61007b610076366004610320565b6100f8565b005b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b61010c565b5f5473ffffffffffffffffffffffffffffffffffffffff16610097565b61007b6100f3366004610320565b61011f565b610100610184565b610109816101d6565b50565b610114610184565b61011d5f6102ac565b565b610127610184565b73ffffffffffffffffffffffffffffffffffffffff811661017b576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610109816102ac565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461011d576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610172565b8073ffffffffffffffffffffffffffffffffffffffff163b5f0361023e576040517f847ac56400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610172565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610330575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610353575f80fd5b939250505056"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = diff --git a/src/generated/StoxWrappedTokenVaultBeaconSetDeployer.pointers.sol b/src/generated/StoxWrappedTokenVaultBeaconSetDeployer.pointers.sol index 7ef3f028..5f540f51 100644 --- a/src/generated/StoxWrappedTokenVaultBeaconSetDeployer.pointers.sol +++ b/src/generated/StoxWrappedTokenVaultBeaconSetDeployer.pointers.sol @@ -10,16 +10,16 @@ pragma solidity ^0.8.25; // file needs the contract to exist so that it can be compiled. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x803324df5e86d2b6e6ef94ba5fca3f0d2ccdcdba32c9feb81255bdce9b05e02e); +bytes32 constant BYTECODE_HASH = bytes32(0xa2c4bd29f36bc6636938f3ad66e6de5d126ce41ed3134bed166cde259d5775ad); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x326eDc56E8F7CcA3555482D65ce4627A021c52FD); +address constant DEPLOYED_ADDRESS = address(0xbe5f05C4576e6D3e7bCCb4E64f08fc4F46Adf0cA); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b506109468061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c806301ffc9a714610038578063d786858b14610060575b5f80fd5b61004b610046366004610333565b610098565b60405190151581526020015b60405180910390f35b61007361006e366004610379565b610130565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610057565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd786858b00000000000000000000000000000000000000000000000000000000148061012a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff821661017e576040517fe51a7ce200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7396f85e33a881df30275d9ba7058d9270b050e6f96040516101a090610326565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff0801580156101e4573d5f803e3d5ffd5b506040805133815273ffffffffffffffffffffffffffffffffffffffff831660208201529192507f82488d8ab594db2178e4a45b7106aaa804836e608f001b5d7fcb6c3514730b3e910160405180910390a16040805173ffffffffffffffffffffffffffffffffffffffff85811660208301527fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3929084169163439fab9191016040516020818303038152906040526040518263ffffffff1660e01b81526004016102af91906103ac565b6020604051808303815f875af11580156102cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ef91906103ff565b1461012a576040517f09c5931500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052f8061041783390190565b5f60208284031215610343575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610372575f80fd5b9392505050565b5f60208284031215610389575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610372575f80fd5b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f6020828403121561040f575f80fd5b505191905056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056"; + hex"6080604052348015600e575f80fd5b506109468061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c806301ffc9a714610038578063d786858b14610060575b5f80fd5b61004b610046366004610333565b610098565b60405190151581526020015b60405180910390f35b61007361006e366004610379565b610130565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610057565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd786858b00000000000000000000000000000000000000000000000000000000148061012a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff821661017e576040517fe51a7ce200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f739fd790f65ca3af2772358c653f097f0a4c7ee7d26040516101a090610326565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff0801580156101e4573d5f803e3d5ffd5b506040805133815273ffffffffffffffffffffffffffffffffffffffff831660208201529192507f82488d8ab594db2178e4a45b7106aaa804836e608f001b5d7fcb6c3514730b3e910160405180910390a16040805173ffffffffffffffffffffffffffffffffffffffff85811660208301527fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3929084169163439fab9191016040516020818303038152906040526040518263ffffffff1660e01b81526004016102af91906103ac565b6020604051808303815f875af11580156102cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ef91906103ff565b1461012a576040517f09c5931500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052f8061041783390190565b5f60208284031215610343575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610372575f80fd5b9392505050565b5f60208284031215610389575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610372575f80fd5b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f6020828403121561040f575f80fd5b505191905056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b5060043610610034575f3560e01c806301ffc9a714610038578063d786858b14610060575b5f80fd5b61004b610046366004610333565b610098565b60405190151581526020015b60405180910390f35b61007361006e366004610379565b610130565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610057565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd786858b00000000000000000000000000000000000000000000000000000000148061012a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff821661017e576040517fe51a7ce200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7396f85e33a881df30275d9ba7058d9270b050e6f96040516101a090610326565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff0801580156101e4573d5f803e3d5ffd5b506040805133815273ffffffffffffffffffffffffffffffffffffffff831660208201529192507f82488d8ab594db2178e4a45b7106aaa804836e608f001b5d7fcb6c3514730b3e910160405180910390a16040805173ffffffffffffffffffffffffffffffffffffffff85811660208301527fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3929084169163439fab9191016040516020818303038152906040526040518263ffffffff1660e01b81526004016102af91906103ac565b6020604051808303815f875af11580156102cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ef91906103ff565b1461012a576040517f09c5931500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052f8061041783390190565b5f60208284031215610343575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610372575f80fd5b9392505050565b5f60208284031215610389575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610372575f80fd5b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f6020828403121561040f575f80fd5b505191905056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056"; + hex"608060405234801561000f575f80fd5b5060043610610034575f3560e01c806301ffc9a714610038578063d786858b14610060575b5f80fd5b61004b610046366004610333565b610098565b60405190151581526020015b60405180910390f35b61007361006e366004610379565b610130565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610057565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd786858b00000000000000000000000000000000000000000000000000000000148061012a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff821661017e576040517fe51a7ce200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f739fd790f65ca3af2772358c653f097f0a4c7ee7d26040516101a090610326565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff0801580156101e4573d5f803e3d5ffd5b506040805133815273ffffffffffffffffffffffffffffffffffffffff831660208201529192507f82488d8ab594db2178e4a45b7106aaa804836e608f001b5d7fcb6c3514730b3e910160405180910390a16040805173ffffffffffffffffffffffffffffffffffffffff85811660208301527fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3929084169163439fab9191016040516020818303038152906040526040518263ffffffff1660e01b81526004016102af91906103ac565b6020604051808303815f875af11580156102cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ef91906103ff565b1461012a576040517f09c5931500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61052f8061041783390190565b5f60208284031215610343575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610372575f80fd5b9392505050565b5f60208284031215610389575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610372575f80fd5b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f6020828403121561040f575f80fd5b505191905056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056"; diff --git a/src/lib/LibProdDeployV2.sol b/src/lib/LibProdDeployV2.sol index ee0fb469..201e0218 100644 --- a/src/lib/LibProdDeployV2.sol +++ b/src/lib/LibProdDeployV2.sol @@ -6,7 +6,7 @@ pragma solidity ^0.8.25; /// @notice V2 production deployment addresses and codehashes, hardcoded to /// match what is actually deployed on-chain via the Zoltu deterministic /// deployer. These values are an audit trail — do not update them. -/// For current (undeployed) code, see LibProdDeployV3. +/// For the current code, see LibProdDeployV4. library LibProdDeployV2 { /// @dev The initial owner for all V2 beacons. Resolves to rainlang.eth. address constant BEACON_INITIAL_OWNER = address(0x8E4bdeec7CEB9570D440676345dA1dCe10329f5b); @@ -49,4 +49,49 @@ library LibProdDeployV2 { address(0x72b2a394E129ede556b4024aCe939a964bA0a876); bytes32 constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_CODEHASH = bytes32(0xd71cc144cb671b6eeece0598e613ddc712c059e6448857bdeaec58f188cbbba8); + + /// @dev Frozen creation bytecode of StoxReceipt as compiled and deployed + /// for V2 via the Zoltu factory. Historical literal; never recompiled. + bytes constant PROD_STOX_RECEIPT_CREATION_BYTECODE_V2 = + hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b612c15806100d65f395ff3fe608060405234801561000f575f80fd5b50600436106100fa575f3560e01c8063481c6a7511610093578063a22cb46511610063578063a22cb4651461023f578063c2530e3914610252578063e985e9c514610265578063f242432a146102cc575f80fd5b8063481c6a75146101bd5780634e1273f4146102045780636d5b3f781461022457806395d89b4114610237575f80fd5b80630e89341c116100ce5780630e89341c14610171578063177769cb146101845780632eb2c2d614610197578063439fab91146101aa575f80fd5b8062fdd58e146100fe57806301ffc9a714610124578063043fa9871461014757806306fdde031461015c575b5f80fd5b61011161010c36600461200d565b6102df565b6040519081526020015b60405180910390f35b610137610132366004612064565b610334565b604051901515815260200161011b565b61015a610155366004612199565b610416565b005b6101646104e0565b60405161011b9190612267565b61016461017f366004612279565b610545565b61015a610192366004612290565b610614565b61015a6101a536600461235e565b61062a565b6101116101b8366004612405565b610733565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161011b565b61021761021236600461243f565b61094b565b60405161011b919061252b565b61015a61023236600461253d565b610a2f565b610164610afa565b61015a61024d3660046125a1565b610b4b565b61015a61026036600461253d565b610b5d565b6101376102733660046125dc565b73ffffffffffffffffffffffffffffffffffffffff9182165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45016020908152604080832093909416825291909152205460ff1690565b61015a6102da36600461253d565b610bdb565b5f8181527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45006020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014806103c657507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061032e57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461032e565b61041e610cd7565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790558561048b8686868686610d68565b6104d77fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b50505050505050565b60606104ea610e38565b6040518060400160405280600881526020017f205265636569707400000000000000000000000000000000000000000000000081525060405160200161053192919061261f565b604051602081830303815290604052905090565b60605f61055b610553610f11565b60ff16610fc3565b610563610e38565b61056b61107f565b6105736104e0565b6040516020016105869493929190612633565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152601d82527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000602083015291506105ec82611179565b6040516020016105fd92919061261f565b604051602081830303815290604052915050919050565b61062661061f611185565b83836111f6565b5050565b5f610633611185565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156106c2575073ffffffffffffffffffffffffffffffffffffffff8087165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4501602090815260408083209385168352929052205460ff16155b1561071e576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8083166004830152871660248201526044015b60405180910390fd5b61072b868686868661123e565b505050505050565b5f8061073d6112f0565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156107695750825b90505f8267ffffffffffffffff1660011480156107855750303b155b905081158015610793575080155b156107ca576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001178555831561082b5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61084260405180602001604052805f815250611318565b5f7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20090505f8880602001905181019061087b9190612775565b82547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9190911617909155507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3955083156109415784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b6060815183511461099557815183516040517f5b05999100000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610715565b5f835167ffffffffffffffff8111156109b0576109b0612086565b6040519080825280602002602001820160405280156109d9578160200160208202803683370190505b5090505f5b8451811015610a2757602080820286010151610a02906020808402870101516102df565b828281518110610a1457610a14612790565b60209081029190910101526001016109de565b509392505050565b610a37610cd7565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871617905584610aa28685846111f6565b610aae85858585611329565b61072b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6060610b04610e38565b6040518060400160405280600581526020017f205243505400000000000000000000000000000000000000000000000000000081525060405160200161053192919061261f565b610626610b56611185565b83836113aa565b610b65610cd7565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc20180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871617905584610bd08685846111f6565b610aae8585856114b4565b5f610be4611185565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610c73575073ffffffffffffffffffffffffffffffffffffffff8087165f9081527f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c4501602090815260408083209385168352929052205460ff16155b15610cca576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808316600483015287166024820152604401610715565b61072b8686868686610d68565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200805473ffffffffffffffffffffffffffffffffffffffff16610d18611185565b73ffffffffffffffffffffffffffffffffffffffff1614610d65576040517fc0b2335a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8416610db7576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f6004820152602401610715565b73ffffffffffffffffffffffffffffffffffffffff8516610e06576040517f01a835140000000000000000000000000000000000000000000000000000000081525f6004820152602401610715565b604080516001808252602082018690528183019081526060820185905260808201909252906104d7878784848761153d565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f95d89b4100000000000000000000000000000000000000000000000000000000815290516060939273ffffffffffffffffffffffffffffffffffffffff16916395d89b41916004808301925f9291908290030181865afa158015610ec6573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f0b91908101906127bd565b91505090565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f313ce56700000000000000000000000000000000000000000000000000000000815290515f939273ffffffffffffffffffffffffffffffffffffffff169163313ce5679160048083019260209291908290030181865afa158015610f9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0b9190612832565b60605f610fcf836115a6565b60010190505f8167ffffffffffffffff811115610fee57610fee612086565b6040519080825280601f01601f191660200182016040528015611018576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461102257509392505050565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2008054604080517f38d52e0f00000000000000000000000000000000000000000000000000000000815290516060939273ffffffffffffffffffffffffffffffffffffffff16916338d52e0f9160048083019260209291908290030181865afa15801561110e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111329190612775565b73ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610ec6573d5f803e3d5ffd5b606061032e825f611687565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc201545f907fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc2009073ffffffffffffffffffffffffffffffffffffffff1680156111ed57806111ef565b335b9250505090565b805115611239577fd66d6a9810a5cef78b704e7e04334961e997c81d337f029f74637f060f3d8d6583838360405161123093929190612852565b60405180910390a15b505050565b73ffffffffffffffffffffffffffffffffffffffff841661128d576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f6004820152602401610715565b73ffffffffffffffffffffffffffffffffffffffff85166112dc576040517f01a835140000000000000000000000000000000000000000000000000000000081525f6004820152602401610715565b6112e9858585858561153d565b5050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061032e565b611320611806565b610d6581611846565b73ffffffffffffffffffffffffffffffffffffffff8416611378576040517f57f447ce0000000000000000000000000000000000000000000000000000000081525f6004820152602401610715565b6040805160018082526020820186905281830190815260608201859052608082019092529061072b5f8784848761153d565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c450073ffffffffffffffffffffffffffffffffffffffff831661141a576040517fced3e1000000000000000000000000000000000000000000000000000000000081525f6004820152602401610715565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260018401602090815260408083209488168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8316611503576040517f01a835140000000000000000000000000000000000000000000000000000000081525f6004820152602401610715565b604080516001808252602082018590528183019081526060820184905260a082019092525f608082018181529192916112e9918791859085905b61154985858585611857565b73ffffffffffffffffffffffffffffffffffffffff8416156112e9575f61156e611185565b9050835160010361159857602084810151908401516115918389898585896118fa565b505061072b565b61072b818787878787611ae9565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106115ee577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831061161a576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061163857662386f26fc10000830492506010015b6305f5e1008310611650576305f5e100830492506008015b612710831061166457612710830492506004015b60648310611676576064830492506002015b600a831061032e5760010192915050565b606082515f036116a5575060408051602081019091525f815261032e565b5f826116d5576003845160026116bb91906128bc565b6116c591906128cf565b6116d0906004612907565b6116fa565b6003845160046116e59190612907565b6116f09060026128bc565b6116fa91906128cf565b905060405191507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f5261067083027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f18603f526020820181810185865187016020810180515f82525b828410156117b8576003840193508351603f8160121c16518753600187019650603f81600c1c16518753600187019650603f8160061c16518753600187019650603f811651875350600186019550611765565b9052508590506117f9576003865106600181146117dc57600281146117ef576117f7565b603d6001840353603d60028403536117f7565b603d60018403535b505b9183525060405292915050565b61180e611c78565b611844576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61184e611806565b610d6581611c96565b7fe5444a702a2f437387f4eb075af275e349f1dba9a68923d27352f035d01dc200805473ffffffffffffffffffffffffffffffffffffffff1663e5be7d9061189d611185565b878787876040518663ffffffff1660e01b81526004016118c195949392919061291e565b5f604051808303815f87803b1580156118d8575f80fd5b505af11580156118ea573d5f803e3d5ffd5b505050506112e985858585611ce2565b73ffffffffffffffffffffffffffffffffffffffff84163b1561072b576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e6190611971908990899088908890889060040161297c565b6020604051808303815f875af19250505080156119c9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526119c6918101906129cb565b60015b611a56573d8080156119f6576040519150601f19603f3d011682016040523d82523d5f602084013e6119fb565b606091505b5080515f03611a4e576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602401610715565b805160208201fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146104d7576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602401610715565b73ffffffffffffffffffffffffffffffffffffffff84163b1561072b576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c8190611b6090899089908890889088906004016129e6565b6020604051808303815f875af1925050508015611bb8575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611bb5918101906129cb565b60015b611be5573d8080156119f6576040519150601f19603f3d011682016040523d82523d5f602084013e6119fb565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146104d7576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86166004820152602401610715565b5f611c816112f0565b5468010000000000000000900460ff16919050565b7f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45007f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45026112398382612ad9565b805182517f88be536d5240c274a3b1d3a1be54482fd9caa294f08c62a7cde569f49a3c45009114611d4c57825182516040517f5b05999100000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610715565b5f611d55611185565b90505f5b8451811015611ebf5760208181028681018201519086019091015173ffffffffffffffffffffffffffffffffffffffff891615611e57575f8281526020868152604080832073ffffffffffffffffffffffffffffffffffffffff8d16845290915290205481811015611e24576040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b166004820152602481018290526044810183905260648101849052608401610715565b5f8381526020878152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290209082900390555b73ffffffffffffffffffffffffffffffffffffffff881615611eb5575f8281526020868152604080832073ffffffffffffffffffffffffffffffffffffffff8c16845290915281208054839290611eaf9084906128bc565b90915550505b5050600101611d59565b508351600103611f665760208401515f9060208501519091508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051611f57929190918252602082015260400190565b60405180910390a4505061072b565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611fdc929190612bf1565b60405180910390a4505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610d65575f80fd5b5f806040838503121561201e575f80fd5b823561202981611fec565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610d65575f80fd5b5f60208284031215612074575f80fd5b813561207f81612037565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156120fa576120fa612086565b604052919050565b5f67ffffffffffffffff82111561211b5761211b612086565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112612156575f80fd5b813561216961216482612102565b6120b3565b81815284602083860101111561217d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c087890312156121ae575f80fd5b86356121b981611fec565b955060208701356121c981611fec565b945060408701356121d981611fec565b9350606087013592506080870135915060a087013567ffffffffffffffff811115612202575f80fd5b61220e89828a01612147565b9150509295509295509295565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f61207f602083018461221b565b5f60208284031215612289575f80fd5b5035919050565b5f80604083850312156122a1575f80fd5b82359150602083013567ffffffffffffffff8111156122be575f80fd5b6122ca85828601612147565b9150509250929050565b5f67ffffffffffffffff8211156122ed576122ed612086565b5060051b60200190565b5f82601f830112612306575f80fd5b81356020612316612164836122d4565b8083825260208201915060208460051b870101935086841115612337575f80fd5b602086015b84811015612353578035835291830191830161233c565b509695505050505050565b5f805f805f60a08688031215612372575f80fd5b853561237d81611fec565b9450602086013561238d81611fec565b9350604086013567ffffffffffffffff808211156123a9575f80fd5b6123b589838a016122f7565b945060608801359150808211156123ca575f80fd5b6123d689838a016122f7565b935060808801359150808211156123eb575f80fd5b506123f888828901612147565b9150509295509295909350565b5f60208284031215612415575f80fd5b813567ffffffffffffffff81111561242b575f80fd5b61243784828501612147565b949350505050565b5f8060408385031215612450575f80fd5b823567ffffffffffffffff80821115612467575f80fd5b818501915085601f83011261247a575f80fd5b8135602061248a612164836122d4565b82815260059290921b840181019181810190898411156124a8575f80fd5b948201945b838610156124cf5785356124c081611fec565b825294820194908201906124ad565b965050860135925050808211156124e4575f80fd5b506122ca858286016122f7565b5f815180845260208085019450602084015f5b8381101561252057815187529582019590820190600101612504565b509495945050505050565b602081525f61207f60208301846124f1565b5f805f805f60a08688031215612551575f80fd5b853561255c81611fec565b9450602086013561256c81611fec565b93506040860135925060608601359150608086013567ffffffffffffffff811115612595575f80fd5b6123f888828901612147565b5f80604083850312156125b2575f80fd5b82356125bd81611fec565b9150602083013580151581146125d1575f80fd5b809150509250929050565b5f80604083850312156125ed575f80fd5b82356125f881611fec565b915060208301356125d181611fec565b5f81518060208401855e5f93019283525090919050565b5f61243761262d8386612608565b84612608565b7f7b22646563696d616c73223a000000000000000000000000000000000000000081525f612664600c830187612608565b7f2c226465736372697074696f6e223a2231206f6620746865736520726563656981527f7074732063616e206265206275726e656420616c6f6e6773696465203120000060208201526126ba603e820187612608565b90507f20746f2072656465656d2000000000000000000000000000000000000000000081526126ec600b820186612608565b90507f2066726f6d20746865207661756c742e222c000000000000000000000000000081527f226e616d65223a220000000000000000000000000000000000000000000000006012820152612744601a820185612608565b7f227d0000000000000000000000000000000000000000000000000000000000008152600201979650505050505050565b5f60208284031215612785575f80fd5b815161207f81611fec565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156127cd575f80fd5b815167ffffffffffffffff8111156127e3575f80fd5b8201601f810184136127f3575f80fd5b805161280161216482612102565b818152856020838501011115612815575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b5f60208284031215612842575f80fd5b815160ff8116811461207f575f80fd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f612886606083018461221b565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561032e5761032e61288f565b5f82612902577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808202811582820484141761032e5761032e61288f565b5f73ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015280861660408401525060a0606083015261295e60a08301856124f1565b828103608084015261297081856124f1565b98975050505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a060808301526129c060a083018461221b565b979650505050505050565b5f602082840312156129db575f80fd5b815161207f81612037565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a06040830152612a1e60a08301866124f1565b8281036060840152612a3081866124f1565b90508281036080840152612970818561221b565b600181811c90821680612a5857607f821691505b602082108103612a8f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f82111561123957805f5260205f20601f840160051c81016020851015612aba5750805b601f840160051c820191505b818110156112e9575f8155600101612ac6565b815167ffffffffffffffff811115612af357612af3612086565b612b0781612b018454612a44565b84612a95565b602080601f831160018114612b59575f8415612b235750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561072b565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612ba557888601518255948401946001909101908401612b86565b5085821015612be157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b604081525f612c0360408301856124f1565b828103602084015261288681856124f156"; + + /// @dev Frozen creation bytecode of StoxReceiptVault as compiled and deployed + /// for V2 via the Zoltu factory. Historical literal; never recompiled. + bytes constant PROD_STOX_RECEIPT_VAULT_CREATION_BYTECODE_V2 = + hex"608060405234801561000f575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005561003c610041565b6100f3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100915760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100f05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6152a5806101005f395ff3fe608060405260043610610307575f3560e01c8063715018a611610197578063bbec4d06116100df578063dd62ed3e1161008e578063e70689f51161006b578063e70689f514610a08578063f2fde38b14610a27578063f564794314610a46578063f5d214f514610a7b57005b8063dd62ed3e14610930578063e1e6b898146109a0578063e5be7d90146109e957005b8063c77b66c2116100bc578063c77b66c2146108f6578063d09edf3114610909578063db2088f41461091d57005b8063bbec4d06146108b8578063c54cafee146108d7578063c63d75b61461052c57005b80638da5cb5b11610146578063a9059cbb11610123578063a9059cbb146107ee578063ac9650d81461080d578063ae57de0c14610839578063ae98b39f1461085857005b80638da5cb5b146107a7578063921a4c42146107bb57806395d89b41146107da57005b80637a7af70d116101745780637a7af70d1461075657806381c3fcb91461076957806385b687561461078857005b8063715018a614610704578063770afee114610718578063786cd9161461073757005b8063276b11401161025a5780634abe413711610209578063633ac717116101e6578063633ac717146106065780636ba23521146106255780636c876b941461068557806370a08231146106a457005b80634abe4137146105a957806356db02e8146105c857806359f89dda146105e757005b8063402d267d11610237578063402d267d1461052c578063439fab911461056b578063488bd7b01461058a57005b8063276b1140146104ba578063313ce567146104cd57806338d52e0f146104f357005b806318160ddd116102b65780631f6759d3116102935780631f6759d31461044957806323b872dd1461047c5780632755c6c71461049b57005b806318160ddd146103d8578063181e7b3b1461040b5780631e4344a11461042a57005b806306fdde03116102e457806306fdde0314610385578063095ea7b3146103a65780631423feba146103c557005b806301e1d1141461031057806301ffc9a714610337578063058a628f1461036657005b3661030e57005b005b34801561031b575f80fd5b50610324610aae565b6040519081526020015b60405180910390f35b348015610342575f80fd5b50610356610351366004614159565b610adc565b604051901515815260200161032e565b348015610371575f80fd5b5061030e6103803660046141b9565b610b37565b348015610390575f80fd5b50610399610b4b565b60405161032e9190614220565b3480156103b1575f80fd5b506103566103c0366004614232565b610c1e565b6103246103d33660046143bb565b610c35565b3480156103e3575f80fd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610324565b348015610416575f80fd5b5061032461042536600461441a565b610c7f565b348015610435575f80fd5b5061030e61044436600461443a565b610c9e565b348015610454575f80fd5b507f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70054610324565b348015610487575f80fd5b50610356610496366004614451565b610d37565b3480156104a6575f80fd5b5061030e6104b5366004614232565b610d5a565b6103246104c836600461441a565b610ecd565b3480156104d8575f80fd5b506104e1610ef8565b60405160ff909116815260200161032e565b3480156104fe575f80fd5b50610507610fb7565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161032e565b348015610537575f80fd5b506103246105463660046141b9565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b348015610576575f80fd5b5061032461058536600461448f565b610ff8565b348015610595575f80fd5b506103246105a436600461441a565b6112bc565b3480156105b4575f80fd5b506103246105c3366004614232565b6112d4565b3480156105d3575f80fd5b506103246105e23660046144c1565b6113a8565b3480156105f2575f80fd5b5061030e610601366004614508565b611744565b348015610611575f80fd5b5061030e6106203660046141b9565b61177c565b348015610630575f80fd5b5061032461063f3660046141b9565b73ffffffffffffffffffffffffffffffffffffffff165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be701602052604090205490565b348015610690575f80fd5b5061030e61069f3660046141b9565b6118de565b3480156106af575f80fd5b506103246106be3660046141b9565b73ffffffffffffffffffffffffffffffffffffffff165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00602052604090205490565b34801561070f575f80fd5b5061030e611a06565b348015610723575f80fd5b50610324610732366004614508565b611a19565b348015610742575f80fd5b5061030e610751366004614232565b611c2e565b61032461076436600461441a565b611d93565b348015610774575f80fd5b5061030e61078336600461448f565b611da8565b348015610793575f80fd5b506103246107a2366004614232565b611de4565b3480156107b2575f80fd5b50610507611ec8565b3480156107c6575f80fd5b506103246107d536600461455d565b611ed1565b3480156107e5575f80fd5b50610399611efe565b3480156107f9575f80fd5b50610356610808366004614232565b611f4f565b348015610818575f80fd5b5061082c6108273660046145ce565b611f5c565b60405161032e919061463d565b348015610844575f80fd5b5061032461085336600461455d565b612042565b348015610863575f80fd5b506103246108723660046141b9565b73ffffffffffffffffffffffffffffffffffffffff165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be702602052604090205490565b3480156108c3575f80fd5b506103246108d236600461441a565b612065565b3480156108e2575f80fd5b506103246108f1366004614702565b612073565b6103246109043660046143bb565b61215b565b348015610914575f80fd5b5061050761218a565b61032461092b36600461441a565b6121b2565b34801561093b575f80fd5b5061032461094a366004614767565b73ffffffffffffffffffffffffffffffffffffffff9182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b3480156109ab575f80fd5b507f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326015473ffffffffffffffffffffffffffffffffffffffff16610507565b3480156109f4575f80fd5b5061030e610a03366004614810565b6121c6565b348015610a13575f80fd5b5061030e610a223660046148a6565b61230a565b348015610a32575f80fd5b5061030e610a413660046141b9565b612480565b348015610a51575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd02544211610356565b348015610a86575f80fd5b507fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0154610324565b5f610ad77f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b905090565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda000000000000000000000000000000000000000000000000000000001480610b315750610b31826124e0565b92915050565b610b3f61260e565b610b4881612666565b50565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610b9c906148fe565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc8906148fe565b8015610c135780601f10610bea57610100808354040283529160200191610c13565b820191905f5260205f20905b815481529060010190602001808311610bf657829003601f168201915b505050505091505090565b5f33610c2b8185856127e0565b5060019392505050565b5f80610c3f6127f2565b90505f610c5987610c53335b89865f612849565b8761285d565b9050610c688787838588612873565b610c73335b47612ab4565b9150505b949350505050565b5f610c9783670de0b6b3a7640000612b5d565b612b5d565b9392505050565b610ca661260e565b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be7008054821115610cd4578181555b7fff9fd4facd8bd30d905cc7ffbd03e8829a414df4c6554d155d132c3377868a42610cfd611ec8565b82546040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083018690528201526060015b60405180910390a15050565b5f33610d44858285612b69565b610d4f858585612c56565b506001949350505050565b610d6261260e565b805f03610db8576040517f5a60845300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115610e4f5773ffffffffffffffffffffffffffffffffffffffff83165f90815260028201602052604090208290555b7fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd610e78611ec8565b73ffffffffffffffffffffffffffffffffffffffff8581165f818152600286016020908152604091829020548251959094168552840191909152820185905260608201526080015b60405180910390a1505050565b5f80610eed84610ee7335b33610ee16127f2565b5f612849565b85612cff565b9050610c9733610c6d565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080545f919073ffffffffffffffffffffffffffffffffffffffff16803b80610f42576012610faf565b8173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f8b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610faf919061494f565b935050505090565b5f807f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326005b5473ffffffffffffffffffffffffffffffffffffffff1692915050565b5f80611002612d16565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f8115801561102e5750825b90505f8267ffffffffffffffff16600114801561104a5750303b155b905081158015611058575080155b1561108f576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156110f05784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f8780602001905181019061110591906149bc565b90506111148160200151612d3e565b60208101515173ffffffffffffffffffffffffffffffffffffffff1615611167576040517f8951799200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff166111b5576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111be30612666565b80516111c990612ed8565b7ffa89761502e992c8c755fba778ced00f4562485023f656906eb76f5dd65a9fe533604080518082018252845173ffffffffffffffffffffffffffffffffffffffff168152602080860151908201529051611225929190614ab3565b60405180910390a17fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc396505083156112b25784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b5f610c97836112cf335b33866001612849565b612f6d565b5f6113137f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326015473ffffffffffffffffffffffffffffffffffffffff1690565b6040517efdd58e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015260248201859052919091169062fdd58e90604401602060405180830381865afa158015611384573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c979190614b64565b5f6113b1612f7a565b825f036113ea576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6114c88461142d7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326015473ffffffffffffffffffffffffffffffffffffffff1690565b6040517efdd58e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152602482018a9052919091169062fdd58e90604401602060405180830381865afa15801561149e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114c29190614b64565b90612fa8565b9050801561160c577f88e2280ece62e9296d3578b77647db2c11f9fa7e42578e2db5d4262123ffae3e33878787858860405161150996959493929190614b7b565b60405180910390a17f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326015473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663043fa98733883360405160e085901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff938416600482015291831660248301529091166044820152606481018890526084810184905260c060a48201525f60c482015260e4015f604051808303815f87803b1580156115f5575f80fd5b505af1158015611607573d5f803e3d5ffd5b505050505b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00805490915073ffffffffffffffffffffffffffffffffffffffff166359f89dda337f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e36040518060a001604052808c73ffffffffffffffffffffffffffffffffffffffff1681526020018b81526020018a8152602001878152602001898152506040516020016116bd9190614bd1565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016116ea93929190614c29565b5f604051808303815f87803b158015611701575f80fd5b505af1158015611713573d5f803e3d5ffd5b5093945050505050610c7760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b8282826040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610daf93929190614c29565b61178461260e565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70260205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700904210156118545773ffffffffffffffffffffffffffffffffffffffff82165f818152600283016020526040908190205490517f81a7897700000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610daf565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526002820160205260408120557fa1e5b368dc99c8558f28b1e7e8cb7ab542c989a4b697628ba7bfffe0aeaccffd6118a4611ec8565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291851660208301525f9082018190526060820152608001610d2b565b6118e661260e565b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be700904210156119b65773ffffffffffffffffffffffffffffffffffffffff82165f818152600183016020526040908190205490517ff1b01b5400000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610daf565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526001820160205260408120557fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af253269544749916118a4611ec8565b611a0e61260e565b611a175f612ed8565b565b5f611a22612f7a565b825f03611a5b576040517f312497b000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611aaa846114c28773ffffffffffffffffffffffffffffffffffffffff165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00602052604090205490565b90508015611afc577f3fc1c49e72362e91416388fe7a107b92db924642476e83e701eeeb6256d7249e3386868487604051611ae9959493929190614c5d565b60405180910390a1611afc853383612c56565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00805490915073ffffffffffffffffffffffffffffffffffffffff166359f89dda337f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed60405180608001604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200187815260200189815250604051602001611ba79190614ca1565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401611bd493929190614c29565b5f604051808303815f87803b158015611beb575f80fd5b505af1158015611bfd573d5f803e3d5ffd5b5093945050505050610c9760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b611c3661260e565b805f03611c87576040517ffd86061b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610daf565b73ffffffffffffffffffffffffffffffffffffffff82165f9081527f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70160205260409020547f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70090821115611d1e5773ffffffffffffffffffffffffffffffffffffffff83165f90815260018201602052604090208290555b7fd08871fffa9d03c01fcba597af5dfbe64cb26f207debdae1af25326954474991611d47611ec8565b73ffffffffffffffffffffffffffffffffffffffff8581165f81815260018601602090815260409182902054825195909416855284019190915282018590526060820152608001610ec0565b5f80610eed84611da233610ed8565b8561285d565b7fdaffad82f53a38a62340f14cdd6fd3b437c5dcda6b32029dac1e661dbce28b2d3382604051611dd9929190614cef565b60405180910390a150565b5f610c97611e267f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326015473ffffffffffffffffffffffffffffffffffffffff1690565b6040517efdd58e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201869052919091169062fdd58e90604401602060405180830381865afa158015611e97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ebb9190614b64565b610c928586866001612849565b5f610ad7612fb7565b5f80611ee487610c928789886001612849565b9050611ef48187878a8888612fdf565b9695505050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610b9c906148fe565b5f33610c2b818585612c56565b604080515f8152602081019091526060908267ffffffffffffffff811115611f8657611f8661425c565b604051908082528060200260200182016040528015611fb957816020015b6060815260200190600190039081611fa45790505b5091505f5b8381101561203a5761201530868684818110611fdc57611fdc614d4a565b9050602002810190611fee9190614d77565b8560405160200161200193929190614dd8565b604051602081830303815290604052613400565b83828151811061202757612027614d4a565b6020908102919091010152600101611fbe565b505092915050565b5f80612055876112cf8789886001612849565b9050611ef4878787848888612fdf565b5f610c9783610c92336112c6565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00908511156120f5576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101869052602401610daf565b5f61210c88612106338a8a5f612849565b5f61285d565b90506121508888838989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061287392505050565b979650505050505050565b5f806121656127f2565b90505f61217b8761217533610c4b565b87612cff565b9050610c688187898588612873565b5f807fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00610fdb565b5f80610eed84670de0b6b3a7640000612106565b6121d385858585856134b5565b6121dd8484613525565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080546040805160a08101825273ffffffffffffffffffffffffffffffffffffffff88811682528781166020830152918101869052606081018590529116906359f89dda9088907f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4890608081016122947fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b151590526040516122a89190602001614e35565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016122d593929190614c29565b5f604051808303815f87803b1580156122ec575f80fd5b505af11580156122fe573d5f803e3d5ffd5b50505050505050505050565b835f03612343576040517f8672985d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090505f6040518060a001604052808360020154815260200183600201548152602001878152602001861515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250905084806123dd5750816002015486115b156123f15760028201869055602081018690525b7f7ef5cae78e9bd364afb19bb0f8a881a6d156e35a119e28c0d17524e5079581583387878787604051612428959493929190614ed2565b60405180910390a1815473ffffffffffffffffffffffffffffffffffffffff166359f89dda337f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d053391846040516020016122a89190614f4b565b61248861260e565b73ffffffffffffffffffffffffffffffffffffffff81166124d7576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610daf565b610b4881612ed8565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fe5be7d9000000000000000000000000000000000000000000000000000000000148061257257507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b806125be57507fffffffff0000000000000000000000000000000000000000000000000000000082167fe1e6b89800000000000000000000000000000000000000000000000000000000145b80610b3157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610b31565b33612617611ec8565b73ffffffffffffffffffffffffffffffffffffffff1614611a17576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610daf565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f59f89dda00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa1580156126ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127129190614f8f565b612748576040517ffd12061600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811782556040805133815260208101929092527fa8c713fe8fb360697fc0daab836d85208a605d485fbc265aea0f773fc6cdd71a9101610d2b565b6127ed838383600161360b565b505050565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01545f907fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0090612843906001614faa565b91505090565b5f670de0b6b3a76400005b95945050505050565b5f6128688284613774565b610c7784845f6137b8565b61287b612f7a565b845f036128b4576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f036128ed576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff841661293a576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f03612975576040517fe4a471820000000000000000000000000000000000000000000000000000000081525f6004820152602401610daf565b7f3377bcbed49a0c0005e53931cd8fe7334b5371523e5de784c0d0d3d01089cfea3385878686866040516129ae96959493929190614b7b565b60405180910390a16129c385858585856137cd565b6129cd8484613828565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517f6d5b3f7800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690636d5b3f7890612a4a9033908890879089908890600401614c5d565b5f604051808303815f87803b158015612a61575f80fd5b505af1158015612a73573d5f803e3d5ffd5b50505050612a848585858585613882565b612aad60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b80471015612af7576040517fcf47918100000000000000000000000000000000000000000000000000000000815247600482015260248101829052604401610daf565b612b10828260405180602001604052805f815250613955565b15612b19575050565b3d15612b2b57612b2761396a565b5050565b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610c97838383613975565b73ffffffffffffffffffffffffffffffffffffffff8381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015612c505781811015612c42576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401610daf565b612c5084848484035f61360b565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316612ca5576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610daf565b73ffffffffffffffffffffffffffffffffffffffff8216612cf4576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610daf565b6127ed83838361398a565b5f612d0a8284613774565b610c7784846001613975565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b31565b612d46613b1e565b612d5881602001518260400151613b26565b80517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f308970152310243260080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff93841617825560608401517f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601805490921693169283179055604080517f481c6a75000000000000000000000000000000000000000000000000000000008152905191925f92909163481c6a759160048083019260209291908290030181865afa158015612e45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e699190614fbd565b905073ffffffffffffffffffffffffffffffffffffffff811630146127ed576040517f7935475e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff82166024820152604401610daf565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f610c97838360016137b8565b612f82613b38565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f828218828410028218610c97565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300610fdb565b612fe7612f7a565b855f03613020576040517fc7838b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f03613059576040517ffc8c806300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85166130a6576040517f6ba9ecd800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166130f3576040517f9905827b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f0361312f576040517fe4a4718200000000000000000000000000000000000000000000000000000000815260048101839052602401610daf565b7f2845b9458bcc357e1abfe8de7f6832dfe7220596a053496b33d0deb6577d8d2a3386868987878760405161316a9796959493929190614fd8565b60405180910390a173ffffffffffffffffffffffffffffffffffffffff8416331461330d5761319a843385612b69565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326015473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e985e9c585336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604401602060405180830381865afa15801561325d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132819190614f8f565b61330d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f7665640000000000000000000000000000000000006064820152608401610daf565b6133178484613b93565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f3089701523102432601546040517fc2530e3900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063c2530e39906133949033908890879089908890600401614c5d565b5f604051808303815f87803b1580156133ab575f80fd5b505af11580156133bd573d5f803e3d5ffd5b505050506133cf868686868686613bed565b6133f860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050505050565b60605f61340d8484613d1d565b905080801561343b57505f3d118061343b57505f8473ffffffffffffffffffffffffffffffffffffffff163b115b1561345057613448613d30565b915050610b31565b80156134a0576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610daf565b3d15612b2b576134ae61396a565b5092915050565b7f8d198d032a58038629cc32dfaad5ea74a8e78fabf390f30897015231024326015473ffffffffffffffffffffffffffffffffffffffff163314612aad576040517f8813aac300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f04485615b1da6633eec3daf54aadca2a89ef8b155744e223a046f4a6e38be70080544210801561357a575073ffffffffffffffffffffffffffffffffffffffff83165f908152600182016020526040902054155b80156135aa575073ffffffffffffffffffffffffffffffffffffffff82165f908152600282016020526040902054155b156127ed5780546040517f79d71551000000000000000000000000000000000000000000000000000000008152600481019190915273ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606401610daf565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0073ffffffffffffffffffffffffffffffffffffffff851661367b576040517fe602df050000000000000000000000000000000000000000000000000000000081525f6004820152602401610daf565b73ffffffffffffffffffffffffffffffffffffffff84166136ca576040517f94280d620000000000000000000000000000000000000000000000000000000081525f6004820152602401610daf565b73ffffffffffffffffffffffffffffffffffffffff8086165f90815260018301602090815260408083209388168352929052208390558115612aad578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161376591815260200190565b60405180910390a35050505050565b81811015612b27576040517fa3e322340000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610daf565b5f610c778484670de0b6b3a764000085613d49565b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd01547fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd009061381b9084613d8b565b6001909101555050505050565b73ffffffffffffffffffffffffffffffffffffffff8216613877576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610daf565b612b275f838361398a565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00805490915073ffffffffffffffffffffffffffffffffffffffff166359f89dda337f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8216040518060c001604052806138f83390565b73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018b8152602001898152602001878152506040516020016122a89190615097565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b5f610c7784670de0b6b3a76400008585613d49565b6139948383613525565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00805490915073ffffffffffffffffffffffffffffffffffffffff166359f89dda337f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a60405180608001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152602001613a6b7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd0254421190565b1515905260408051825173ffffffffffffffffffffffffffffffffffffffff908116602080840191909152840151168183015290820151606080830191909152909101511515608082015260a0016040516020818303038152906040526040518463ffffffff1660e01b8152600401613ae693929190614c29565b5f604051808303815f87803b158015613afd575f80fd5b505af1158015613b0f573d5f803e3d5ffd5b50505050612c50848484613d9a565b611a17613da5565b613b2e613da5565b612b278282613de3565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203611a17576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216613be2576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610daf565b612b27825f8361398a565b5f7fba9f160a0257aef2aa878e698d5363429ea67cc3c427f23f7cb9c3069b67bd00805490915073ffffffffffffffffffffffffffffffffffffffff166359f89dda337f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828696040518060c001604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018b73ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018c815260200189815260200187815250604051602001613cba9190615097565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401613ce793929190614c29565b5f604051808303815f87803b158015613cfe575f80fd5b505af1158015613d10573d5f803e3d5ffd5b5050505050505050505050565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b5f613d76613d5683613e46565b8015613d7157505f8480613d6c57613d6c6150a9565b868809115b151590565b613d81868686613e72565b6128549190614faa565b5f828218828411028218610c97565b6127ed838383613f22565b613dad6140ef565b611a17576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613deb613da5565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03613e37848261511a565b5060048101612c50838261511a565b5f6002826003811115613e5b57613e5b615232565b613e65919061525f565b60ff166001149050919050565b5f805f613e7f868661410d565b91509150815f03613ea357838181613e9957613e996150a9565b0492505050610c97565b818411613eba57613eba6003851502601118614148565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0073ffffffffffffffffffffffffffffffffffffffff8416613f7c5781816002015f828254613f719190614faa565b9091555061402c9050565b73ffffffffffffffffffffffffffffffffffffffff84165f9081526020829052604090205482811015614001576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024810182905260448101849052606401610daf565b73ffffffffffffffffffffffffffffffffffffffff85165f9081526020839052604090209083900390555b73ffffffffffffffffffffffffffffffffffffffff8316614057576002810180548390039055614082565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020829052604090208054830190555b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516140e191815260200190565b60405180910390a350505050565b5f6140f8612d16565b5468010000000000000000900460ff16919050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f60208284031215614169575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c97575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610b48575f80fd5b5f602082840312156141c9575f80fd5b8135610c9781614198565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610c9760208301846141d4565b5f8060408385031215614243575f80fd5b823561424e81614198565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156142ac576142ac61425c565b60405290565b6040516080810167ffffffffffffffff811182821017156142ac576142ac61425c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561431c5761431c61425c565b604052919050565b5f67ffffffffffffffff82111561433d5761433d61425c565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112614378575f80fd5b813561438b61438682614324565b6142d5565b81815284602083860101111561439f575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f80608085870312156143ce575f80fd5b8435935060208501356143e081614198565b925060408501359150606085013567ffffffffffffffff811115614402575f80fd5b61440e87828801614369565b91505092959194509250565b5f806040838503121561442b575f80fd5b50508035926020909101359150565b5f6020828403121561444a575f80fd5b5035919050565b5f805f60608486031215614463575f80fd5b833561446e81614198565b9250602084013561447e81614198565b929592945050506040919091013590565b5f6020828403121561449f575f80fd5b813567ffffffffffffffff8111156144b5575f80fd5b610c7784828501614369565b5f805f80608085870312156144d4575f80fd5b84356144df81614198565b93506020850135925060408501359150606085013567ffffffffffffffff811115614402575f80fd5b5f805f6060848603121561451a575f80fd5b833561452581614198565b925060208401359150604084013567ffffffffffffffff811115614547575f80fd5b61455386828701614369565b9150509250925092565b5f805f805f60a08688031215614571575f80fd5b85359450602086013561458381614198565b9350604086013561459381614198565b925060608601359150608086013567ffffffffffffffff8111156145b5575f80fd5b6145c188828901614369565b9150509295509295909350565b5f80602083850312156145df575f80fd5b823567ffffffffffffffff808211156145f6575f80fd5b818501915085601f830112614609575f80fd5b813581811115614617575f80fd5b8660208260051b850101111561462b575f80fd5b60209290920196919550909350505050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b828110156146b0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261469e8583516141d4565b94509285019290850190600101614664565b5092979650505050505050565b5f8083601f8401126146cd575f80fd5b50813567ffffffffffffffff8111156146e4575f80fd5b6020830191508360208285010111156146fb575f80fd5b9250929050565b5f805f805f60808688031215614716575f80fd5b85359450602086013561472881614198565b935060408601359250606086013567ffffffffffffffff81111561474a575f80fd5b614756888289016146bd565b969995985093965092949392505050565b5f8060408385031215614778575f80fd5b823561478381614198565b9150602083013561479381614198565b809150509250929050565b5f82601f8301126147ad575f80fd5b8135602067ffffffffffffffff8211156147c9576147c961425c565b8160051b6147d88282016142d5565b92835284810182019282810190878511156147f1575f80fd5b83870192505b84831015612150578235825291830191908301906147f7565b5f805f805f60a08688031215614824575f80fd5b853561482f81614198565b9450602086013561483f81614198565b9350604086013561484f81614198565b9250606086013567ffffffffffffffff8082111561486b575f80fd5b61487789838a0161479e565b9350608088013591508082111561488c575f80fd5b506145c18882890161479e565b8015158114610b48575f80fd5b5f805f80606085870312156148b9575f80fd5b8435935060208501356148cb81614899565b9250604085013567ffffffffffffffff8111156148e6575f80fd5b6148f2878288016146bd565b95989497509550505050565b600181811c9082168061491257607f821691505b602082108103614949577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f6020828403121561495f575f80fd5b815160ff81168114610c97575f80fd5b5f82601f83011261497e575f80fd5b815161498c61438682614324565b8181528460208386010111156149a0575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f602082840312156149cc575f80fd5b815167ffffffffffffffff808211156149e3575f80fd5b90830190604082860312156149f6575f80fd5b6149fe614289565b8251614a0981614198565b8152602083015182811115614a1c575f80fd5b929092019160808387031215614a30575f80fd5b614a386142b2565b8351614a4381614198565b8152602084015183811115614a56575f80fd5b614a628882870161496f565b602083015250604084015183811115614a79575f80fd5b614a858882870161496f565b60408301525060608401519350614a9b84614198565b60608101939093526020810192909252509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff8085168352604060208401528084511660408401526020840151604060608501528181511660808501526020810151608060a0860152614b0d6101008601826141d4565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808683030160c0870152614b4882826141d4565b9150508260608301511660e08601528093505050509392505050565b5f60208284031215614b74575f80fd5b5051919050565b5f73ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525085604083015284606083015283608083015260c060a0830152614bc560c08301846141d4565b98975050505050505050565b6020815273ffffffffffffffffffffffffffffffffffffffff82511660208201526020820151604082015260408201516060820152606082015160808201525f608083015160a080840152610c7760c08401826141d4565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f61285460608301846141d4565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a0608083015261215060a08301846141d4565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015260208201516040820152604082015160608201525f6060830151608080840152610c7760a08401826141d4565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f610c7760408301846141d4565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614daa575f80fd5b83018035915067ffffffffffffffff821115614dc4575f80fd5b6020019150368190038213156146fb575f80fd5b828482375f8382015f815283518060208601835e5f910190815295945050505050565b5f815180845260208085019450602084015f5b83811015614e2a57815187529582019590820190600101614e0e565b509495945050505050565b602081525f73ffffffffffffffffffffffffffffffffffffffff80845116602084015280602085015116604084015250604083015160a06060840152614e7e60c0840182614dfb565b905060608401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016080850152614eb98282614dfb565b9150506080840151151560a08401528091505092915050565b73ffffffffffffffffffffffffffffffffffffffff86168152846020820152831515604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101949350505050565b602081528151602082015260208201516040820152604082015160608201526060820151151560808201525f608083015160a080840152610c7760c08401826141d4565b5f60208284031215614f9f575f80fd5b8151610c9781614899565b80820180821115610b3157610b31614d1d565b5f60208284031215614fcd575f80fd5b8151610c9781614198565b5f73ffffffffffffffffffffffffffffffffffffffff808a16835280891660208401528088166040840152508560608301528460808301528360a083015260e060c083015261502a60e08301846141d4565b9998505050505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff8083511684528060208401511660208501525060408201516040840152606082015160608401526080820151608084015260a082015160c060a0850152610c7760c08501826141d4565b602081525f610c976020830184615037565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b601f8211156127ed57805f5260205f20601f840160051c810160208510156150fb5750805b601f840160051c820191505b81811015612aad575f8155600101615107565b815167ffffffffffffffff8111156151345761513461425c565b6151488161514284546148fe565b846150d6565b602080601f83116001811461519a575f84156151645750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556133f8565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156151e6578886015182559484019460019091019084016151c7565b508582101561522257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60ff831680615296577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b8060ff8416069150509291505056"; + + /// @dev Frozen creation bytecode of StoxWrappedTokenVault as compiled and deployed + /// for V2 via the Zoltu factory. Historical literal; never recompiled. + bytes constant PROD_STOX_WRAPPED_TOKEN_VAULT_CREATION_BYTECODE_V2 = + hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6121ed806100d65f395ff3fe608060405234801561000f575f80fd5b50600436106101b0575f3560e01c806370a08231116100f3578063c4d66de811610093578063ce96cb771161006e578063ce96cb7714610402578063d905777e14610415578063dd62ed3e14610428578063ef8b30f7146103ef575f80fd5b8063c4d66de8146103dc578063c63d75b6146102c8578063c6e6f592146103ef575f80fd5b8063a9059cbb116100ce578063a9059cbb14610390578063b3d7f6b9146103a3578063b460af94146103b6578063ba087652146103c9575f80fd5b806370a082311461032157806394bf804d1461037557806395d89b4114610388575f80fd5b806323b872dd1161015e578063402d267d11610139578063402d267d146102c8578063439fab91146102fb5780634cdad506146101e45780636e553f651461030e575f80fd5b806323b872dd14610254578063313ce5671461026757806338d52e0f14610281575f80fd5b8063095ea7b31161018e578063095ea7b3146101f75780630a28a4771461021a57806318160ddd1461022d575f80fd5b806301e1d114146101b457806306fdde03146101cf57806307a2d13a146101e4575b5f80fd5b6101bc61048c565b6040519081526020015b60405180910390f35b6101d761055e565b6040516101c69190611a7e565b6101bc6101f2366004611ad1565b61064e565b61020a610205366004611b09565b61065f565b60405190151581526020016101c6565b6101bc610228366004611ad1565b610676565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02546101bc565b61020a610262366004611b33565b610682565b61026f6106a7565b60405160ff90911681526020016101c6565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c6565b6101bc6102d6366004611b71565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b6101bc610309366004611b8c565b6106fa565b6101bc61031c366004611bf8565b61094f565b6101bc61032f366004611b71565b73ffffffffffffffffffffffffffffffffffffffff165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00602052604090205490565b6101bc610383366004611bf8565b61099f565b6101d76109d9565b61020a61039e366004611b09565b610ab5565b6101bc6103b1366004611ad1565b610ac2565b6101bc6103c4366004611c26565b610ace565b6101bc6103d7366004611c26565b610b5d565b6101bc6103ea366004611b71565b610be3565b6101bc6103fd366004611ad1565b610c16565b6101bc610410366004611b71565b610c21565b6101bc610423366004611b71565b610c2a565b6101bc610436366004611c65565b73ffffffffffffffffffffffffffffffffffffffff9182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f6104cb7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610535573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105599190611c91565b905090565b606061059e7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa1580156105e5573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261062a9190810190611cd5565b60405160200161063a9190611db5565b604051602081830303815290604052905090565b5f610659825f610c73565b92915050565b5f3361066c818585610cca565b5060019392505050565b5f610659826001610cdc565b5f3361068f858285610d2a565b61069a858585610e17565b60019150505b9392505050565b5f807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e0090505f81546106f4919074010000000000000000000000000000000000000000900460ff16611e13565b91505090565b5f80610704610ec0565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156107305750825b90505f8267ffffffffffffffff16600114801561074c5750303b155b90508115801561075a575080155b15610791576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156107f25784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f6107ff888a018a611b71565b905073ffffffffffffffffffffffffffffffffffffffff811661084e576040517f7cde9b7200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61085781610ee8565b61087d60405180602001604052805f81525060405180602001604052805f815250610efc565b60405173ffffffffffffffffffffffffffffffffffffffff82169033907fdf5fabff9e49f8c35d69a1f2d0c5e80c933c31cf836cf70de57e3a6e7dc86ebb905f90a37fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc396505083156109445784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505092915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61097f565b60405180910390fd5b5f61098985610c16565b905061099733858784610f12565b949350505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f6109cb85610ac2565b905061099733858388610f12565b6060610a197f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610a60573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610aa59190810190611cd5565b60405160200161063a9190611e2c565b5f3361066c818585610e17565b5f610659826001610c73565b5f80610ad983610c21565b905080851115610b3b576040517ffe9cceec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810186905260448101829052606401610976565b5f610b4586610676565b9050610b543386868985610fdb565b95945050505050565b5f80610b6883610c2a565b905080851115610bca576040517fb94abeec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810186905260448101829052606401610976565b5f610bd48661064e565b9050610b54338686848a610fdb565b5f6040517faf1fbb2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610659825f610cdc565b5f6106596101f2835b73ffffffffffffffffffffffffffffffffffffffff81165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006020526040812054610659565b5f6106a0610c7f61048c565b610c8a906001611e5d565b610c955f600a611f8e565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610cc19190611e5d565b859190856110f9565b610cd7838383600161113b565b505050565b5f6106a0610ceb82600a611f8e565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610d179190611e5d565b610d1f61048c565b610cc1906001611e5d565b73ffffffffffffffffffffffffffffffffffffffff8381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610e115781811015610e03576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401610976565b610e1184848484035f61113b565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e66576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b73ffffffffffffffffffffffffffffffffffffffff8216610eb5576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b610cd78383836112a5565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610659565b610ef0611464565b610ef9816114a4565b50565b610f04611464565b610f0e8282611575565b5050565b610f5b610f537f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005473ffffffffffffffffffffffffffffffffffffffff1690565b8530856115d8565b610f658382611634565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78484604051610fcd929190918252602082015260400190565b60405180910390a350505050565b8273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461101957611019838683610d2a565b611023838261168e565b61106b6110647f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005473ffffffffffffffffffffffffffffffffffffffff1690565b85846116e8565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db85856040516110ea929190918252602082015260400190565b60405180910390a45050505050565b5f61112661110683611743565b801561112157505f848061111c5761111c611f9c565b868809115b151590565b61113186868661176f565b610b549190611e5d565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0073ffffffffffffffffffffffffffffffffffffffff85166111ab576040517fe602df050000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b73ffffffffffffffffffffffffffffffffffffffff84166111fa576040517f94280d620000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b73ffffffffffffffffffffffffffffffffffffffff8086165f9081526001830160209081526040808320938816835292905220839055811561129e578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161129591815260200190565b60405180910390a35b5050505050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0073ffffffffffffffffffffffffffffffffffffffff84166112ff5781816002015f8282546112f49190611e5d565b909155506113af9050565b73ffffffffffffffffffffffffffffffffffffffff84165f9081526020829052604090205482811015611384576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861660048201526024810182905260448101849052606401610976565b73ffffffffffffffffffffffffffffffffffffffff85165f9081526020839052604090209083900390555b73ffffffffffffffffffffffffffffffffffffffff83166113da576002810180548390039055611405565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020829052604090208054830190555b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610fcd91815260200190565b61146c61181f565b6114a2576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6114ac611464565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005f806114d88461183d565b91509150816114e85760126114ea565b805b83547fffffffffffffffffffffff000000000000000000000000000000000000000000167401000000000000000000000000000000000000000060ff92909216919091027fffffffffffffffffffffffff0000000000000000000000000000000000000000161773ffffffffffffffffffffffffffffffffffffffff94909416939093179091555050565b61157d611464565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036115c9848261205e565b5060048101610e11838261205e565b6115e68484848460016118f6565b610e11576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610976565b73ffffffffffffffffffffffffffffffffffffffff8216611683576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b610f0e5f83836112a5565b73ffffffffffffffffffffffffffffffffffffffff82166116dd576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610976565b610f0e825f836112a5565b6116f58383836001611989565b610cd7576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610976565b5f60028260038111156117585761175861217a565b61176291906121a7565b60ff166001149050919050565b5f805f61177c8686611a11565b91509150815f036117a05783818161179657611796611f9c565b04925050506106a0565b8184116117b7576117b76003851502601118611a4c565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f611828610ec0565b5468010000000000000000900460ff16919050565b5f805f61184960405190565b6040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce567000000000000000000000000000000000000000000000000000000001790529091505f9081906118b2908790611a5d565b50915091506118c083604052565b8180156118ce575060203d10155b80156118db575060ff8111155b6118e6575f806118ea565b6001815b94509450505050915091565b6040517f23b872dd000000000000000000000000000000000000000000000000000000005f81815273ffffffffffffffffffffffffffffffffffffffff8781166004528616602452604485905291602083606481808c5af1925060015f5114831661197857838315161561196c573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000005f81815273ffffffffffffffffffffffffffffffffffffffff8616600452602485905291602083604481808b5af1925060015f51148316611a055783831516156119f9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5f805f60405f855160208701885afa92505f51915060205190509250925092565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f60208284031215611ae1575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610ef9575f80fd5b5f8060408385031215611b1a575f80fd5b8235611b2581611ae8565b946020939093013593505050565b5f805f60608486031215611b45575f80fd5b8335611b5081611ae8565b92506020840135611b6081611ae8565b929592945050506040919091013590565b5f60208284031215611b81575f80fd5b81356106a081611ae8565b5f8060208385031215611b9d575f80fd5b823567ffffffffffffffff80821115611bb4575f80fd5b818501915085601f830112611bc7575f80fd5b813581811115611bd5575f80fd5b866020828501011115611be6575f80fd5b60209290920196919550909350505050565b5f8060408385031215611c09575f80fd5b823591506020830135611c1b81611ae8565b809150509250929050565b5f805f60608486031215611c38575f80fd5b833592506020840135611c4a81611ae8565b91506040840135611c5a81611ae8565b809150509250925092565b5f8060408385031215611c76575f80fd5b8235611c8181611ae8565b91506020830135611c1b81611ae8565b5f60208284031215611ca1575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215611ce5575f80fd5b815167ffffffffffffffff80821115611cfc575f80fd5b818401915084601f830112611d0f575f80fd5b815181811115611d2157611d21611ca8565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611d6757611d67611ca8565b81604052828152876020848701011115611d7f575f80fd5b8260208601602083015e5f928101602001929092525095945050505050565b5f81518060208401855e5f93019283525090919050565b7f577261707065642000000000000000000000000000000000000000000000000081525f6106a06008830184611d9e565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b60ff818116838216019081111561065957610659611de6565b7f770000000000000000000000000000000000000000000000000000000000000081525f6106a06001830184611d9e565b8082018082111561065957610659611de6565b600181815b80851115611ec957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611eaf57611eaf611de6565b80851615611ebc57918102915b93841c9390800290611e75565b509250929050565b5f82611edf57506001610659565b81611eeb57505f610659565b8160018114611f015760028114611f0b57611f27565b6001915050610659565b60ff841115611f1c57611f1c611de6565b50506001821b610659565b5060208310610133831016604e8410600b8410161715611f4a575081810a610659565b611f548383611e70565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611f8657611f86611de6565b029392505050565b5f6106a060ff841683611ed1565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b600181811c90821680611fdd57607f821691505b602082108103612014577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610cd757805f5260205f20601f840160051c8101602085101561203f5750805b601f840160051c820191505b8181101561129e575f815560010161204b565b815167ffffffffffffffff81111561207857612078611ca8565b61208c816120868454611fc9565b8461201a565b602080601f8311600181146120de575f84156120a85750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612172565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561212a5788860151825594840194600190910190840161210b565b508582101561216657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b505060018460011b0185555b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60ff8316806121de577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b8060ff8416069150509291505056"; + + /// @dev Frozen creation bytecode of StoxUnifiedDeployer as compiled and deployed + /// for V2 via the Zoltu factory. Historical literal; never recompiled. + bytes constant PROD_STOX_UNIFIED_DEPLOYER_CREATION_BYTECODE_V2 = + hex"6080604052348015600e575f80fd5b506105278061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063733e1f8d1461002d575b5f80fd5b61004061003b36600461031d565b610042565b005b6040517f4904fab30000000000000000000000000000000000000000000000000000000081525f90730c5154c4861908bd5a6fd6ffcb063e9869cefa4190634904fab390610094908590600401610460565b6020604051808303815f875af11580156100b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100d49190610505565b6040517fd786858b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201529091505f9073bfb3d7baece65d1f1640986cda313177f1160c709063d786858b906024016020604051808303815f875af1158015610156573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061017a9190610505565b6040805133815273ffffffffffffffffffffffffffffffffffffffff858116602083015283168183015290519192507fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b919081900360600190a1505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715610229576102296101d9565b60405290565b6040516080810167ffffffffffffffff81118282101715610229576102296101d9565b73ffffffffffffffffffffffffffffffffffffffff81168114610273575f80fd5b50565b5f82601f830112610285575f80fd5b813567ffffffffffffffff808211156102a0576102a06101d9565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156102e6576102e66101d9565b816040528381528660208588010111156102fe575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561032d575f80fd5b813567ffffffffffffffff80821115610344575f80fd5b9083019060408286031215610357575f80fd5b61035f610206565b823561036a81610252565b815260208301358281111561037d575f80fd5b929092019160808387031215610391575f80fd5b61039961022f565b83356103a481610252565b81526020840135838111156103b7575f80fd5b6103c388828701610276565b6020830152506040840135838111156103da575f80fd5b6103e688828701610276565b604083015250606084013593506103fc84610252565b60608101939093526020810192909252509392505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f73ffffffffffffffffffffffffffffffffffffffff808451166020840152602084015160408085015281815116606085015260208101516080808601526104af60e0860182610414565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a08701526104ea8282610414565b9150508260608301511660c086015280935050505092915050565b5f60208284031215610515575f80fd5b815161052081610252565b939250505056"; + + /// @dev Frozen creation bytecode of StoxWrappedTokenVaultBeacon as compiled and deployed + /// for V2 via the Zoltu factory. Historical literal; never recompiled. + bytes constant PROD_STOX_WRAPPED_TOKEN_VAULT_BEACON_CREATION_BYTECODE_V2 = + hex"608060405234801561000f575f80fd5b5073b438a1ea1550fd199d67d67a69b71f4324bb8660738e4bdeec7ceb9570d440676345da1dce10329f5b80610049565b60405180910390fd5b61005281610063565b5061005c826100b2565b5050610130565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100e75760405163211eb15960e21b81526001600160a01b0382166004820152602401610040565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b61035a8061013d5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063715018a61161004d578063715018a6146100c05780638da5cb5b146100c8578063f2fde38b146100e5575f80fd5b80633659cfe6146100685780635c60da1b1461007d575b5f80fd5b61007b610076366004610320565b6100f8565b005b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b61010c565b5f5473ffffffffffffffffffffffffffffffffffffffff16610097565b61007b6100f3366004610320565b61011f565b610100610184565b610109816101d6565b50565b610114610184565b61011d5f6102ac565b565b610127610184565b73ffffffffffffffffffffffffffffffffffffffff811661017b576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610109816102ac565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461011d576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610172565b8073ffffffffffffffffffffffffffffffffffffffff163b5f0361023e576040517f847ac56400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610172565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610330575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610353575f80fd5b939250505056"; + + /// @dev Frozen creation bytecode of StoxOffchainAssetReceiptVaultBeaconSetDeployer as compiled and deployed + /// for V2 via the Zoltu factory. Historical literal; never recompiled. + bytes constant PROD_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CREATION_BYTECODE_V2 = + hex"60c060405234801561000f575f80fd5b5060408051606081018252738e4bdeec7ceb9570d440676345da1dce10329f5b80825273bab0e6b7b5dda86fb8ba81c00aea0ceb8b73686b6020830181905273c95db340a7a100881626475d41bff70857aa920d8385015292519192916100759061010b565b6001600160a01b03928316815291166020820152604001604051809103905ff0801580156100a5573d5f803e3d5ffd5b506001600160a01b0316608052604080820151825191519091906100c89061010b565b6001600160a01b03928316815291166020820152604001604051809103905ff0801580156100f8573d5f803e3d5ffd5b506001600160a01b031660a05250610118565b6104f780610ed083390190565b60805160a051610d8b6101455f395f818160aa015261021001525f81816047015261019b0152610d8b5ff3fe608060405234801561000f575f80fd5b506004361061003e575f3560e01c8062642f77146100425780634904fab3146100925780634d042311146100a5575b5f80fd5b6100697f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100696100a0366004610650565b6100cc565b6100697f000000000000000000000000000000000000000000000000000000000000000081565b6020810151606001515f9073ffffffffffffffffffffffffffffffffffffffff161561014a576020820151606001516040517ffc47d97600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240160405180910390fd5b815173ffffffffffffffffffffffffffffffffffffffff16610198576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000006040516101c6906104fb565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff08015801561020a573d5f803e3d5ffd5b5090505f7f000000000000000000000000000000000000000000000000000000000000000060405161023b906104fb565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff08015801561027f573d5f803e3d5ffd5b506040805173ffffffffffffffffffffffffffffffffffffffff80841660208301529293507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc39285169163439fab9191016040516020818303038152906040526040518263ffffffff1660e01b81526004016102fb9190610786565b6020604051808303815f875af1158015610317573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061033b919061079f565b14610372576040517f0219069c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8184602001516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc38173ffffffffffffffffffffffffffffffffffffffff1663439fab91866040516020016103fc91906107b6565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016104279190610786565b6020604051808303815f875af1158015610443573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610467919061079f565b1461049e576040517f09c5931500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805133815273ffffffffffffffffffffffffffffffffffffffff838116602083015284168183015290517fa0d99d93cf7a5f89661fa0829369a7e4896e755871efe65440bab2429387d55b9181900360600190a19392505050565b61052f8061085c83390190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561055857610558610508565b60405290565b6040516080810167ffffffffffffffff8111828210171561055857610558610508565b803573ffffffffffffffffffffffffffffffffffffffff811681146105a4575f80fd5b919050565b5f82601f8301126105b8575f80fd5b813567ffffffffffffffff808211156105d3576105d3610508565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561061957610619610508565b81604052838152866020858801011115610631575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f60208284031215610660575f80fd5b813567ffffffffffffffff80821115610677575f80fd5b908301906040828603121561068a575f80fd5b610692610535565b61069b83610581565b81526020830135828111156106ae575f80fd5b9290920191608083870312156106c2575f80fd5b6106ca61055e565b6106d384610581565b81526020840135838111156106e6575f80fd5b6106f2888287016105a9565b602083015250604084013583811115610709575f80fd5b610715888287016105a9565b60408301525061072760608501610581565b6060820152602082015295945050505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610798602083018461073a565b9392505050565b5f602082840312156107af575f80fd5b5051919050565b602081525f73ffffffffffffffffffffffffffffffffffffffff8084511660208401526020840151604080850152818151166060850152602081015160808086015261080560e086018261073a565b905060408201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08683030160a0870152610840828261073a565b9150508260608301511660c08601528093505050509291505056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056608060405234801561000f575f80fd5b506040516104f73803806104f783398101604081905261002e9161015f565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006681610077565b50610070826100c6565b5050610190565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b806001600160a01b03163b5f036100fb5760405163211eb15960e21b81526001600160a01b0382166004820152602401610054565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b80516001600160a01b038116811461015a575f80fd5b919050565b5f8060408385031215610170575f80fd5b61017983610144565b915061018760208401610144565b90509250929050565b61035a8061019d5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c8063715018a61161004d578063715018a6146100c05780638da5cb5b146100c8578063f2fde38b146100e5575f80fd5b80633659cfe6146100685780635c60da1b1461007d575b5f80fd5b61007b610076366004610320565b6100f8565b005b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61007b61010c565b5f5473ffffffffffffffffffffffffffffffffffffffff16610097565b61007b6100f3366004610320565b61011f565b610100610184565b610109816101d6565b50565b610114610184565b61011d5f6102ac565b565b610127610184565b73ffffffffffffffffffffffffffffffffffffffff811661017b576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610109816102ac565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461011d576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610172565b8073ffffffffffffffffffffffffffffffffffffffff163b5f0361023e576040517f847ac56400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610172565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610330575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610353575f80fd5b939250505056"; + + /// @dev Frozen creation bytecode of StoxWrappedTokenVaultBeaconSetDeployer as compiled and deployed + /// for V2 via the Zoltu factory. Historical literal; never recompiled. + bytes constant PROD_STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_CREATION_BYTECODE_V2 = + hex"6080604052348015600e575f80fd5b506108468061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063d786858b1461002d575b5f80fd5b61004061003b366004610272565b610069565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b5f73ffffffffffffffffffffffffffffffffffffffff82166100b7576040517fe51a7ce200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73846a468e6fda529d282d60df7d1ee785eb9546006040516100d990610265565b73ffffffffffffffffffffffffffffffffffffffff90911681526040602082018190525f90820152606001604051809103905ff08015801561011d573d5f803e3d5ffd5b506040805133815273ffffffffffffffffffffffffffffffffffffffff831660208201529192507f82488d8ab594db2178e4a45b7106aaa804836e608f001b5d7fcb6c3514730b3e910160405180910390a16040805173ffffffffffffffffffffffffffffffffffffffff85811660208301527fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc3929084169163439fab9191016040516020818303038152906040526040518263ffffffff1660e01b81526004016101e891906102ac565b6020604051808303815f875af1158015610204573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061022891906102ff565b1461025f576040517f09c5931500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b92915050565b61052f8061031783390190565b5f60208284031215610282575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146102a5575f80fd5b9392505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f6020828403121561030f575f80fd5b505191905056fe60a060405260405161052f38038061052f83398101604081905261002291610331565b61002c828261003e565b506001600160a01b031660805261040d565b610047826100fb565b6040516001600160a01b038316907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a28051156100ef576100ea826001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906103ed565b82610209565b505050565b6100f76102aa565b5050565b806001600160a01b03163b5f0361013557604051631933b43b60e21b81526001600160a01b03821660048201526024015b60405180910390fd5b807fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392831617905560408051635c60da1b60e01b815290515f92841691635c60da1b9160048083019260209291908290030181865afa1580156101ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d291906103ed565b9050806001600160a01b03163b5f036100f757604051634c9c8ce360e01b81526001600160a01b038216600482015260240161012c565b60605f61021684846102cb565b905080801561023757505f3d118061023757505f846001600160a01b03163b115b1561024c576102446102de565b9150506102a4565b801561027657604051639996b31560e01b81526001600160a01b038516600482015260240161012c565b3d15610289576102846102f7565b6102a2565b60405163d6bda27560e01b815260040160405180910390fd5b505b92915050565b34156102c95760405163b398979f60e01b815260040160405180910390fd5b565b5f805f835160208501865af49392505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b80516001600160a01b0381168114610318575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610342575f80fd5b61034b83610302565b60208401519092506001600160401b0380821115610367575f80fd5b818501915085601f83011261037a575f80fd5b81518181111561038c5761038c61031d565b604051601f8201601f19908116603f011681019083821181831017156103b4576103b461031d565b816040528281528860208487010111156103cc575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f602082840312156103fd575f80fd5b61040682610302565b9392505050565b60805161010b6104245f395f6023015261010b5ff3fe608060405261000c61000e565b005b61001e610019610020565b6100b3565b565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561008a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ae91906100d1565b905090565b365f80375f80365f845af43d5f803e8080156100cd573d5ff35b3d5ffd5b5f602082840312156100e1575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610104575f80fd5b939250505056"; + + /// @dev Frozen creation bytecode of StoxOffchainAssetReceiptVaultAuthorizerV1 as compiled and deployed + /// for V2 via the Zoltu factory. Historical literal; never recompiled. + bytes constant PROD_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_CREATION_BYTECODE_V2 = + hex"6080604052348015600e575f80fd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b611606806100d65f395ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c8063439fab911161007257806391d148541161005857806391d1485414610168578063a217fddf146101cc578063d547741f146101d3575f80fd5b8063439fab911461014257806359f89dda14610155575f80fd5b806301ffc9a7146100a3578063248a9ca3146100cb5780632f2ff15d1461011a57806336568abe1461012f575b5f80fd5b6100b66100b1366004611110565b6101e6565b60405190151581526020015b60405180910390f35b61010c6100d9366004611156565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b6040519081526020016100c2565b61012d61012836600461118e565b6102d9565b005b61012d61013d36600461118e565b610322565b61010c6101503660046112eb565b610380565b61012d610163366004611325565b6104ee565b6100b661017636600461118e565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61010c5f81565b61012d6101e136600461118e565b610897565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda00000000000000000000000000000000000000000000000000000000148061027857507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b806102c457507fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000145b806102d357506102d3826108da565b92915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461031281610970565b61031c838361097d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610371576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61037b8282610a9b565b505050565b5f8061038a610b77565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f811580156103b65750825b90505f8267ffffffffffffffff1660011480156103d25750303b155b9050811580156103e0575080155b15610417576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156104785784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61048187610b9f565b955083156104e45784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a82148061053b57507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4882145b15610804575f805f7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a850361059b575f8480602001905181019061057f919061138e565b9050805f015193508060200151925080606001519150506105c7565b5f848060200190518101906105b09190611483565b805160208201516080909201519095509093509150505b80156107fc5773ffffffffffffffffffffffffffffffffffffffff8316158015610634575073ffffffffffffffffffffffffffffffffffffffff82165f9081527f96f78a99f93d631b75bc050854c9b764642c10564e41ed27c197a36ddabb1df9602052604090205460ff165b806106a1575073ffffffffffffffffffffffffffffffffffffffff82161580156106a1575073ffffffffffffffffffffffffffffffffffffffff83165f9081527f3907f76fa0fb1e5d0f263c5c4fe4316026052cf960c55a1c768106d8b9701c10602052604090205460ff165b156106ae57505050505050565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a85148015610720575073ffffffffffffffffffffffffffffffffffffffff86165f9081527f6ba48721fcbb2613af13d8285fe9ee4a081f7995464037bb5ea27397912881d2602052604090205460ff165b8061079857507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4885148015610798575073ffffffffffffffffffffffffffffffffffffffff86165f9081527f29e42896fa6edf5a5d7ff0bcd00acffbece6eb6cc7b44d0807bfd84929cc6e1b602052604090205460ff165b156107a557505050505050565b6040517ffe720f7800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8085166004830152831660248201526044015b60405180910390fd5b505050505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915290205460ff161561085f57505050565b8282826040517f3ae4063b0000000000000000000000000000000000000000000000000000000081526004016107f393929190611545565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260409020600101546108d081610970565b61031c8383610a9b565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806102d357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102d3565b61097a8133610f5f565b50565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff16610a92575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610a2e3390565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506102d3565b5f9150506102d3565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff1615610a92575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506102d3565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102d3565b5f8082806020019051810190610bb591906115bc565b9050610bbf611009565b805173ffffffffffffffffffffffffffffffffffffffff16610c0d576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c577f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d0533917f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b611013565b610c817f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b80611013565b610ccb7f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e37f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d611013565b610cf57f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d80611013565b610d3f7f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed7fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c611013565b610d697fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c80611013565b610db37f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8217f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02611013565b610ddd7f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc0280611013565b610e277f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828697fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3611013565b610e517fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d380611013565b610e7e7f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b825f015161097d565b50610eac7f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d825f015161097d565b50610eda7fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c825f015161097d565b50610f087f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02825f015161097d565b50610f367fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3825f015161097d565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc39392505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16611005576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602481018390526044016107f3565b5050565b6110116110b4565b565b7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268005f61106c845f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b6110bc6110f2565b611011576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6110fb610b77565b5468010000000000000000900460ff16919050565b5f60208284031215611120575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461114f575f80fd5b9392505050565b5f60208284031215611166575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461097a575f80fd5b5f806040838503121561119f575f80fd5b8235915060208301356111b18161116d565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160a0810167ffffffffffffffff8111828210171561120c5761120c6111bc565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611259576112596111bc565b604052919050565b5f82601f830112611270575f80fd5b813567ffffffffffffffff81111561128a5761128a6111bc565b6112bb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611212565b8181528460208386010111156112cf575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156112fb575f80fd5b813567ffffffffffffffff811115611311575f80fd5b61131d84828501611261565b949350505050565b5f805f60608486031215611337575f80fd5b83356113428161116d565b925060208401359150604084013567ffffffffffffffff811115611364575f80fd5b61137086828701611261565b9150509250925092565b80518015158114611389575f80fd5b919050565b5f6080828403121561139e575f80fd5b6040516080810181811067ffffffffffffffff821117156113c1576113c16111bc565b60405282516113cf8161116d565b815260208301516113df8161116d565b6020820152604083810151908201526113fa6060840161137a565b60608201529392505050565b5f82601f830112611415575f80fd5b8151602067ffffffffffffffff821115611431576114316111bc565b8160051b611440828201611212565b9283528481018201928281019087851115611459575f80fd5b83870192505b848310156114785782518252918301919083019061145f565b979650505050505050565b5f60208284031215611493575f80fd5b815167ffffffffffffffff808211156114aa575f80fd5b9083019060a082860312156114bd575f80fd5b6114c56111e9565b82516114d08161116d565b815260208301516114e08161116d565b60208201526040830151828111156114f6575f80fd5b61150287828601611406565b604083015250606083015182811115611519575f80fd5b61152587828601611406565b6060830152506115376080840161137a565b608082015295945050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f82518060608401528060208501608085015e5f6080828501015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116840101915050949350505050565b5f602082840312156115cc575f80fd5b6040516020810181811067ffffffffffffffff821117156115ef576115ef6111bc565b60405282516115fd8161116d565b8152939250505056"; + + /// @dev Frozen creation bytecode of StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1 as compiled and deployed + /// for V2 via the Zoltu factory. Historical literal; never recompiled. + bytes constant PROD_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_CREATION_BYTECODE_V2 = + hex"6080604052348015600e575f80fd5b506015601f565b601b601f565b60cf565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615606e5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460cc5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b612a16806100dc5f395ff3fe608060405234801561000f575f80fd5b5060043610610115575f3560e01c806359f89dda116100ad578063a086e1751161007d578063a4c9d30011610063578063a4c9d30014610331578063d547741f14610339578063f2fde38b1461034c575f80fd5b8063a086e17514610322578063a217fddf1461032a575f80fd5b806359f89dda1461029b578063715018a6146102ae5780638da5cb5b146102b657806391d14854146102be575f80fd5b80633013ce29116100e85780633013ce29146101c8578063325cd7961461022657806336568abe14610275578063439fab9114610288575f80fd5b806301ffc9a71461011957806304a0db2014610141578063248a9ca3146101725780632f2ff15d146101b3575b5f80fd5b61012c6101273660046121b6565b61035f565b60405190151581526020015b60405180910390f35b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b3202545b604051908152602001610138565b6101646101803660046121f5565b5f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b6101c66101c136600461222d565b610452565b005b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b32015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610138565b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b32015474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610138565b6101c661028336600461222d565b61049b565b6101646102963660046123ba565b6104f9565b6101c66102a93660046123ec565b610b1c565b6101c6610f46565b610201610f59565b61012c6102cc36600461222d565b5f9182527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b610201610f9a565b6101645f81565b6101c6610fc2565b6101c661034736600461222d565b6110a5565b6101c661035a366004612441565b6110e8565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f59f89dda0000000000000000000000000000000000000000000000000000000014806103f157507fffffffff0000000000000000000000000000000000000000000000000000000082167f439fab9100000000000000000000000000000000000000000000000000000000145b8061043d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000145b8061044c575061044c82611148565b92915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015461048b816111de565b61049583836111e8565b50505050565b73ffffffffffffffffffffffffffffffffffffffff811633146104ea576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104f4828261130d565b505050565b5f806105036113e9565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f8115801561052f5750825b90505f8267ffffffffffffffff16600114801561054b5750303b155b905081158015610559575080155b15610590576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156105f15784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f87806020019051810190610606919061245c565b805190915073ffffffffffffffffffffffffffffffffffffffff16610657576040517fa7d26c7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015173ffffffffffffffffffffffffffffffffffffffff166106a8576040517f364467d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604081015173ffffffffffffffffffffffffffffffffffffffff166106f9576040517f3731597600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606081015173ffffffffffffffffffffffffffffffffffffffff1661074a576040517ff10d418200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80608001515f03610787576040517f7e0eb2bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80517f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b320080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161782556020808501517f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b32038054841691861691909117905560608501517f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b320180549093169416938417909155604080517f313ce567000000000000000000000000000000000000000000000000000000008152905192935f93909263313ce56792600480820193918290030181865afa1580156108a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c991906124cd565b6001830180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000060ff84160217905560808401516002840155604084015190915061092a90611411565b7fbf322f47f534976d35baa3292f4fd04bf379264783a734383401b0e6e51cb16d835f01518460200151856040015186606001518588608001516040516109bb9695949392919073ffffffffffffffffffffffffffffffffffffffff9687168152948616602086015292851660408501529316606083015260ff92909216608082015260a081019190915260c00190565b60405180910390a1610a2c6040518060200160405280856040015173ffffffffffffffffffffffffffffffffffffffff16815250604051602001610a18915173ffffffffffffffffffffffffffffffffffffffff16815260200190565b604051602081830303815290604052611422565b50610a5b7f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02846040015161130d565b50610a8a7fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3846040015161130d565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc398505050508315610b125784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050919050565b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b3200805473ffffffffffffffffffffffffffffffffffffffff16338114610b9d578484846040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610b94939291906124ed565b60405180910390fd5b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8218403610f34575f83806020019051810190610bd99190612564565b600184810154608083015192935073ffffffffffffffffffffffffffffffffffffffff8116927401000000000000000000000000000000000000000090910460ff16915f91610c299184906117e2565b90505f8373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9991906124cd565b60ff169050828114610ce1576040517fe420d7af0000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610b94565b5f8673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d4f9190612650565b90508760020154811115610d9f5760028801546040517f86529caa000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610b94565b825f03610dff5785516040517f3ae4063b000000000000000000000000000000000000000000000000000000008152610b9491907f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821908c906004016124ed565b8551610e249073ffffffffffffffffffffffffffffffffffffffff8716903086611869565b600388015486516040517fdb8554fc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201524260248201525f92919091169063db8554fc90604401602060405180830381865afa158015610e9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec39190612650565b905060028114610f265786516040517f3ae4063b000000000000000000000000000000000000000000000000000000008152610b9491907f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f821908d906004016124ed565b505050505050505050505050565b610f3f8585856118c5565b5050505050565b610f4e611c69565b610f575f611cc1565b565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b5473ffffffffffffffffffffffffffffffffffffffff1692915050565b5f807f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b3200610f7d565b7f8fe11d932915502a5df2182ac99faeb149787a3fda1afc79ff772fdaf26b32006110a2610fee610f59565b60018301546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa15801561105c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110809190612650565b600184015473ffffffffffffffffffffffffffffffffffffffff169190611d56565b50565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260409020600101546110de816111de565b610495838361130d565b6110f0611c69565b73ffffffffffffffffffffffffffffffffffffffff811661113f576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610b94565b6110a281611cc1565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061044c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461044c565b6110a28133611db1565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff166112fd575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556112993390565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4600191505061044c565b5f91505061044c565b5092915050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616855290915282205460ff16156112fd575f8481526020828152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4600191505061044c565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061044c565b611419611e5b565b6110a281611e99565b5f80828060200190518101906114389190612667565b9050611442611ea1565b805173ffffffffffffffffffffffffffffffffffffffff16611490576040517fd264eed000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114da7f50a07cb25d0d864370863300b20987dfdae089abad71b607faf639d09d0533917f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b611ea9565b6115047f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b80611ea9565b61154e7f3dd35eca0ca8a128757fa464a5dfa4ad6cc4853cad96dce4e90fdbea4f0a52e37f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d611ea9565b6115787f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d80611ea9565b6115c27f54f0af3716c79b30b8c228679d31d77a1a5f526c16af3262730e0a8de4363fed7fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c611ea9565b6115ec7fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c80611ea9565b6116367f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8217f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02611ea9565b6116607f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc0280611ea9565b6116aa7f7a8dc26796a1e50e6e190b70259f58f6a4edd5b22280ceecc82b687b8e9828697fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3611ea9565b6116d47fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d380611ea9565b6117017f48ece560b6811ee496fa3dedc7d5be3dfce8c5eb8f1cc18626507e158a23169b825f01516111e8565b5061172f7f4fa4167c411e3d3edd62f8bf767cb8c66f94f891502ddab57e7c55ca1d7d891d825f01516111e8565b5061175d7fe5c740c26fb65f0a8de546defe3fe0011d5f2292abe6c4e6c3833916f4d8f76c825f01516111e8565b5061178b7f1ae915b310cb86de75afe5db1721d474dd0a8617151f7524866025476454bc02825f01516111e8565b506117b97fa0f4a7675effb97b81a0c9d5b53b44a73019f25c5ec8fda76d7c1ad3920851d3825f01516111e8565b507fe0e57eda3f08f2a93bbe980d3df7f9c315eac41181f58b865a13d917fe769fc39392505050565b5f8260121115611816576012839003600183161561180c576118048582611f4a565b915050611862565b6118048582611f96565b601283111561185f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee83016002831615611855576118048582611fc0565b611804858261204e565b50825b9392505050565b61187784848484600161207d565b610495576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610b94565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a82148061191257507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4882145b15611bd6575f805f7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a8503611972575f8480602001905181019061195691906126c5565b9050805f0151935080602001519250806060015191505061199e565b5f8480602001905181019061198791906127ba565b805160208201516080909201519095509093509150505b8015611bce5773ffffffffffffffffffffffffffffffffffffffff8316158015611a0b575073ffffffffffffffffffffffffffffffffffffffff82165f9081527f96f78a99f93d631b75bc050854c9b764642c10564e41ed27c197a36ddabb1df9602052604090205460ff165b80611a78575073ffffffffffffffffffffffffffffffffffffffff8216158015611a78575073ffffffffffffffffffffffffffffffffffffffff83165f9081527f3907f76fa0fb1e5d0f263c5c4fe4316026052cf960c55a1c768106d8b9701c10602052604090205460ff165b15611a8557505050505050565b7f55387ad71a8e46cc1293406722dd825c028eaf5ff0c2a3e4f176184d62e9d30a85148015611af7575073ffffffffffffffffffffffffffffffffffffffff86165f9081527f6ba48721fcbb2613af13d8285fe9ee4a081f7995464037bb5ea27397912881d2602052604090205460ff165b80611b6f57507f0e5bce7997400ea2056cf00fe99ca5d6be40bdb9d8b4e41217fe8670c2639a4885148015611b6f575073ffffffffffffffffffffffffffffffffffffffff86165f9081527f29e42896fa6edf5a5d7ff0bcd00acffbece6eb6cc7b44d0807bfd84929cc6e1b602052604090205460ff165b15611b7c57505050505050565b6040517ffe720f7800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808516600483015283166024820152604401610b94565b505050505050565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915290205460ff1615611c3157505050565b8282826040517f3ae4063b000000000000000000000000000000000000000000000000000000008152600401610b94939291906124ed565b33611c72610f59565b73ffffffffffffffffffffffffffffffffffffffff1614610f57576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610b94565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611d638383836001612110565b6104f4576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610b94565b5f8281527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16611e57576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015260248101839052604401610b94565b5050565b611e63612198565b610f57576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110f0611e5b565b610f57611e5b565b7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268005f611f02845f9081527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604090206001015490565b5f85815260208490526040808220600101869055519192508491839187917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a450505050565b5f604e8210611f6c578215611f60576001611f62565b5f5b60ff16905061044c565b600a82900a808481611f8057611f8061287c565b0491508082028414611306575060010192915050565b5f604e821015611fb85781600a0a8381611fb257611fb261287c565b04611862565b5f9392505050565b5f604e8210611ffe578215611ff5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611ff7565b5f5b905061044c565b50600a81900a82810290838183816120185761201861287c565b0414612044577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612046565b815b949350505050565b600a81900a61205d81846128d6565b9050604e821061044c578215611fb85761207882600a612a0b565b611862565b6040517f23b872dd000000000000000000000000000000000000000000000000000000005f81815273ffffffffffffffffffffffffffffffffffffffff8781166004528616602452604485905291602083606481808c5af1925060015f511483166120ff5783831516156120f3573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000005f81815273ffffffffffffffffffffffffffffffffffffffff8616600452602485905291602083604481808b5af1925060015f5114831661218c578383151615612180573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b5f6121a16113e9565b5468010000000000000000900460ff16919050565b5f602082840312156121c6575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611862575f80fd5b5f60208284031215612205575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146110a2575f80fd5b5f806040838503121561223e575f80fd5b8235915060208301356122508161220c565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405160a0810167ffffffffffffffff811182821017156122ab576122ab61225b565b60405290565b60405160c0810167ffffffffffffffff811182821017156122ab576122ab61225b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561231b5761231b61225b565b604052919050565b5f67ffffffffffffffff82111561233c5761233c61225b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112612377575f80fd5b813561238a61238582612323565b6122d4565b81815284602083860101111561239e575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156123ca575f80fd5b813567ffffffffffffffff8111156123e0575f80fd5b61204684828501612368565b5f805f606084860312156123fe575f80fd5b83356124098161220c565b925060208401359150604084013567ffffffffffffffff81111561242b575f80fd5b61243786828701612368565b9150509250925092565b5f60208284031215612451575f80fd5b81356118628161220c565b5f60a0828403121561246c575f80fd5b612474612288565b825161247f8161220c565b8152602083015161248f8161220c565b602082015260408301516124a28161220c565b604082015260608301516124b58161220c565b60608201526080928301519281019290925250919050565b5f602082840312156124dd575f80fd5b815160ff81168114611862575f80fd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f82518060608401528060208501608085015e5f6080828501015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116840101915050949350505050565b5f6020808385031215612575575f80fd5b825167ffffffffffffffff8082111561258c575f80fd5b9084019060c0828703121561259f575f80fd5b6125a76122b1565b82516125b28161220c565b8152828401516125c18161220c565b80858301525060408301516040820152606083015160608201526080830151608082015260a0830151828111156125f6575f80fd5b80840193505086601f84011261260a575f80fd5b8251915061261a61238583612323565b828152878584860101111561262d575f80fd5b828585018683015e5f8584830101528060a0830152508094505050505092915050565b5f60208284031215612660575f80fd5b5051919050565b5f60208284031215612677575f80fd5b6040516020810181811067ffffffffffffffff8211171561269a5761269a61225b565b60405282516126a88161220c565b81529392505050565b805180151581146126c0575f80fd5b919050565b5f608082840312156126d5575f80fd5b6040516080810181811067ffffffffffffffff821117156126f8576126f861225b565b60405282516127068161220c565b815260208301516127168161220c565b602082015260408381015190820152612731606084016126b1565b60608201529392505050565b5f82601f83011261274c575f80fd5b8151602067ffffffffffffffff8211156127685761276861225b565b8160051b6127778282016122d4565b9283528481018201928281019087851115612790575f80fd5b83870192505b848310156127af57825182529183019190830190612796565b979650505050505050565b5f602082840312156127ca575f80fd5b815167ffffffffffffffff808211156127e1575f80fd5b9083019060a082860312156127f4575f80fd5b6127fc612288565b82516128078161220c565b815260208301516128178161220c565b602082015260408301518281111561282d575f80fd5b6128398782860161273d565b604083015250606083015182811115612850575f80fd5b61285c8782860161273d565b60608301525061286e608084016126b1565b608082015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761044c5761044c6128a9565b600181815b8085111561294657817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561292c5761292c6128a9565b8085161561293957918102915b93841c93908002906128f2565b509250929050565b5f8261295c5750600161044c565b8161296857505f61044c565b816001811461297e5760028114612988576129a4565b600191505061044c565b60ff841115612999576129996128a9565b50506001821b61044c565b5060208310610133831016604e8410600b84101617156129c7575081810a61044c565b6129d183836128ed565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612a0357612a036128a9565b029392505050565b5f611862838361294e56"; } diff --git a/src/lib/LibProdDeployV3.sol b/src/lib/LibProdDeployV3.sol deleted file mode 100644 index 2012fcab..00000000 --- a/src/lib/LibProdDeployV3.sol +++ /dev/null @@ -1,106 +0,0 @@ -// SPDX-License-Identifier: LicenseRef-DCL-1.0 -// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; - -import { - BYTECODE_HASH as STOX_RECEIPT_HASH, - DEPLOYED_ADDRESS as STOX_RECEIPT_ADDR -} from "../generated/StoxReceipt.pointers.sol"; -import { - BYTECODE_HASH as STOX_RECEIPT_VAULT_HASH, - DEPLOYED_ADDRESS as STOX_RECEIPT_VAULT_ADDR -} from "../generated/StoxReceiptVault.pointers.sol"; -import { - BYTECODE_HASH as STOX_WRAPPED_TOKEN_VAULT_HASH, - DEPLOYED_ADDRESS as STOX_WRAPPED_TOKEN_VAULT_ADDR -} from "../generated/StoxWrappedTokenVault.pointers.sol"; -import { - BYTECODE_HASH as STOX_UNIFIED_DEPLOYER_HASH, - DEPLOYED_ADDRESS as STOX_UNIFIED_DEPLOYER_ADDR -} from "../generated/StoxUnifiedDeployer.pointers.sol"; -import { - BYTECODE_HASH as STOX_WRAPPED_TOKEN_VAULT_BEACON_HASH, - DEPLOYED_ADDRESS as STOX_WRAPPED_TOKEN_VAULT_BEACON_ADDR -} from "../generated/StoxWrappedTokenVaultBeacon.pointers.sol"; -import { - BYTECODE_HASH as STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_HASH, - DEPLOYED_ADDRESS as STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_ADDR -} from "../generated/StoxWrappedTokenVaultBeaconSetDeployer.pointers.sol"; -import { - BYTECODE_HASH as STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_HASH, - DEPLOYED_ADDRESS as STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_ADDR -} from "../generated/StoxOffchainAssetReceiptVaultBeaconSetDeployer.pointers.sol"; -import { - BYTECODE_HASH as STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_HASH, - DEPLOYED_ADDRESS as STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_ADDR -} from "../generated/StoxOffchainAssetReceiptVaultAuthorizerV1.pointers.sol"; -import { - BYTECODE_HASH as STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_HASH, - DEPLOYED_ADDRESS as STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_ADDR -} from "../generated/StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1.pointers.sol"; -import { - BYTECODE_HASH as STOX_CORPORATE_ACTIONS_FACET_HASH, - DEPLOYED_ADDRESS as STOX_CORPORATE_ACTIONS_FACET_ADDR -} from "../generated/StoxCorporateActionsFacet.pointers.sol"; - -/// @title LibProdDeployV3 -/// @notice V3 production deployment addresses and codehashes for the Stox -/// deployment via the Zoltu deterministic deployer. V3 adds ERC-165 to -/// deployers, deployer interface inheritance, corporate action role admins -/// to the authorizer, and updates the upstream rain.vats dependency. -/// Addresses are deterministic and identical across all EVM networks. -library LibProdDeployV3 { - /// @dev The initial owner for all beacons. Resolves to rainlang.eth. - address constant BEACON_INITIAL_OWNER = address(0x8E4bdeec7CEB9570D440676345dA1dCe10329f5b); - - /// @dev Deterministic Zoltu address for StoxReceipt (unchanged from V2). - address constant STOX_RECEIPT = STOX_RECEIPT_ADDR; - bytes32 constant STOX_RECEIPT_CODEHASH = STOX_RECEIPT_HASH; - - /// @dev Deterministic Zoltu address for StoxReceiptVault (unchanged from V2). - address constant STOX_RECEIPT_VAULT = STOX_RECEIPT_VAULT_ADDR; - bytes32 constant STOX_RECEIPT_VAULT_CODEHASH = STOX_RECEIPT_VAULT_HASH; - - /// @dev Deterministic Zoltu address for StoxWrappedTokenVault (unchanged from V2). - address constant STOX_WRAPPED_TOKEN_VAULT = STOX_WRAPPED_TOKEN_VAULT_ADDR; - bytes32 constant STOX_WRAPPED_TOKEN_VAULT_CODEHASH = STOX_WRAPPED_TOKEN_VAULT_HASH; - - /// @dev Deterministic Zoltu address for StoxUnifiedDeployer. - address constant STOX_UNIFIED_DEPLOYER = STOX_UNIFIED_DEPLOYER_ADDR; - bytes32 constant STOX_UNIFIED_DEPLOYER_CODEHASH = STOX_UNIFIED_DEPLOYER_HASH; - - /// @dev Deterministic Zoltu address for StoxWrappedTokenVaultBeacon (unchanged from V2). - address constant STOX_WRAPPED_TOKEN_VAULT_BEACON = STOX_WRAPPED_TOKEN_VAULT_BEACON_ADDR; - bytes32 constant STOX_WRAPPED_TOKEN_VAULT_BEACON_CODEHASH = STOX_WRAPPED_TOKEN_VAULT_BEACON_HASH; - - /// @dev Deterministic Zoltu address for StoxOffchainAssetReceiptVaultBeaconSetDeployer. - address constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER = - STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_ADDR; - bytes32 constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CODEHASH = - STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_HASH; - - /// @dev Deterministic Zoltu address for StoxWrappedTokenVaultBeaconSetDeployer. - address constant STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER = STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_ADDR; - bytes32 constant STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_CODEHASH = - STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_HASH; - - /// @dev Deterministic Zoltu address for StoxOffchainAssetReceiptVaultAuthorizerV1. - address constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1 = - STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_ADDR; - bytes32 constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_CODEHASH = - STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_HASH; - - /// @dev Deterministic Zoltu address for StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1. - address constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1 = - STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_ADDR; - bytes32 constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_CODEHASH = - STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_HASH; - - /// @dev Deterministic Zoltu address for StoxCorporateActionsFacet. The - /// vault's `fallback()` hardcodes this address and delegatecalls every - /// non-matching selector here; changing the facet bytecode requires - /// redeploying the vault implementation too. - address constant STOX_CORPORATE_ACTIONS_FACET = STOX_CORPORATE_ACTIONS_FACET_ADDR; - /// @dev Codehash of StoxCorporateActionsFacet when deployed via Zoltu. - bytes32 constant STOX_CORPORATE_ACTIONS_FACET_CODEHASH = STOX_CORPORATE_ACTIONS_FACET_HASH; -} diff --git a/src/lib/LibProdDeployV4.sol b/src/lib/LibProdDeployV4.sol index 03d17a46..fd887a57 100644 --- a/src/lib/LibProdDeployV4.sol +++ b/src/lib/LibProdDeployV4.sol @@ -3,42 +3,40 @@ pragma solidity ^0.8.25; /// @title LibProdDeployV4 -/// @notice V4 production deployment pins for the ST0x contract set on Base. -/// V4 is rebuilt against the patched `rain.vats` tag carrying the high-severity -/// vulnerability fix (rainlanguage/rain.vats#313). Every deterministic Zoltu -/// address derives from the compiled bytecode, so the patched rain.vats tag -/// produces a new address for every Zoltu-deployed implementation in this set. +/// @notice V4 production deployment pins for the ST0x contract set on Base, +/// rebuilt against the audited rain.vats `sol-v0.1.6` tag (Renascence Labs +/// audit dated 2026-06; H01 "ERC1155 acceptance callback enables persistent +/// operator approval via `_msgSender` spoofing" fixed at upstream commit +/// `5275093` and reflected as the 0.1.6 Soldeer pin in `foundry.toml`). +/// Every deterministic Zoltu address derives from the compiled bytecode, so +/// every ST0x contract whose source-or-dependency tree changed under the +/// rain.vats bump gets a new V4 address here. /// -/// **All address and codehash constants in this lib are PLACEHOLDERS** until -/// (a) DM cuts the patched rain.vats tag, (b) we bump the `rain-vats` Soldeer -/// pin in this repo, and (c) `script/BuildPointers.s.sol` regenerates the -/// `src/generated/*.pointers.sol` files. Once those land, swap each placeholder -/// for the imported `BYTECODE_HASH` / `DEPLOYED_ADDRESS` from the regenerated -/// pointers (mirroring `LibProdDeployV3`'s structure), and rename every -/// `_RAIN_VATS_TBD` suffix to the actual tag (e.g. `_RAIN_VATS_0_1_6`). +/// **The clone (`STOX_PROD_AUTHORISER_V4_CLONE`) is still `address(0)`** — +/// it gets hydrated by the V4 authoriser deploy script (sibling PR), which +/// is the only entry that isn't deterministic at lib-author time. Every +/// other address + codehash pair is the Zoltu-deterministic value generated +/// by `script/BuildPointers.sol` against rain.vats 0.1.6 and mirrors the +/// `DEPLOYED_ADDRESS` constants in `src/generated/*.pointers.sol`. /// -/// While the placeholders are in place, any script or test that asserts -/// against these constants (notably the V3 upgrade script and its fork tests) -/// will deliberately fail — the red CI is the forcing function that the -/// rebuild on the patched tag must complete before the V3 upgrade can ship. +/// Naming convention (per Josh + DM, 2026-05-31): the rain.vats tag is +/// encoded in each deployed-contract constant name (`_RAIN_VATS_0_1_6`) so a +/// future tag bump produces a new constant rather than silently overwriting +/// an existing one. The lib name itself is generic (`LibProdDeployV4`) — +/// Soldeer's import path already encodes the version at the dependency +/// boundary, so the lib name doesn't need to. /// -/// Naming convention (per Josh + DM, 2026-05-31): the rain.vats tag is encoded -/// in each deployed-contract constant name so a future tag bump produces a new -/// constant rather than silently overwriting an existing one. The lib name -/// itself is generic (`LibProdDeployV4`) — Soldeer's import path already -/// encodes the version at the dependency boundary, so the lib name doesn't -/// need to. -/// -/// `LibProdDeployV3` is retained for archaeological reference (it pins the -/// pre-patch rain.vats 0.1.5 addresses that are not safe to ship) but should -/// no longer be referenced by any active script. +/// The frozen pre-V4 deployments are pinned in `LibProdDeployV1` and +/// `LibProdDeployV2` as audit trails; active source and scripts reference this +/// (latest) lib. library LibProdDeployV4 { - /// @notice Placeholder rain.vats tag suffix. Search-and-replace this token - /// across the whole lib with the real tag (e.g. `RAIN_VATS_0_1_6`) once DM - /// cuts and propagates the patched rain.vats tag. + /// @notice The rain.vats tag whose audited build these constants pin. + /// Encoded in every deployed-contract constant name (e.g. + /// `STOX_RECEIPT_RAIN_VATS_0_1_6`) so a future tag bump produces a new + /// constant alongside this one rather than silently overwriting. /// @dev String constant, present only as a written reminder — Solidity has - /// no preprocessor so the rename must be done by hand in the source. - string constant RAIN_VATS_TAG_PLACEHOLDER = "RAIN_VATS_TBD"; + /// no preprocessor so future renames must be done by hand in the source. + string constant RAIN_VATS_TAG = "RAIN_VATS_0_1_6"; /// @notice The beacon initial owner. Resolves to rainlang.eth. Unchanged /// across V1 / V2 / V3 / V4; this is the EOA that receives ownership at @@ -47,51 +45,74 @@ library LibProdDeployV4 { address constant BEACON_INITIAL_OWNER = address(0x8E4bdeec7CEB9570D440676345dA1dCe10329f5b); // ========================================================================= - // Deployed-contract pointers — all PLACEHOLDER until patched rain.vats tag - // lands and `BuildPointers` regenerates `src/generated/*.pointers.sol`. - // Rename every `_RAIN_VATS_TBD` suffix to the actual tag at that point. + // Deployed-contract pointers for the audited rain.vats 0.1.6 build. + // + // Each `_RAIN_VATS_0_1_6` constant pair is the deterministic Zoltu + // address and its runtime codehash for the ST0x contract compiled against + // `rain-vats = "0.1.6"` (see `foundry.toml`). The addresses match the + // `DEPLOYED_ADDRESS` constants in `src/generated/*.pointers.sol` — that + // file is the authoritative source generated by + // `script/BuildPointers.sol`. The codehashes here are + // `keccak256(RUNTIME_CODE)` from the same pointer files; a future + // `BuildPointers` run must regenerate them in lockstep with any rain.vats + // bump. // ========================================================================= - address constant STOX_RECEIPT_RAIN_VATS_TBD = address(0); - bytes32 constant STOX_RECEIPT_CODEHASH_RAIN_VATS_TBD = bytes32(0); + address constant STOX_RECEIPT_RAIN_VATS_0_1_6 = address(0x2dF5cFE6d688EF9fF1B7c59A499D254b1527b286); + bytes32 constant STOX_RECEIPT_CODEHASH_RAIN_VATS_0_1_6 = + 0x06fffbad12ea80897d55aab5d4f1cd3f34f674237db44a148cc133334a0cca54; - address constant STOX_RECEIPT_VAULT_RAIN_VATS_TBD = address(0); - bytes32 constant STOX_RECEIPT_VAULT_CODEHASH_RAIN_VATS_TBD = bytes32(0); + address constant STOX_RECEIPT_VAULT_RAIN_VATS_0_1_6 = address(0x2BCcEd626566Ef1e65F922DD03748C5C7aa2d748); + bytes32 constant STOX_RECEIPT_VAULT_CODEHASH_RAIN_VATS_0_1_6 = + 0x11da975b8024dd98441bfdf42a68462fa5db9bd4e3af348f05928ef359924671; - address constant STOX_WRAPPED_TOKEN_VAULT_RAIN_VATS_TBD = address(0); - bytes32 constant STOX_WRAPPED_TOKEN_VAULT_CODEHASH_RAIN_VATS_TBD = bytes32(0); + address constant STOX_WRAPPED_TOKEN_VAULT_RAIN_VATS_0_1_6 = address(0x0D99e0174DbF885ceD6AE8dEb939b0F890450099); + bytes32 constant STOX_WRAPPED_TOKEN_VAULT_CODEHASH_RAIN_VATS_0_1_6 = + 0x6de4c556c1811293da4ad2e509ee476f3eb635f019845087e1d2777a1b272034; - address constant STOX_UNIFIED_DEPLOYER_RAIN_VATS_TBD = address(0); - bytes32 constant STOX_UNIFIED_DEPLOYER_CODEHASH_RAIN_VATS_TBD = bytes32(0); + address constant STOX_UNIFIED_DEPLOYER_RAIN_VATS_0_1_6 = address(0x81D0ecD58346bf2d484E7774f55EABc1AA3F4bcc); + bytes32 constant STOX_UNIFIED_DEPLOYER_CODEHASH_RAIN_VATS_0_1_6 = + 0x91035080d8e610cc0657d7f44efa8fbf57ce5800e6a35694d107c05987d24e3f; - address constant STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_TBD = address(0); - bytes32 constant STOX_WRAPPED_TOKEN_VAULT_BEACON_CODEHASH_RAIN_VATS_TBD = bytes32(0); + address constant STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_0_1_6 = + address(0x9FD790f65CA3aF2772358c653F097f0a4c7EE7d2); + bytes32 constant STOX_WRAPPED_TOKEN_VAULT_BEACON_CODEHASH_RAIN_VATS_0_1_6 = + 0x8e95867e52db417944afd90f3b6c3c980962831e8a944e7f6958ba8f8cc10630; - address constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_TBD = address(0); - bytes32 constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CODEHASH_RAIN_VATS_TBD = bytes32(0); + address constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 = + address(0xd64246e6b25F745f005E6233e050C9B879E660Dc); + bytes32 constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CODEHASH_RAIN_VATS_0_1_6 = + 0x621c1edbd850939acba8bcd999812a83999b5680d4ca6804e1995b95f138b9e5; - address constant STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_TBD = address(0); - bytes32 constant STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_CODEHASH_RAIN_VATS_TBD = bytes32(0); + address constant STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 = + address(0xbe5f05C4576e6D3e7bCCb4E64f08fc4F46Adf0cA); + bytes32 constant STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_CODEHASH_RAIN_VATS_0_1_6 = + 0xa2c4bd29f36bc6636938f3ad66e6de5d126ce41ed3134bed166cde259d5775ad; /// @dev The corporate-action-aware authoriser impl. The clone deployed /// for the issuer (see `STOX_PROD_AUTHORISER_V4_CLONE` below) points /// at this impl via EIP-1167. - address constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_RAIN_VATS_TBD = address(0); - bytes32 constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_CODEHASH_RAIN_VATS_TBD = bytes32(0); + address constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_RAIN_VATS_0_1_6 = + address(0x2EA0d35d0B1F57C42e6130f298930228bCbFDe9b); + bytes32 constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_CODEHASH_RAIN_VATS_0_1_6 = + 0xf8a1d9b2fa068bae3c1a607434db48364a5cdab3020bd7e315ed2662a3b35b5f; - address constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_RAIN_VATS_TBD = address(0); - bytes32 constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_CODEHASH_RAIN_VATS_TBD = bytes32(0); + address constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_RAIN_VATS_0_1_6 = + address(0xeaD68E489Cb19453b294dc46a3A5710b0d46d17F); + bytes32 constant STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_CODEHASH_RAIN_VATS_0_1_6 = + 0x4d94318cde48f1bc20f97e00aefad84bfb7c9db15c81b882862e127b05e06e15; /// @dev The corporate-actions facet. The receipt vault's `fallback()` /// hardcodes this address and delegatecalls every non-matching selector /// here, so a facet bytecode change forces a vault impl redeploy too. With /// the new rain.vats tag the receipt vault impl is rebuilt, so this facet /// is rebuilt in lock-step. - address constant STOX_CORPORATE_ACTIONS_FACET_RAIN_VATS_TBD = address(0); - bytes32 constant STOX_CORPORATE_ACTIONS_FACET_CODEHASH_RAIN_VATS_TBD = bytes32(0); + address constant STOX_CORPORATE_ACTIONS_FACET_RAIN_VATS_0_1_6 = address(0x51f78B77EdffDB62b8AeB753066C318a46D05D74); + bytes32 constant STOX_CORPORATE_ACTIONS_FACET_CODEHASH_RAIN_VATS_0_1_6 = + 0x2a67c52129dff74d956bb7dcde1aac598c28dd29685237aca56dccb1d49bd6f8; /// @notice The V4 production authoriser clone — an EIP-1167 minimal - /// proxy of `STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_RAIN_VATS_TBD` + /// proxy of `STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_RAIN_VATS_0_1_6` /// that the upgrade script `setAuthorizer`s every production receipt /// vault onto, replacing the current pre-V3 clone pinned in /// `LibAuthoriserInvariants.STOX_PROD_AUTHORISER`. diff --git a/src/lib/LibStoxDeployNetworks.sol b/src/lib/LibStoxDeployNetworks.sol new file mode 100644 index 00000000..7aa036ac --- /dev/null +++ b/src/lib/LibStoxDeployNetworks.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity ^0.8.25; + +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; + +/// @title LibStoxDeployNetworks +/// @notice Single source of truth for the networks the ST0x production deploy +/// broadcasts to. `script/Deploy.sol` reads this instead of hardcoding the list +/// inline, so the supported-network set lives in one place. ST0x deploys to +/// Base only. +library LibStoxDeployNetworks { + /// @notice The networks each suite in `script/Deploy.sol` is broadcast to. + /// @return networks The list of network names (Base only). + function supportedNetworks() internal pure returns (string[] memory networks) { + networks = new string[](1); + networks[0] = LibRainDeploy.BASE; + } +} diff --git a/test/lib/LibTestDeploy.sol b/test/lib/LibTestDeploy.sol index 59a858c5..2e2921c7 100644 --- a/test/lib/LibTestDeploy.sol +++ b/test/lib/LibTestDeploy.sol @@ -3,8 +3,8 @@ pragma solidity ^0.8.25; import {Vm} from "forge-std-1.16.1/src/Vm.sol"; -import {LibRainDeploy} from "rain-deploy-0.1.3/src/lib/LibRainDeploy.sol"; -import {LibProdDeployV3} from "../../src/lib/LibProdDeployV3.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; +import {LibProdDeployV4} from "../../src/lib/LibProdDeployV4.sol"; import {StoxReceipt} from "../../src/concrete/StoxReceipt.sol"; import {StoxReceiptVault} from "../../src/concrete/StoxReceiptVault.sol"; import {StoxWrappedTokenVault} from "../../src/concrete/StoxWrappedTokenVault.sol"; @@ -20,22 +20,25 @@ import { /// @title LibTestDeploy /// @notice Deploys the full Stox contract suite via Zoltu in a test /// environment. Etches the Zoltu factory and deploys each contract, -/// asserting deterministic addresses match LibProdDeployV3. +/// asserting deterministic addresses match LibProdDeployV4. library LibTestDeploy { function deployWrappedTokenVaultBeaconSet(Vm vm) internal { LibRainDeploy.etchZoltuFactory(vm); address vault = LibRainDeploy.deployZoltu(type(StoxWrappedTokenVault).creationCode); - require(vault == LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT, "StoxWrappedTokenVault address mismatch"); + require( + vault == LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_RAIN_VATS_0_1_6, "StoxWrappedTokenVault address mismatch" + ); address beacon = LibRainDeploy.deployZoltu(type(StoxWrappedTokenVaultBeacon).creationCode); require( - beacon == LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON, "StoxWrappedTokenVaultBeacon address mismatch" + beacon == LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_0_1_6, + "StoxWrappedTokenVaultBeacon address mismatch" ); address deployer = LibRainDeploy.deployZoltu(type(StoxWrappedTokenVaultBeaconSetDeployer).creationCode); require( - deployer == LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER, + deployer == LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6, "StoxWrappedTokenVaultBeaconSetDeployer address mismatch" ); } @@ -44,14 +47,14 @@ library LibTestDeploy { LibRainDeploy.etchZoltuFactory(vm); address receipt = LibRainDeploy.deployZoltu(type(StoxReceipt).creationCode); - require(receipt == LibProdDeployV3.STOX_RECEIPT, "StoxReceipt address mismatch"); + require(receipt == LibProdDeployV4.STOX_RECEIPT_RAIN_VATS_0_1_6, "StoxReceipt address mismatch"); address receiptVault = LibRainDeploy.deployZoltu(type(StoxReceiptVault).creationCode); - require(receiptVault == LibProdDeployV3.STOX_RECEIPT_VAULT, "StoxReceiptVault address mismatch"); + require(receiptVault == LibProdDeployV4.STOX_RECEIPT_VAULT_RAIN_VATS_0_1_6, "StoxReceiptVault address mismatch"); address deployer = LibRainDeploy.deployZoltu(type(StoxOffchainAssetReceiptVaultBeaconSetDeployer).creationCode); require( - deployer == LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER, + deployer == LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6, "StoxOffchainAssetReceiptVaultBeaconSetDeployer address mismatch" ); } @@ -61,6 +64,8 @@ library LibTestDeploy { deployOffchainAssetReceiptVaultBeaconSet(vm); address unified = LibRainDeploy.deployZoltu(type(StoxUnifiedDeployer).creationCode); - require(unified == LibProdDeployV3.STOX_UNIFIED_DEPLOYER, "StoxUnifiedDeployer address mismatch"); + require( + unified == LibProdDeployV4.STOX_UNIFIED_DEPLOYER_RAIN_VATS_0_1_6, "StoxUnifiedDeployer address mismatch" + ); } } diff --git a/test/lib/LibTestProd.sol b/test/lib/LibTestProd.sol index d5944117..533089e9 100644 --- a/test/lib/LibTestProd.sol +++ b/test/lib/LibTestProd.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.25; import {Vm} from "forge-std-1.16.1/src/StdCheats.sol"; -import {LibRainDeploy} from "rain-deploy-0.1.3/src/lib/LibRainDeploy.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; uint256 constant PROD_TEST_BLOCK_NUMBER_BASE = 47842154; diff --git a/test/lib/LibTestTofu.sol b/test/lib/LibTestTofu.sol index 343b4e62..e323dc42 100644 --- a/test/lib/LibTestTofu.sol +++ b/test/lib/LibTestTofu.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {Vm} from "forge-std-1.16.1/src/Vm.sol"; -import {LibRainDeploy} from "rain-deploy-0.1.3/src/lib/LibRainDeploy.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; import {LibTOFUTokenDecimals} from "rain-tofu-erc20-decimals-0.1.1/src/lib/LibTOFUTokenDecimals.sol"; /// @title LibTestTofu diff --git a/test/script/Deploy.t.sol b/test/script/Deploy.t.sol index 52cf69e3..93144e3e 100644 --- a/test/script/Deploy.t.sol +++ b/test/script/Deploy.t.sol @@ -5,32 +5,44 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; import { Deploy, - DEPLOYMENT_SUITE_STOX_RECEIPT, - DEPLOYMENT_SUITE_STOX_RECEIPT_VAULT, - DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT, - DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_BEACON, - DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER, - DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER, - DEPLOYMENT_SUITE_STOX_UNIFIED_DEPLOYER, + DEPLOYMENT_SUITE_STOX_RECEIPT_V4, + DEPLOYMENT_SUITE_STOX_RECEIPT_VAULT_V4, + DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_V4, + DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_BEACON_V4, + DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_V4, + DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_V4, + DEPLOYMENT_SUITE_STOX_UNIFIED_DEPLOYER_V4, + DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_V4, + DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_V4, + DEPLOYMENT_SUITE_STOX_CORPORATE_ACTIONS_FACET_V4, UnknownDeploymentSuite } from "../../script/Deploy.sol"; contract DeployTest is Test { /// Deployment suite constants must match their keccak256 strings. function testDeploymentSuiteConstants() external pure { - assertEq(DEPLOYMENT_SUITE_STOX_RECEIPT, keccak256("stox-receipt")); - assertEq(DEPLOYMENT_SUITE_STOX_RECEIPT_VAULT, keccak256("stox-receipt-vault")); - assertEq(DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT, keccak256("stox-wrapped-token-vault")); - assertEq(DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_BEACON, keccak256("stox-wrapped-token-vault-beacon")); + assertEq(DEPLOYMENT_SUITE_STOX_RECEIPT_V4, keccak256("stox-receipt-v4")); + assertEq(DEPLOYMENT_SUITE_STOX_RECEIPT_VAULT_V4, keccak256("stox-receipt-vault-v4")); + assertEq(DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_V4, keccak256("stox-wrapped-token-vault-v4")); + assertEq(DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_BEACON_V4, keccak256("stox-wrapped-token-vault-beacon-v4")); assertEq( - DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER, - keccak256("stox-wrapped-token-vault-beacon-set-deployer") + DEPLOYMENT_SUITE_STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_V4, + keccak256("stox-wrapped-token-vault-beacon-set-deployer-v4") ); assertEq( - DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER, - keccak256("stox-offchain-asset-receipt-vault-beacon-set-deployer") + DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_V4, + keccak256("stox-offchain-asset-receipt-vault-beacon-set-deployer-v4") ); - assertEq(DEPLOYMENT_SUITE_STOX_UNIFIED_DEPLOYER, keccak256("stox-unified-deployer")); + assertEq(DEPLOYMENT_SUITE_STOX_UNIFIED_DEPLOYER_V4, keccak256("stox-unified-deployer-v4")); + assertEq( + DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_V4, + keccak256("stox-offchain-asset-receipt-vault-authorizer-v1-v4") + ); + assertEq( + DEPLOYMENT_SUITE_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_V4, + keccak256("stox-offchain-asset-receipt-vault-payment-mint-authorizer-v1-v4") + ); + assertEq(DEPLOYMENT_SUITE_STOX_CORPORATE_ACTIONS_FACET_V4, keccak256("stox-corporate-actions-facet-v4")); } /// Unknown deployment suite must revert with UnknownDeploymentSuite. diff --git a/test/script/MigrateBeaconOwnersTest.t.sol b/test/script/MigrateBeaconOwnersTest.t.sol index b5b8a931..ccceade5 100644 --- a/test/script/MigrateBeaconOwnersTest.t.sol +++ b/test/script/MigrateBeaconOwnersTest.t.sol @@ -11,7 +11,7 @@ import {LibProdDeployV1} from "../../src/lib/LibProdDeployV1.sol"; import {LibSafeInvariants} from "../../src/lib/LibSafeInvariants.sol"; import {BeaconOwnerMismatch} from "../../src/lib/LibBeaconInvariants.sol"; import {MigrateBeaconOwnersHarness} from "./MigrateBeaconOwnersHarness.sol"; -import {LibRainDeploy} from "rain-deploy-0.1.3/src/lib/LibRainDeploy.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; /// @title MigrateBeaconOwnersTest /// @notice End-to-end fork tests for the beacon-ownership migration. Because diff --git a/test/script/MigrateMultisigThresholdTest.t.sol b/test/script/MigrateMultisigThresholdTest.t.sol index 5732fccd..abb61fd1 100644 --- a/test/script/MigrateMultisigThresholdTest.t.sol +++ b/test/script/MigrateMultisigThresholdTest.t.sol @@ -14,7 +14,7 @@ import {LibSafeOps, SafeTx} from "../../src/lib/LibSafeOps.sol"; import {LibSafeInvariants, SafeThresholdMismatch} from "../../src/lib/LibSafeInvariants.sol"; import {IOwnable, ReceiptVaultOwnerMismatch} from "../../src/lib/LibTokenInvariants.sol"; import {LibTokenInvariants} from "../../src/lib/LibTokenInvariants.sol"; -import {LibRainDeploy} from "rain-deploy-0.1.3/src/lib/LibRainDeploy.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; /// @title MigrateMultisigThresholdTest /// @notice End-to-end fork tests for the multisig threshold migration diff --git a/test/src/concrete/StoxReceiptVaultFallbackRouting.t.sol b/test/src/concrete/StoxReceiptVaultFallbackRouting.t.sol index b9d5ad13..17f405f8 100644 --- a/test/src/concrete/StoxReceiptVaultFallbackRouting.t.sol +++ b/test/src/concrete/StoxReceiptVaultFallbackRouting.t.sol @@ -10,7 +10,7 @@ import { ACTION_TYPE_INIT_V1, ACTION_TYPE_STOCK_SPLIT_V1 } from "../../../src/interface/ICorporateActionsV1.sol"; -import {LibProdDeployV3} from "../../../src/lib/LibProdDeployV3.sol"; +import {LibProdDeployV4} from "../../../src/lib/LibProdDeployV4.sol"; import {STOCK_SPLIT_V1_TYPE_HASH, UnknownActionType} from "../../../src/lib/LibCorporateAction.sol"; import {CompletionFilter, NODE_NONE} from "../../../src/lib/LibCorporateActionNode.sol"; import {IAuthorizeV1, Unauthorized} from "rain-vats-0.1.6/src/interface/IAuthorizeV1.sol"; @@ -27,14 +27,14 @@ bytes32 constant OFFCHAIN_ASSET_RECEIPT_VAULT_STORAGE_LOCATION = /// Fallback routing tests for `StoxReceiptVault`. The vault's `fallback()` /// override delegatecalls into `StoxCorporateActionsFacet` at the deterministic -/// `LibProdDeployV3.STOX_CORPORATE_ACTIONS_FACET` address. +/// `LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_RAIN_VATS_0_1_6` address. /// /// The facet's `onlyDelegatecalled` modifier relies on an immutable `_SELF` /// captured in the constructor. `vm.etch` would leave `_SELF` pointing at the /// original temporary deploy address, so the "direct call reverts" assertion /// would not exercise the real guard. We use `vm.deployCodeTo` instead which /// runs the constructor at the target address, so the facet's `_SELF` matches -/// the `LibProdDeployV3` constant exactly. +/// the `LibProdDeployV4` constant exactly. contract StoxReceiptVaultFallbackRoutingTest is Test { StoxReceiptVault internal vault; PermissiveAuthorizer internal mockAuthorizer; @@ -50,7 +50,7 @@ contract StoxReceiptVaultFallbackRoutingTest is Test { // constructor there so `_SELF` resolves to `STOX_CORPORATE_ACTIONS_FACET`. deployCodeTo( "src/concrete/StoxCorporateActionsFacet.sol:StoxCorporateActionsFacet", - LibProdDeployV3.STOX_CORPORATE_ACTIONS_FACET + LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_RAIN_VATS_0_1_6 ); vault = new StoxReceiptVault(); @@ -138,10 +138,11 @@ contract StoxReceiptVaultFallbackRoutingTest is Test { /// Direct calls to the facet at its production address revert with /// `FacetMustBeDelegatecalled`. Because we used `vm.deployCodeTo`, the - /// facet's `_SELF` immutable is the `LibProdDeployV3` constant and + /// facet's `_SELF` immutable is the `LibProdDeployV4` constant and /// `address(this) == _SELF` on a direct call, firing the guard. function testDirectCallToFacetRevertsWithFacetMustBeDelegatecalled() external { - ICorporateActionsV1 facetDirect = ICorporateActionsV1(LibProdDeployV3.STOX_CORPORATE_ACTIONS_FACET); + ICorporateActionsV1 facetDirect = + ICorporateActionsV1(LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_RAIN_VATS_0_1_6); vm.expectRevert(StoxCorporateActionsFacet.FacetMustBeDelegatecalled.selector); facetDirect.completedActionCount(); } diff --git a/test/src/concrete/StoxWrappedTokenVault.t.sol b/test/src/concrete/StoxWrappedTokenVault.t.sol index 215a3152..0d5b4c87 100644 --- a/test/src/concrete/StoxWrappedTokenVault.t.sol +++ b/test/src/concrete/StoxWrappedTokenVault.t.sol @@ -11,8 +11,8 @@ import { ZeroVaultAsset } from "../../../src/concrete/deploy/StoxWrappedTokenVaultBeaconSetDeployer.sol"; import {StoxWrappedTokenVaultBeacon} from "../../../src/concrete/StoxWrappedTokenVaultBeacon.sol"; -import {LibRainDeploy} from "rain-deploy-0.1.3/src/lib/LibRainDeploy.sol"; -import {LibProdDeployV3} from "../../../src/lib/LibProdDeployV3.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; +import {LibProdDeployV4} from "../../../src/lib/LibProdDeployV4.sol"; import {LibTestDeploy} from "../../lib/LibTestDeploy.sol"; import {Initializable} from "@openzeppelin-contracts-upgradeable-5.6.1/proxy/utils/Initializable.sol"; import {MockERC20} from "../../concrete/MockERC20.sol"; @@ -37,16 +37,18 @@ contract StoxWrappedTokenVaultTest is Test { function testInitializeZeroAssetViaDeployer() external { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); vm.expectRevert(abi.encodeWithSelector(ZeroVaultAsset.selector)); - StoxWrappedTokenVaultBeaconSetDeployer(LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER) - .newStoxWrappedTokenVault(address(0)); + StoxWrappedTokenVaultBeaconSetDeployer( + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 + ).newStoxWrappedTokenVault(address(0)); } /// initialize(bytes) with zero asset reverts with ZeroAsset when called /// directly on a proxy (bypassing the deployer). function testInitializeZeroAssetDirect() external { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); - StoxWrappedTokenVault vault = - StoxWrappedTokenVault(address(new BeaconProxy(LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON, ""))); + StoxWrappedTokenVault vault = StoxWrappedTokenVault( + address(new BeaconProxy(LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_0_1_6, "")) + ); vm.expectRevert(abi.encodeWithSelector(ZeroAsset.selector)); vault.initialize(abi.encode(address(0))); } @@ -56,7 +58,7 @@ contract StoxWrappedTokenVaultTest is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); assertEq(vault.asset(), address(asset)); } @@ -65,8 +67,9 @@ contract StoxWrappedTokenVaultTest is Test { function testInitializeReturnsCloneableV2Success() external { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); - StoxWrappedTokenVault vault = - StoxWrappedTokenVault(address(new BeaconProxy(LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON, ""))); + StoxWrappedTokenVault vault = StoxWrappedTokenVault( + address(new BeaconProxy(LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_0_1_6, "")) + ); bytes32 result = vault.initialize(abi.encode(address(asset))); assertEq(result, ICLONEABLE_V2_SUCCESS); } @@ -75,8 +78,9 @@ contract StoxWrappedTokenVaultTest is Test { function testInitializeEmitsEvent() external { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); - StoxWrappedTokenVault vault = - StoxWrappedTokenVault(address(new BeaconProxy(LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON, ""))); + StoxWrappedTokenVault vault = StoxWrappedTokenVault( + address(new BeaconProxy(LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_0_1_6, "")) + ); vm.expectEmit(true, true, false, false, address(vault)); emit StoxWrappedTokenVault.StoxWrappedTokenVaultInitialized(address(this), address(asset)); vault.initialize(abi.encode(address(asset))); @@ -86,8 +90,9 @@ contract StoxWrappedTokenVaultTest is Test { function testDoubleInitializeReverts() external { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); - StoxWrappedTokenVault vault = - StoxWrappedTokenVault(address(new BeaconProxy(LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON, ""))); + StoxWrappedTokenVault vault = StoxWrappedTokenVault( + address(new BeaconProxy(LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_0_1_6, "")) + ); vault.initialize(abi.encode(address(asset))); vm.expectRevert(Initializable.InvalidInitialization.selector); vault.initialize(abi.encode(address(asset))); @@ -98,7 +103,7 @@ contract StoxWrappedTokenVaultTest is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); assertEq(vault.name(), "Wrapped Test Token"); } @@ -108,7 +113,7 @@ contract StoxWrappedTokenVaultTest is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); assertEq(vault.symbol(), "wTT"); } @@ -118,7 +123,7 @@ contract StoxWrappedTokenVaultTest is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); assertEq(vault.totalAssets(), 0); } @@ -129,7 +134,7 @@ contract StoxWrappedTokenVaultTest is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); address alice = address(0xA11CE); @@ -151,7 +156,7 @@ contract StoxWrappedTokenVaultTest is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); address alice = address(0xA11CE); @@ -176,7 +181,7 @@ contract StoxWrappedTokenVaultTest is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); uint256 shares = vault.convertToShares(amount); @@ -190,7 +195,7 @@ contract StoxWrappedTokenVaultTest is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); uint256 expectedShares = vault.previewDeposit(amount); @@ -212,7 +217,7 @@ contract StoxWrappedTokenVaultTest is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); address alice = address(0xA11CE); @@ -236,7 +241,7 @@ contract StoxWrappedTokenVaultTest is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); assertEq(vault.maxDeposit(receiver), type(uint256).max); } @@ -246,7 +251,7 @@ contract StoxWrappedTokenVaultTest is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); assertEq(vault.maxMint(receiver), type(uint256).max); } @@ -257,7 +262,7 @@ contract StoxWrappedTokenVaultTest is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); address alice = address(0xA11CE); @@ -278,7 +283,7 @@ contract StoxWrappedTokenVaultTest is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); address alice = address(0xA11CE); @@ -299,7 +304,7 @@ contract StoxWrappedTokenVaultTest is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); address alice = address(0xA11CE); @@ -321,7 +326,7 @@ contract StoxWrappedTokenVaultTest is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); address alice = address(0xA11CE); @@ -346,7 +351,7 @@ contract StoxWrappedTokenVaultTest is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); address alice = address(0xA11CE); @@ -376,7 +381,7 @@ contract StoxWrappedTokenVaultTest is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); address alice = address(0xA11CE); diff --git a/test/src/concrete/StoxWrappedTokenVaultBeacon.t.sol b/test/src/concrete/StoxWrappedTokenVaultBeacon.t.sol index c538970d..2a28771b 100644 --- a/test/src/concrete/StoxWrappedTokenVaultBeacon.t.sol +++ b/test/src/concrete/StoxWrappedTokenVaultBeacon.t.sol @@ -3,11 +3,11 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; -import {LibRainDeploy} from "rain-deploy-0.1.3/src/lib/LibRainDeploy.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; import {StoxWrappedTokenVault} from "../../../src/concrete/StoxWrappedTokenVault.sol"; import {StoxWrappedTokenVaultBeacon} from "../../../src/concrete/StoxWrappedTokenVaultBeacon.sol"; import {LibProdDeployV1} from "../../../src/lib/LibProdDeployV1.sol"; -import {LibProdDeployV3} from "../../../src/lib/LibProdDeployV3.sol"; +import {LibProdDeployV4} from "../../../src/lib/LibProdDeployV4.sol"; import {Ownable} from "@openzeppelin-contracts-5.6.1/access/Ownable.sol"; import {UpgradeableBeacon} from "@openzeppelin-contracts-5.6.1/proxy/beacon/UpgradeableBeacon.sol"; @@ -22,28 +22,31 @@ contract StoxWrappedTokenVaultBeaconTest is Test { function testBeaconConstructsWithExpectedConstants() external { address beacon = deployBeacon(); - assertEq(beacon, LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON); - assertEq(StoxWrappedTokenVaultBeacon(beacon).implementation(), LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT); - assertEq(Ownable(beacon).owner(), LibProdDeployV3.BEACON_INITIAL_OWNER); + assertEq(beacon, LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_0_1_6); + assertEq( + StoxWrappedTokenVaultBeacon(beacon).implementation(), + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_RAIN_VATS_0_1_6 + ); + assertEq(Ownable(beacon).owner(), LibProdDeployV4.BEACON_INITIAL_OWNER); } - /// BEACON_INITIAL_OWNER is the same across V1 and V3. + /// BEACON_INITIAL_OWNER is the same across V1 and V4. function testBeaconInitialOwnerConsistentAcrossVersions() external pure { - assertEq(LibProdDeployV1.BEACON_INITIAL_OWNER, LibProdDeployV3.BEACON_INITIAL_OWNER); + assertEq(LibProdDeployV1.BEACON_INITIAL_OWNER, LibProdDeployV4.BEACON_INITIAL_OWNER); } /// Owner can upgrade implementation. function testUpgradeToByOwner() external { address beacon = deployBeacon(); StoxWrappedTokenVault newImpl = new StoxWrappedTokenVault(); - vm.prank(LibProdDeployV3.BEACON_INITIAL_OWNER); + vm.prank(LibProdDeployV4.BEACON_INITIAL_OWNER); UpgradeableBeacon(beacon).upgradeTo(address(newImpl)); assertEq(UpgradeableBeacon(beacon).implementation(), address(newImpl)); } /// Non-owner cannot upgrade implementation. function testUpgradeToByNonOwnerReverts(address nonOwner) external { - vm.assume(nonOwner != LibProdDeployV3.BEACON_INITIAL_OWNER); + vm.assume(nonOwner != LibProdDeployV4.BEACON_INITIAL_OWNER); address beacon = deployBeacon(); StoxWrappedTokenVault newImpl = new StoxWrappedTokenVault(); vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, nonOwner)); @@ -55,14 +58,14 @@ contract StoxWrappedTokenVaultBeaconTest is Test { function testTransferOwnership(address newOwner) external { vm.assume(newOwner != address(0)); address beacon = deployBeacon(); - vm.prank(LibProdDeployV3.BEACON_INITIAL_OWNER); + vm.prank(LibProdDeployV4.BEACON_INITIAL_OWNER); Ownable(beacon).transferOwnership(newOwner); assertEq(Ownable(beacon).owner(), newOwner); } /// Non-owner cannot transfer ownership. function testTransferOwnershipByNonOwnerReverts(address nonOwner, address newOwner) external { - vm.assume(nonOwner != LibProdDeployV3.BEACON_INITIAL_OWNER); + vm.assume(nonOwner != LibProdDeployV4.BEACON_INITIAL_OWNER); address beacon = deployBeacon(); vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, nonOwner)); vm.prank(nonOwner); @@ -72,7 +75,7 @@ contract StoxWrappedTokenVaultBeaconTest is Test { /// renounceOwnership permanently disables upgrades. function testRenounceOwnershipDisablesUpgrades() external { address beacon = deployBeacon(); - vm.prank(LibProdDeployV3.BEACON_INITIAL_OWNER); + vm.prank(LibProdDeployV4.BEACON_INITIAL_OWNER); Ownable(beacon).renounceOwnership(); assertEq(Ownable(beacon).owner(), address(0)); diff --git a/test/src/concrete/StoxWrappedTokenVaultV2.t.sol b/test/src/concrete/StoxWrappedTokenVaultV2.t.sol index 7ad089d8..b37977c5 100644 --- a/test/src/concrete/StoxWrappedTokenVaultV2.t.sol +++ b/test/src/concrete/StoxWrappedTokenVaultV2.t.sol @@ -8,7 +8,7 @@ import { StoxWrappedTokenVaultBeaconSetDeployer, ZeroVaultAsset } from "../../../src/concrete/deploy/StoxWrappedTokenVaultBeaconSetDeployer.sol"; -import {LibProdDeployV3} from "../../../src/lib/LibProdDeployV3.sol"; +import {LibProdDeployV4} from "../../../src/lib/LibProdDeployV4.sol"; import {LibTestDeploy} from "../../lib/LibTestDeploy.sol"; import {MockERC20} from "../../concrete/MockERC20.sol"; @@ -20,8 +20,9 @@ contract StoxWrappedTokenVaultV2Test is Test { function testV2ZeroAssetReverts() external { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); vm.expectRevert(abi.encodeWithSelector(ZeroVaultAsset.selector)); - StoxWrappedTokenVaultBeaconSetDeployer(LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER) - .newStoxWrappedTokenVault(address(0)); + StoxWrappedTokenVaultBeaconSetDeployer( + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 + ).newStoxWrappedTokenVault(address(0)); } /// V2 StoxWrappedTokenVaultBeaconSetDeployer emits Deployment event @@ -31,8 +32,9 @@ contract StoxWrappedTokenVaultV2Test is Test { MockERC20 asset = new MockERC20(); vm.recordLogs(); - StoxWrappedTokenVaultBeaconSetDeployer(LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER) - .newStoxWrappedTokenVault(address(asset)); + StoxWrappedTokenVaultBeaconSetDeployer( + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 + ).newStoxWrappedTokenVault(address(asset)); Vm.Log[] memory logs = vm.getRecordedLogs(); assertTrue(logs.length > 0, "should have logs"); @@ -64,7 +66,7 @@ contract StoxWrappedTokenVaultV2Test is Test { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); StoxWrappedTokenVault vault = StoxWrappedTokenVaultBeaconSetDeployer( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 ).newStoxWrappedTokenVault(address(asset)); assertEq(vault.asset(), address(asset)); diff --git a/test/src/concrete/deploy/StoxProdV2.t.sol b/test/src/concrete/deploy/StoxProdV2.t.sol index a0f59ffd..aff4534c 100644 --- a/test/src/concrete/deploy/StoxProdV2.t.sol +++ b/test/src/concrete/deploy/StoxProdV2.t.sol @@ -8,7 +8,7 @@ import {LibProdDeployV2BaseOverrides} from "../../../../src/lib/LibProdDeployV2B import {LibSafeInvariants} from "../../../../src/lib/LibSafeInvariants.sol"; import {LibInvariants} from "../../../../src/lib/LibInvariants.sol"; import {IGnosisSafe} from "../../../../src/interface/IGnosisSafe.sol"; -import {LibRainDeploy} from "rain-deploy-0.1.3/src/lib/LibRainDeploy.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; import {IBeacon} from "@openzeppelin-contracts-5.6.1/proxy/beacon/IBeacon.sol"; import {Ownable} from "@openzeppelin-contracts-5.6.1/access/Ownable.sol"; import { diff --git a/test/src/concrete/deploy/StoxProdV4.t.sol b/test/src/concrete/deploy/StoxProdV4.t.sol new file mode 100644 index 00000000..6b6238e8 --- /dev/null +++ b/test/src/concrete/deploy/StoxProdV4.t.sol @@ -0,0 +1,176 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {Test} from "forge-std-1.16.1/src/Test.sol"; +import {LibProdDeployV4} from "../../../../src/lib/LibProdDeployV4.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; +import {IBeacon} from "@openzeppelin-contracts-5.6.1/proxy/beacon/IBeacon.sol"; +import {Ownable} from "@openzeppelin-contracts-5.6.1/access/Ownable.sol"; +import { + IOffchainAssetReceiptVaultBeaconSetDeployerV2 +} from "rain-vats-0.1.6/src/interface/IOffchainAssetReceiptVaultBeaconSetDeployerV2.sol"; + +/// @title StoxProdV4Test +/// @notice Fork test verifying every V4 Zoltu deployment exists on Base with +/// the expected runtime codehash. V4 ships to Base only (the deploy CI targets +/// Base), so unlike `StoxProdV2Test` there is a single network fork here. +/// +/// The codehash pins are the same literals `LibProdDeployV4Test` checks against +/// the generated pointer files and against a fresh Zoltu redeploy. This test +/// closes the loop by asserting the *live on-chain* code at each deterministic +/// address matches those pins, proving the production deploy landed the audited +/// bytecode at the address the source expects. +/// +/// `STOX_PROD_AUTHORISER_V4_CLONE` is a non-deterministic deploy target still +/// pinned as `address(0)` in `LibProdDeployV4`, so it is not checked here; +/// `LibProdDeployV4Test.testAuthoriserV4ClonePlaceholder` guards that +/// placeholder until the clone is hydrated. +contract StoxProdV4Test is Test { + /// Asserts every V4 deployed contract is present at its pinned address with + /// the pinned codehash; that the wrapped-token-vault beacon points at the V4 + /// vault implementation; and that the offchain-asset-receipt-vault + /// beacon-set deployer's two beacons point at the V4 receipt and receipt + /// vault implementations. All three beacons are still held by the beacon + /// initial owner (pre-migration deploy state). + function checkAllV4OnChain() internal view { + assertTrue(LibProdDeployV4.STOX_RECEIPT_RAIN_VATS_0_1_6.code.length > 0, "V4 StoxReceipt not deployed"); + assertEq( + LibProdDeployV4.STOX_RECEIPT_RAIN_VATS_0_1_6.codehash, LibProdDeployV4.STOX_RECEIPT_CODEHASH_RAIN_VATS_0_1_6 + ); + + assertTrue( + LibProdDeployV4.STOX_RECEIPT_VAULT_RAIN_VATS_0_1_6.code.length > 0, "V4 StoxReceiptVault not deployed" + ); + assertEq( + LibProdDeployV4.STOX_RECEIPT_VAULT_RAIN_VATS_0_1_6.codehash, + LibProdDeployV4.STOX_RECEIPT_VAULT_CODEHASH_RAIN_VATS_0_1_6 + ); + + assertTrue( + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_RAIN_VATS_0_1_6.code.length > 0, + "V4 StoxWrappedTokenVault not deployed" + ); + assertEq( + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_RAIN_VATS_0_1_6.codehash, + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_CODEHASH_RAIN_VATS_0_1_6 + ); + + assertTrue( + LibProdDeployV4.STOX_UNIFIED_DEPLOYER_RAIN_VATS_0_1_6.code.length > 0, "V4 StoxUnifiedDeployer not deployed" + ); + assertEq( + LibProdDeployV4.STOX_UNIFIED_DEPLOYER_RAIN_VATS_0_1_6.codehash, + LibProdDeployV4.STOX_UNIFIED_DEPLOYER_CODEHASH_RAIN_VATS_0_1_6 + ); + + assertTrue( + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_0_1_6.code.length > 0, + "V4 StoxWrappedTokenVaultBeacon not deployed" + ); + assertEq( + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_0_1_6.codehash, + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_CODEHASH_RAIN_VATS_0_1_6 + ); + + assertTrue( + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6.code.length > 0, + "V4 StoxWrappedTokenVaultBeaconSetDeployer not deployed" + ); + assertEq( + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6.codehash, + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_CODEHASH_RAIN_VATS_0_1_6 + ); + + assertTrue( + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6.code.length > 0, + "V4 StoxOffchainAssetReceiptVaultBeaconSetDeployer not deployed" + ); + assertEq( + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6.codehash, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CODEHASH_RAIN_VATS_0_1_6 + ); + + assertTrue( + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_RAIN_VATS_0_1_6.code.length > 0, + "V4 StoxOffchainAssetReceiptVaultAuthorizerV1 not deployed" + ); + assertEq( + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_RAIN_VATS_0_1_6.codehash, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_CODEHASH_RAIN_VATS_0_1_6 + ); + + assertTrue( + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_RAIN_VATS_0_1_6.code.length + > 0, + "V4 StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1 not deployed" + ); + assertEq( + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_RAIN_VATS_0_1_6.codehash, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_CODEHASH_RAIN_VATS_0_1_6 + ); + + assertTrue( + LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_RAIN_VATS_0_1_6.code.length > 0, + "V4 StoxCorporateActionsFacet not deployed" + ); + assertEq( + LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_RAIN_VATS_0_1_6.codehash, + LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_CODEHASH_RAIN_VATS_0_1_6 + ); + + // The wrapped-token-vault beacon points at the V4 vault implementation + // and is still held by the beacon initial owner (rainlang.eth), which + // is the deploy-time state before ownership migration to the ST0x + // token-owner Safe. + assertEq( + IBeacon(LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_0_1_6).implementation(), + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_RAIN_VATS_0_1_6, + "V4 beacon implementation mismatch" + ); + assertEq( + Ownable(LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_0_1_6).owner(), + LibProdDeployV4.BEACON_INITIAL_OWNER, + "V4 beacon owner mismatch" + ); + + // The offchain-asset-receipt-vault beacon-set deployer creates two + // beacons in its constructor: the receipt beacon points at the V4 + // receipt implementation and the offchain-asset-receipt-vault beacon + // points at the V4 receipt vault implementation, both held by the + // beacon initial owner. + IOffchainAssetReceiptVaultBeaconSetDeployerV2 oarvDeployer = IOffchainAssetReceiptVaultBeaconSetDeployerV2( + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 + ); + + IBeacon receiptBeacon = oarvDeployer.iReceiptBeacon(); + assertEq( + receiptBeacon.implementation(), + LibProdDeployV4.STOX_RECEIPT_RAIN_VATS_0_1_6, + "V4 OARV receipt beacon implementation mismatch" + ); + assertEq( + Ownable(address(receiptBeacon)).owner(), + LibProdDeployV4.BEACON_INITIAL_OWNER, + "V4 OARV receipt beacon owner mismatch" + ); + + IBeacon vaultBeacon = oarvDeployer.iOffchainAssetReceiptVaultBeacon(); + assertEq( + vaultBeacon.implementation(), + LibProdDeployV4.STOX_RECEIPT_VAULT_RAIN_VATS_0_1_6, + "V4 OARV vault beacon implementation mismatch" + ); + assertEq( + Ownable(address(vaultBeacon)).owner(), + LibProdDeployV4.BEACON_INITIAL_OWNER, + "V4 OARV vault beacon owner mismatch" + ); + } + + /// All V4 contracts MUST be deployed on Base with the expected codehashes. + function testProdDeployBaseV4() external { + vm.createSelectFork(LibRainDeploy.BASE); + checkAllV4OnChain(); + } +} diff --git a/test/src/concrete/deploy/StoxUnifiedDeployer.newTokenAndWrapperVault.t.sol b/test/src/concrete/deploy/StoxUnifiedDeployer.newTokenAndWrapperVault.t.sol index 823178be..bff768b8 100644 --- a/test/src/concrete/deploy/StoxUnifiedDeployer.newTokenAndWrapperVault.t.sol +++ b/test/src/concrete/deploy/StoxUnifiedDeployer.newTokenAndWrapperVault.t.sol @@ -9,7 +9,7 @@ import { import {ReceiptVaultConfigV2} from "rain-vats-0.1.6/src/abstract/ReceiptVault.sol"; import {StoxUnifiedDeployer} from "../../../../src/concrete/deploy/StoxUnifiedDeployer.sol"; import {StoxWrappedTokenVault} from "../../../../src/concrete/StoxWrappedTokenVault.sol"; -import {LibProdDeployV3} from "../../../../src/lib/LibProdDeployV3.sol"; +import {LibProdDeployV4} from "../../../../src/lib/LibProdDeployV4.sol"; import {LibTestDeploy} from "../../../lib/LibTestDeploy.sol"; /// @title StoxUnifiedDeployerIntegrationTest @@ -19,7 +19,7 @@ contract StoxUnifiedDeployerIntegrationTest is Test { /// Deploy full V2 stack via Zoltu and call newTokenAndWrapperVault. function testNewTokenAndWrapperVaultV2Integration() external { LibTestDeploy.deployAll(vm); - StoxUnifiedDeployer unifiedDeployer = StoxUnifiedDeployer(LibProdDeployV3.STOX_UNIFIED_DEPLOYER); + StoxUnifiedDeployer unifiedDeployer = StoxUnifiedDeployer(LibProdDeployV4.STOX_UNIFIED_DEPLOYER_RAIN_VATS_0_1_6); OffchainAssetReceiptVaultConfigV2 memory config = OffchainAssetReceiptVaultConfigV2({ initialAdmin: address(this), diff --git a/test/src/concrete/deploy/StoxUnifiedDeployer.t.sol b/test/src/concrete/deploy/StoxUnifiedDeployer.t.sol index fe44a0a9..9149598a 100644 --- a/test/src/concrete/deploy/StoxUnifiedDeployer.t.sol +++ b/test/src/concrete/deploy/StoxUnifiedDeployer.t.sol @@ -9,7 +9,7 @@ import { OffchainAssetReceiptVault } from "rain-vats-0.1.6/src/concrete/deploy/OffchainAssetReceiptVaultBeaconSetDeployer.sol"; import {StoxUnifiedDeployer} from "../../../../src/concrete/deploy/StoxUnifiedDeployer.sol"; -import {LibProdDeployV3} from "../../../../src/lib/LibProdDeployV3.sol"; +import {LibProdDeployV4} from "../../../../src/lib/LibProdDeployV4.sol"; import {StoxWrappedTokenVault} from "../../../../src/concrete/StoxWrappedTokenVault.sol"; import { StoxWrappedTokenVaultBeaconSetDeployer @@ -27,13 +27,13 @@ contract StoxUnifiedDeployerTest is Test { StoxUnifiedDeployer unifiedDeployer = new StoxUnifiedDeployer(); vm.etch( - LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6, vm.getCode( "StoxOffchainAssetReceiptVaultBeaconSetDeployer.sol:StoxOffchainAssetReceiptVaultBeaconSetDeployer" ) ); vm.mockCall( - LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6, abi.encodeWithSelector( OffchainAssetReceiptVaultBeaconSetDeployer.newOffchainAssetReceiptVault.selector, config ), @@ -41,11 +41,11 @@ contract StoxUnifiedDeployerTest is Test { ); vm.etch( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER, + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6, vm.getCode("StoxWrappedTokenVaultBeaconSetDeployer.sol:StoxWrappedTokenVaultBeaconSetDeployer") ); vm.mockCall( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER, + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6, abi.encodeWithSelector(StoxWrappedTokenVaultBeaconSetDeployer.newStoxWrappedTokenVault.selector, asset), abi.encode(address(vault)) ); @@ -60,13 +60,13 @@ contract StoxUnifiedDeployerTest is Test { StoxUnifiedDeployer unifiedDeployer = new StoxUnifiedDeployer(); vm.etch( - LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6, vm.getCode( "StoxOffchainAssetReceiptVaultBeaconSetDeployer.sol:StoxOffchainAssetReceiptVaultBeaconSetDeployer" ) ); vm.mockCallRevert( - LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6, abi.encodeWithSelector( OffchainAssetReceiptVaultBeaconSetDeployer.newOffchainAssetReceiptVault.selector, config ), @@ -86,13 +86,13 @@ contract StoxUnifiedDeployerTest is Test { StoxUnifiedDeployer unifiedDeployer = new StoxUnifiedDeployer(); vm.etch( - LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6, vm.getCode( "StoxOffchainAssetReceiptVaultBeaconSetDeployer.sol:StoxOffchainAssetReceiptVaultBeaconSetDeployer" ) ); vm.mockCall( - LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6, abi.encodeWithSelector( OffchainAssetReceiptVaultBeaconSetDeployer.newOffchainAssetReceiptVault.selector, config ), @@ -100,11 +100,11 @@ contract StoxUnifiedDeployerTest is Test { ); vm.etch( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER, + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6, vm.getCode("StoxWrappedTokenVaultBeaconSetDeployer.sol:StoxWrappedTokenVaultBeaconSetDeployer") ); vm.mockCallRevert( - LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER, + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6, abi.encodeWithSelector(StoxWrappedTokenVaultBeaconSetDeployer.newStoxWrappedTokenVault.selector, asset), abi.encodeWithSignature("ZeroVaultAsset()") ); diff --git a/test/src/concrete/deploy/StoxWrappedTokenVaultBeaconSetDeployer.t.sol b/test/src/concrete/deploy/StoxWrappedTokenVaultBeaconSetDeployer.t.sol index 61c47def..4cdfdc8e 100644 --- a/test/src/concrete/deploy/StoxWrappedTokenVaultBeaconSetDeployer.t.sol +++ b/test/src/concrete/deploy/StoxWrappedTokenVaultBeaconSetDeployer.t.sol @@ -10,11 +10,11 @@ import { } from "../../../../src/concrete/deploy/StoxWrappedTokenVaultBeaconSetDeployer.sol"; import {StoxWrappedTokenVault} from "../../../../src/concrete/StoxWrappedTokenVault.sol"; import {StoxWrappedTokenVaultBeacon} from "../../../../src/concrete/StoxWrappedTokenVaultBeacon.sol"; -import {LibRainDeploy} from "rain-deploy-0.1.3/src/lib/LibRainDeploy.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; import {MockERC20} from "../../../concrete/MockERC20.sol"; import {BadInitializeVault} from "../../../concrete/BadInitializeVault.sol"; import {LibTestDeploy} from "../../../lib/LibTestDeploy.sol"; -import {LibProdDeployV3} from "../../../../src/lib/LibProdDeployV3.sol"; +import {LibProdDeployV4} from "../../../../src/lib/LibProdDeployV4.sol"; import {UpgradeableBeacon} from "@openzeppelin-contracts-5.6.1/proxy/beacon/UpgradeableBeacon.sol"; contract StoxWrappedTokenVaultBeaconSetDeployerTest is Test { @@ -23,8 +23,9 @@ contract StoxWrappedTokenVaultBeaconSetDeployerTest is Test { function testNewVaultZeroAsset() external { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); vm.expectRevert(abi.encodeWithSelector(ZeroVaultAsset.selector)); - StoxWrappedTokenVaultBeaconSetDeployer(LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER) - .newStoxWrappedTokenVault(address(0)); + StoxWrappedTokenVaultBeaconSetDeployer( + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 + ).newStoxWrappedTokenVault(address(0)); } /// newStoxWrappedTokenVault succeeds with valid asset and emits @@ -32,8 +33,9 @@ contract StoxWrappedTokenVaultBeaconSetDeployerTest is Test { function testNewVaultSuccess() external { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); MockERC20 asset = new MockERC20(); - StoxWrappedTokenVaultBeaconSetDeployer deployer = - StoxWrappedTokenVaultBeaconSetDeployer(LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER); + StoxWrappedTokenVaultBeaconSetDeployer deployer = StoxWrappedTokenVaultBeaconSetDeployer( + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 + ); vm.recordLogs(); StoxWrappedTokenVault vault = deployer.newStoxWrappedTokenVault(address(asset)); @@ -59,11 +61,12 @@ contract StoxWrappedTokenVaultBeaconSetDeployerTest is Test { function testNewVaultInitializeVaultFailed() external { LibTestDeploy.deployWrappedTokenVaultBeaconSet(vm); BadInitializeVault badImpl = new BadInitializeVault(); - vm.prank(LibProdDeployV3.BEACON_INITIAL_OWNER); - UpgradeableBeacon(LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON).upgradeTo(address(badImpl)); + vm.prank(LibProdDeployV4.BEACON_INITIAL_OWNER); + UpgradeableBeacon(LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_0_1_6).upgradeTo(address(badImpl)); vm.expectRevert(abi.encodeWithSelector(InitializeVaultFailed.selector)); - StoxWrappedTokenVaultBeaconSetDeployer(LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER) - .newStoxWrappedTokenVault(address(1)); + StoxWrappedTokenVaultBeaconSetDeployer( + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 + ).newStoxWrappedTokenVault(address(1)); } } diff --git a/test/src/lib/LibAuthoriserInvariants.t.sol b/test/src/lib/LibAuthoriserInvariants.t.sol index 6cb7b3d6..fc3d4455 100644 --- a/test/src/lib/LibAuthoriserInvariants.t.sol +++ b/test/src/lib/LibAuthoriserInvariants.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; import {LibAuthoriserInvariants} from "../../../src/lib/LibAuthoriserInvariants.sol"; -import {LibRainDeploy} from "rain-deploy-0.1.3/src/lib/LibRainDeploy.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; /// @title LibAuthoriserInvariantsTest /// @notice Fork tests pinning the live ST0x authoriser's role-grant map diff --git a/test/src/lib/LibBeaconInvariants.t.sol b/test/src/lib/LibBeaconInvariants.t.sol index f445239e..cf42fdce 100644 --- a/test/src/lib/LibBeaconInvariants.t.sol +++ b/test/src/lib/LibBeaconInvariants.t.sol @@ -13,7 +13,7 @@ import { import {LibSafeInvariants} from "../../../src/lib/LibSafeInvariants.sol"; import {LibProdDeployV1} from "../../../src/lib/LibProdDeployV1.sol"; import {LibBeaconInvariantsHarness} from "./LibBeaconInvariantsHarness.sol"; -import {LibRainDeploy} from "rain-deploy-0.1.3/src/lib/LibRainDeploy.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; import {IBeacon} from "@openzeppelin-contracts-5.6.1/proxy/beacon/IBeacon.sol"; /// @title LibBeaconInvariantsTest diff --git a/test/src/lib/LibProdDeployV2.t.sol b/test/src/lib/LibProdDeployV2.t.sol new file mode 100644 index 00000000..131610da --- /dev/null +++ b/test/src/lib/LibProdDeployV2.t.sol @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {Test} from "forge-std-1.16.1/src/Test.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; +import {LibProdDeployV2} from "../../../src/lib/LibProdDeployV2.sol"; + +/// @title LibProdDeployV2Test +/// @notice Validates that V2's frozen creation-bytecode constants are the +/// authentic historical code. Each test deploys the frozen `hex` literal +/// through the Zoltu factory and asserts the deterministic address and runtime +/// codehash equal the V2 pins. Crucially these deploy the frozen constants, not +/// `type(X).creationCode`, so the assertions are independent of the current +/// compiler/optimizer settings: a legacy version is a historical audit trail, +/// never a recompile target (that role belongs to the latest version's test). +/// Contracts whose constructor reads a dependency's code (the beacon, the set +/// deployers) deploy that dependency's frozen creation code first, exactly as +/// the original Zoltu deployment ordering required. +contract LibProdDeployV2Test is Test { + function testV2CreationCodeStoxReceipt() external { + LibRainDeploy.etchZoltuFactory(vm); + address deployed = LibRainDeploy.deployZoltu(LibProdDeployV2.PROD_STOX_RECEIPT_CREATION_BYTECODE_V2); + assertEq(deployed, LibProdDeployV2.STOX_RECEIPT); + assertTrue(deployed.code.length > 0); + assertEq(deployed.codehash, LibProdDeployV2.STOX_RECEIPT_CODEHASH); + } + + function testV2CreationCodeStoxReceiptVault() external { + LibRainDeploy.etchZoltuFactory(vm); + address deployed = LibRainDeploy.deployZoltu(LibProdDeployV2.PROD_STOX_RECEIPT_VAULT_CREATION_BYTECODE_V2); + assertEq(deployed, LibProdDeployV2.STOX_RECEIPT_VAULT); + assertTrue(deployed.code.length > 0); + assertEq(deployed.codehash, LibProdDeployV2.STOX_RECEIPT_VAULT_CODEHASH); + } + + function testV2CreationCodeStoxWrappedTokenVault() external { + LibRainDeploy.etchZoltuFactory(vm); + address deployed = LibRainDeploy.deployZoltu(LibProdDeployV2.PROD_STOX_WRAPPED_TOKEN_VAULT_CREATION_BYTECODE_V2); + assertEq(deployed, LibProdDeployV2.STOX_WRAPPED_TOKEN_VAULT); + assertTrue(deployed.code.length > 0); + assertEq(deployed.codehash, LibProdDeployV2.STOX_WRAPPED_TOKEN_VAULT_CODEHASH); + } + + function testV2CreationCodeStoxUnifiedDeployer() external { + LibRainDeploy.etchZoltuFactory(vm); + address deployed = LibRainDeploy.deployZoltu(LibProdDeployV2.PROD_STOX_UNIFIED_DEPLOYER_CREATION_BYTECODE_V2); + assertEq(deployed, LibProdDeployV2.STOX_UNIFIED_DEPLOYER); + assertTrue(deployed.code.length > 0); + assertEq(deployed.codehash, LibProdDeployV2.STOX_UNIFIED_DEPLOYER_CODEHASH); + } + + /// The beacon constructor reverts unless the implementation it points at + /// already has code, so deploy the V2 wrapped token vault first. + function testV2CreationCodeStoxWrappedTokenVaultBeacon() external { + LibRainDeploy.etchZoltuFactory(vm); + LibRainDeploy.deployZoltu(LibProdDeployV2.PROD_STOX_WRAPPED_TOKEN_VAULT_CREATION_BYTECODE_V2); + address deployed = + LibRainDeploy.deployZoltu(LibProdDeployV2.PROD_STOX_WRAPPED_TOKEN_VAULT_BEACON_CREATION_BYTECODE_V2); + assertEq(deployed, LibProdDeployV2.STOX_WRAPPED_TOKEN_VAULT_BEACON); + assertTrue(deployed.code.length > 0); + assertEq(deployed.codehash, LibProdDeployV2.STOX_WRAPPED_TOKEN_VAULT_BEACON_CODEHASH); + } + + /// The offchain set deployer reads the receipt and receipt vault + /// implementations in its constructor, so deploy those first. + function testV2CreationCodeStoxOffchainAssetReceiptVaultBeaconSetDeployer() external { + LibRainDeploy.etchZoltuFactory(vm); + LibRainDeploy.deployZoltu(LibProdDeployV2.PROD_STOX_RECEIPT_CREATION_BYTECODE_V2); + LibRainDeploy.deployZoltu(LibProdDeployV2.PROD_STOX_RECEIPT_VAULT_CREATION_BYTECODE_V2); + address deployed = LibRainDeploy.deployZoltu( + LibProdDeployV2.PROD_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CREATION_BYTECODE_V2 + ); + assertEq(deployed, LibProdDeployV2.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER); + assertTrue(deployed.code.length > 0); + assertEq(deployed.codehash, LibProdDeployV2.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CODEHASH); + } + + /// The wrapped token vault set deployer reads the beacon in its + /// constructor, which in turn needs the wrapped token vault, so deploy + /// both first in order. + function testV2CreationCodeStoxWrappedTokenVaultBeaconSetDeployer() external { + LibRainDeploy.etchZoltuFactory(vm); + LibRainDeploy.deployZoltu(LibProdDeployV2.PROD_STOX_WRAPPED_TOKEN_VAULT_CREATION_BYTECODE_V2); + LibRainDeploy.deployZoltu(LibProdDeployV2.PROD_STOX_WRAPPED_TOKEN_VAULT_BEACON_CREATION_BYTECODE_V2); + address deployed = LibRainDeploy.deployZoltu( + LibProdDeployV2.PROD_STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_CREATION_BYTECODE_V2 + ); + assertEq(deployed, LibProdDeployV2.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER); + assertTrue(deployed.code.length > 0); + assertEq(deployed.codehash, LibProdDeployV2.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_CODEHASH); + } + + function testV2CreationCodeStoxOffchainAssetReceiptVaultAuthorizerV1() external { + LibRainDeploy.etchZoltuFactory(vm); + address deployed = LibRainDeploy.deployZoltu( + LibProdDeployV2.PROD_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_CREATION_BYTECODE_V2 + ); + assertEq(deployed, LibProdDeployV2.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1); + assertTrue(deployed.code.length > 0); + assertEq(deployed.codehash, LibProdDeployV2.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_CODEHASH); + } + + function testV2CreationCodeStoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1() external { + LibRainDeploy.etchZoltuFactory(vm); + address deployed = LibRainDeploy.deployZoltu( + LibProdDeployV2.PROD_STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_CREATION_BYTECODE_V2 + ); + assertEq(deployed, LibProdDeployV2.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1); + assertTrue(deployed.code.length > 0); + assertEq( + deployed.codehash, LibProdDeployV2.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_CODEHASH + ); + } +} diff --git a/test/src/lib/LibProdDeployV3.t.sol b/test/src/lib/LibProdDeployV3.t.sol deleted file mode 100644 index 69370f5b..00000000 --- a/test/src/lib/LibProdDeployV3.t.sol +++ /dev/null @@ -1,541 +0,0 @@ -// SPDX-License-Identifier: LicenseRef-DCL-1.0 -// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity =0.8.25; - -import {Test} from "forge-std-1.16.1/src/Test.sol"; -import {LibRainDeploy} from "rain-deploy-0.1.3/src/lib/LibRainDeploy.sol"; -import {LibProdDeployV3} from "../../../src/lib/LibProdDeployV3.sol"; -import {StoxReceipt} from "../../../src/concrete/StoxReceipt.sol"; -import {StoxReceiptVault} from "../../../src/concrete/StoxReceiptVault.sol"; -import {StoxWrappedTokenVault} from "../../../src/concrete/StoxWrappedTokenVault.sol"; -import {StoxUnifiedDeployer} from "../../../src/concrete/deploy/StoxUnifiedDeployer.sol"; -import { - CREATION_CODE as STOX_RECEIPT_CREATION_CODE, - RUNTIME_CODE as STOX_RECEIPT_RUNTIME_CODE, - DEPLOYED_ADDRESS as STOX_RECEIPT_GENERATED_ADDRESS -} from "../../../src/generated/StoxReceipt.pointers.sol"; -import { - CREATION_CODE as STOX_RECEIPT_VAULT_CREATION_CODE, - RUNTIME_CODE as STOX_RECEIPT_VAULT_RUNTIME_CODE, - DEPLOYED_ADDRESS as STOX_RECEIPT_VAULT_GENERATED_ADDRESS -} from "../../../src/generated/StoxReceiptVault.pointers.sol"; -import { - CREATION_CODE as STOX_WRAPPED_TOKEN_VAULT_CREATION_CODE, - RUNTIME_CODE as STOX_WRAPPED_TOKEN_VAULT_RUNTIME_CODE, - DEPLOYED_ADDRESS as STOX_WRAPPED_TOKEN_VAULT_GENERATED_ADDRESS -} from "../../../src/generated/StoxWrappedTokenVault.pointers.sol"; -import { - CREATION_CODE as STOX_UNIFIED_DEPLOYER_CREATION_CODE, - RUNTIME_CODE as STOX_UNIFIED_DEPLOYER_RUNTIME_CODE, - DEPLOYED_ADDRESS as STOX_UNIFIED_DEPLOYER_GENERATED_ADDRESS -} from "../../../src/generated/StoxUnifiedDeployer.pointers.sol"; -import {StoxWrappedTokenVaultBeacon} from "../../../src/concrete/StoxWrappedTokenVaultBeacon.sol"; -import { - StoxWrappedTokenVaultBeaconSetDeployer -} from "../../../src/concrete/deploy/StoxWrappedTokenVaultBeaconSetDeployer.sol"; -import { - StoxOffchainAssetReceiptVaultBeaconSetDeployer -} from "../../../src/concrete/deploy/StoxOffchainAssetReceiptVaultBeaconSetDeployer.sol"; -import { - IOffchainAssetReceiptVaultBeaconSetDeployerV2 -} from "rain-vats-0.1.6/src/interface/IOffchainAssetReceiptVaultBeaconSetDeployerV2.sol"; -import {Ownable} from "@openzeppelin-contracts-5.6.1/access/Ownable.sol"; -import {IBeacon} from "@openzeppelin-contracts-5.6.1/proxy/beacon/IBeacon.sol"; -import { - CREATION_CODE as STOX_BEACON_CREATION_CODE, - RUNTIME_CODE as STOX_BEACON_RUNTIME_CODE, - DEPLOYED_ADDRESS as STOX_BEACON_GENERATED_ADDRESS -} from "../../../src/generated/StoxWrappedTokenVaultBeacon.pointers.sol"; -import { - CREATION_CODE as STOX_BEACON_SET_DEPLOYER_CREATION_CODE, - RUNTIME_CODE as STOX_BEACON_SET_DEPLOYER_RUNTIME_CODE, - DEPLOYED_ADDRESS as STOX_BEACON_SET_DEPLOYER_GENERATED_ADDRESS -} from "../../../src/generated/StoxWrappedTokenVaultBeaconSetDeployer.pointers.sol"; -import { - CREATION_CODE as STOX_OARV_DEPLOYER_CREATION_CODE, - RUNTIME_CODE as STOX_OARV_DEPLOYER_RUNTIME_CODE, - DEPLOYED_ADDRESS as STOX_OARV_DEPLOYER_GENERATED_ADDRESS -} from "../../../src/generated/StoxOffchainAssetReceiptVaultBeaconSetDeployer.pointers.sol"; -import { - StoxOffchainAssetReceiptVaultAuthorizerV1 -} from "../../../src/concrete/authorize/StoxOffchainAssetReceiptVaultAuthorizerV1.sol"; -import { - StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1 -} from "../../../src/concrete/authorize/StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1.sol"; -import { - CREATION_CODE as STOX_AUTHORIZER_V1_CREATION_CODE, - RUNTIME_CODE as STOX_AUTHORIZER_V1_RUNTIME_CODE, - DEPLOYED_ADDRESS as STOX_AUTHORIZER_V1_GENERATED_ADDRESS -} from "../../../src/generated/StoxOffchainAssetReceiptVaultAuthorizerV1.pointers.sol"; -import { - CREATION_CODE as STOX_PAYMENT_MINT_AUTHORIZER_V1_CREATION_CODE, - RUNTIME_CODE as STOX_PAYMENT_MINT_AUTHORIZER_V1_RUNTIME_CODE, - DEPLOYED_ADDRESS as STOX_PAYMENT_MINT_AUTHORIZER_V1_GENERATED_ADDRESS -} from "../../../src/generated/StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1.pointers.sol"; -import {StoxCorporateActionsFacet} from "../../../src/concrete/StoxCorporateActionsFacet.sol"; -import { - CREATION_CODE as STOX_CORPORATE_ACTIONS_FACET_CREATION_CODE, - RUNTIME_CODE as STOX_CORPORATE_ACTIONS_FACET_RUNTIME_CODE, - DEPLOYED_ADDRESS as STOX_CORPORATE_ACTIONS_FACET_GENERATED_ADDRESS -} from "../../../src/generated/StoxCorporateActionsFacet.pointers.sol"; - -contract LibProdDeployV3Test is Test { - // --- Zoltu deploy address tests --- - - /// Deploying StoxReceipt via Zoltu MUST produce the expected address and - /// codehash. - function testDeployAddressStoxReceipt() external { - LibRainDeploy.etchZoltuFactory(vm); - address deployed = LibRainDeploy.deployZoltu(type(StoxReceipt).creationCode); - assertEq(deployed, LibProdDeployV3.STOX_RECEIPT); - assertTrue(deployed.code.length > 0); - assertEq(deployed.codehash, LibProdDeployV3.STOX_RECEIPT_CODEHASH); - } - - /// Deploying StoxReceiptVault via Zoltu MUST produce the expected address - /// and codehash. - function testDeployAddressStoxReceiptVault() external { - LibRainDeploy.etchZoltuFactory(vm); - address deployed = LibRainDeploy.deployZoltu(type(StoxReceiptVault).creationCode); - assertEq(deployed, LibProdDeployV3.STOX_RECEIPT_VAULT); - assertTrue(deployed.code.length > 0); - assertEq(deployed.codehash, LibProdDeployV3.STOX_RECEIPT_VAULT_CODEHASH); - } - - /// Deploying StoxWrappedTokenVault via Zoltu MUST produce the expected - /// address and codehash. - function testDeployAddressStoxWrappedTokenVault() external { - LibRainDeploy.etchZoltuFactory(vm); - address deployed = LibRainDeploy.deployZoltu(type(StoxWrappedTokenVault).creationCode); - assertEq(deployed, LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT); - assertTrue(deployed.code.length > 0); - assertEq(deployed.codehash, LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_CODEHASH); - } - - /// Deploying StoxUnifiedDeployer via Zoltu MUST produce the expected - /// address and codehash. - function testDeployAddressStoxUnifiedDeployer() external { - LibRainDeploy.etchZoltuFactory(vm); - address deployed = LibRainDeploy.deployZoltu(type(StoxUnifiedDeployer).creationCode); - assertEq(deployed, LibProdDeployV3.STOX_UNIFIED_DEPLOYER); - assertTrue(deployed.code.length > 0); - assertEq(deployed.codehash, LibProdDeployV3.STOX_UNIFIED_DEPLOYER_CODEHASH); - } - - // --- Fresh codehash tests --- - - /// Fresh-compiled StoxReceipt codehash MUST match the pointer constant. - function testCodehashStoxReceipt() external { - StoxReceipt c = new StoxReceipt(); - assertEq(address(c).codehash, LibProdDeployV3.STOX_RECEIPT_CODEHASH); - } - - /// Fresh-compiled StoxReceiptVault codehash MUST match the pointer - /// constant. - function testCodehashStoxReceiptVault() external { - StoxReceiptVault c = new StoxReceiptVault(); - assertEq(address(c).codehash, LibProdDeployV3.STOX_RECEIPT_VAULT_CODEHASH); - } - - /// Fresh-compiled StoxWrappedTokenVault codehash MUST match the pointer - /// constant. - function testCodehashStoxWrappedTokenVault() external { - StoxWrappedTokenVault c = new StoxWrappedTokenVault(); - assertEq(address(c).codehash, LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_CODEHASH); - } - - /// Fresh-compiled StoxUnifiedDeployer codehash MUST match the pointer - /// constant. - function testCodehashStoxUnifiedDeployer() external { - StoxUnifiedDeployer c = new StoxUnifiedDeployer(); - assertEq(address(c).codehash, LibProdDeployV3.STOX_UNIFIED_DEPLOYER_CODEHASH); - } - - // --- Creation code tests --- - - /// Pointer creation code for StoxReceipt MUST match compiler output. - function testCreationCodeStoxReceipt() external pure { - assertEq(keccak256(STOX_RECEIPT_CREATION_CODE), keccak256(type(StoxReceipt).creationCode)); - } - - /// Pointer creation code for StoxReceiptVault MUST match compiler output. - function testCreationCodeStoxReceiptVault() external pure { - assertEq(keccak256(STOX_RECEIPT_VAULT_CREATION_CODE), keccak256(type(StoxReceiptVault).creationCode)); - } - - /// Pointer creation code for StoxWrappedTokenVault MUST match compiler - /// output. - function testCreationCodeStoxWrappedTokenVault() external pure { - assertEq(keccak256(STOX_WRAPPED_TOKEN_VAULT_CREATION_CODE), keccak256(type(StoxWrappedTokenVault).creationCode)); - } - - /// Pointer creation code for StoxUnifiedDeployer MUST match compiler - /// output. - function testCreationCodeStoxUnifiedDeployer() external pure { - assertEq(keccak256(STOX_UNIFIED_DEPLOYER_CREATION_CODE), keccak256(type(StoxUnifiedDeployer).creationCode)); - } - - // --- Runtime code tests --- - - /// Pointer runtime code for StoxReceipt MUST match deployed bytecode. - function testRuntimeCodeStoxReceipt() external { - StoxReceipt c = new StoxReceipt(); - assertEq(keccak256(STOX_RECEIPT_RUNTIME_CODE), keccak256(address(c).code)); - } - - /// Pointer runtime code for StoxReceiptVault MUST match deployed bytecode. - function testRuntimeCodeStoxReceiptVault() external { - StoxReceiptVault c = new StoxReceiptVault(); - assertEq(keccak256(STOX_RECEIPT_VAULT_RUNTIME_CODE), keccak256(address(c).code)); - } - - /// Pointer runtime code for StoxWrappedTokenVault MUST match deployed - /// bytecode. - function testRuntimeCodeStoxWrappedTokenVault() external { - StoxWrappedTokenVault c = new StoxWrappedTokenVault(); - assertEq(keccak256(STOX_WRAPPED_TOKEN_VAULT_RUNTIME_CODE), keccak256(address(c).code)); - } - - /// Pointer runtime code for StoxUnifiedDeployer MUST match deployed - /// bytecode. - function testRuntimeCodeStoxUnifiedDeployer() external { - StoxUnifiedDeployer c = new StoxUnifiedDeployer(); - assertEq(keccak256(STOX_UNIFIED_DEPLOYER_RUNTIME_CODE), keccak256(address(c).code)); - } - - // --- Generated address consistency tests --- - - /// Generated pointer address for StoxReceipt MUST match library constant. - function testGeneratedAddressStoxReceipt() external pure { - assertEq(STOX_RECEIPT_GENERATED_ADDRESS, LibProdDeployV3.STOX_RECEIPT); - } - - /// Generated pointer address for StoxReceiptVault MUST match library - /// constant. - function testGeneratedAddressStoxReceiptVault() external pure { - assertEq(STOX_RECEIPT_VAULT_GENERATED_ADDRESS, LibProdDeployV3.STOX_RECEIPT_VAULT); - } - - /// Generated pointer address for StoxWrappedTokenVault MUST match library - /// constant. - function testGeneratedAddressStoxWrappedTokenVault() external pure { - assertEq(STOX_WRAPPED_TOKEN_VAULT_GENERATED_ADDRESS, LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT); - } - - /// Generated pointer address for StoxUnifiedDeployer MUST match library - /// constant. - function testGeneratedAddressStoxUnifiedDeployer() external pure { - assertEq(STOX_UNIFIED_DEPLOYER_GENERATED_ADDRESS, LibProdDeployV3.STOX_UNIFIED_DEPLOYER); - } - - // --- StoxWrappedTokenVaultBeacon --- - - /// Deploying StoxWrappedTokenVaultBeacon via Zoltu MUST produce the - /// expected address and codehash. - function testDeployAddressStoxWrappedTokenVaultBeacon() external { - LibRainDeploy.etchZoltuFactory(vm); - LibRainDeploy.deployZoltu(type(StoxWrappedTokenVault).creationCode); - address deployed = LibRainDeploy.deployZoltu(type(StoxWrappedTokenVaultBeacon).creationCode); - assertEq(deployed, LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON); - assertTrue(deployed.code.length > 0); - assertEq(deployed.codehash, LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_CODEHASH); - } - - function testCreationCodeStoxWrappedTokenVaultBeacon() external pure { - assertEq(keccak256(STOX_BEACON_CREATION_CODE), keccak256(type(StoxWrappedTokenVaultBeacon).creationCode)); - } - - function testRuntimeCodeStoxWrappedTokenVaultBeacon() external { - LibRainDeploy.etchZoltuFactory(vm); - LibRainDeploy.deployZoltu(type(StoxWrappedTokenVault).creationCode); - address deployed = LibRainDeploy.deployZoltu(type(StoxWrappedTokenVaultBeacon).creationCode); - assertEq(keccak256(STOX_BEACON_RUNTIME_CODE), keccak256(deployed.code)); - } - - function testGeneratedAddressStoxWrappedTokenVaultBeacon() external pure { - assertEq(STOX_BEACON_GENERATED_ADDRESS, LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON); - } - - // --- StoxWrappedTokenVaultBeaconSetDeployer --- - - /// Deploying StoxWrappedTokenVaultBeaconSetDeployer via Zoltu MUST produce - /// the expected address and codehash. - function testDeployAddressStoxWrappedTokenVaultBeaconSetDeployer() external { - LibRainDeploy.etchZoltuFactory(vm); - LibRainDeploy.deployZoltu(type(StoxWrappedTokenVault).creationCode); - LibRainDeploy.deployZoltu(type(StoxWrappedTokenVaultBeacon).creationCode); - address deployed = LibRainDeploy.deployZoltu(type(StoxWrappedTokenVaultBeaconSetDeployer).creationCode); - assertEq(deployed, LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER); - assertTrue(deployed.code.length > 0); - assertEq(deployed.codehash, LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_CODEHASH); - } - - function testCreationCodeStoxWrappedTokenVaultBeaconSetDeployer() external pure { - assertEq( - keccak256(STOX_BEACON_SET_DEPLOYER_CREATION_CODE), - keccak256(type(StoxWrappedTokenVaultBeaconSetDeployer).creationCode) - ); - } - - function testRuntimeCodeStoxWrappedTokenVaultBeaconSetDeployer() external { - LibRainDeploy.etchZoltuFactory(vm); - LibRainDeploy.deployZoltu(type(StoxWrappedTokenVault).creationCode); - LibRainDeploy.deployZoltu(type(StoxWrappedTokenVaultBeacon).creationCode); - address deployed = LibRainDeploy.deployZoltu(type(StoxWrappedTokenVaultBeaconSetDeployer).creationCode); - assertEq(keccak256(STOX_BEACON_SET_DEPLOYER_RUNTIME_CODE), keccak256(deployed.code)); - } - - function testGeneratedAddressStoxWrappedTokenVaultBeaconSetDeployer() external pure { - assertEq( - STOX_BEACON_SET_DEPLOYER_GENERATED_ADDRESS, LibProdDeployV3.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER - ); - } - - // --- StoxOffchainAssetReceiptVaultBeaconSetDeployer --- - - /// Deploying StoxOffchainAssetReceiptVaultBeaconSetDeployer via Zoltu MUST - /// produce the expected address and codehash. - function testDeployAddressStoxOffchainAssetReceiptVaultBeaconSetDeployer() external { - LibRainDeploy.etchZoltuFactory(vm); - LibRainDeploy.deployZoltu(type(StoxReceipt).creationCode); - LibRainDeploy.deployZoltu(type(StoxReceiptVault).creationCode); - address deployed = LibRainDeploy.deployZoltu(type(StoxOffchainAssetReceiptVaultBeaconSetDeployer).creationCode); - assertEq(deployed, LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER); - assertTrue(deployed.code.length > 0); - assertEq(deployed.codehash, LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CODEHASH); - } - - function testCreationCodeStoxOffchainAssetReceiptVaultBeaconSetDeployer() external pure { - assertEq( - keccak256(STOX_OARV_DEPLOYER_CREATION_CODE), - keccak256(type(StoxOffchainAssetReceiptVaultBeaconSetDeployer).creationCode) - ); - } - - function testRuntimeCodeStoxOffchainAssetReceiptVaultBeaconSetDeployer() external { - LibRainDeploy.etchZoltuFactory(vm); - LibRainDeploy.deployZoltu(type(StoxReceipt).creationCode); - LibRainDeploy.deployZoltu(type(StoxReceiptVault).creationCode); - address deployed = LibRainDeploy.deployZoltu(type(StoxOffchainAssetReceiptVaultBeaconSetDeployer).creationCode); - assertEq(keccak256(STOX_OARV_DEPLOYER_RUNTIME_CODE), keccak256(deployed.code)); - } - - function testGeneratedAddressStoxOffchainAssetReceiptVaultBeaconSetDeployer() external pure { - assertEq( - STOX_OARV_DEPLOYER_GENERATED_ADDRESS, LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER - ); - } - - // --- OARV deployer beacon configuration --- - - /// OARV deployer's receipt beacon has correct implementation and owner. - function testOarvDeployerReceiptBeaconConfig() external { - LibRainDeploy.etchZoltuFactory(vm); - LibRainDeploy.deployZoltu(type(StoxReceipt).creationCode); - LibRainDeploy.deployZoltu(type(StoxReceiptVault).creationCode); - address deployed = LibRainDeploy.deployZoltu(type(StoxOffchainAssetReceiptVaultBeaconSetDeployer).creationCode); - IOffchainAssetReceiptVaultBeaconSetDeployerV2 deployer = IOffchainAssetReceiptVaultBeaconSetDeployerV2(deployed); - - IBeacon receiptBeacon = deployer.iReceiptBeacon(); - assertEq(receiptBeacon.implementation(), LibProdDeployV3.STOX_RECEIPT, "receipt beacon implementation mismatch"); - assertEq( - Ownable(address(receiptBeacon)).owner(), - LibProdDeployV3.BEACON_INITIAL_OWNER, - "receipt beacon owner mismatch" - ); - } - - /// OARV deployer's vault beacon has correct implementation and owner. - function testOarvDeployerVaultBeaconConfig() external { - LibRainDeploy.etchZoltuFactory(vm); - LibRainDeploy.deployZoltu(type(StoxReceipt).creationCode); - LibRainDeploy.deployZoltu(type(StoxReceiptVault).creationCode); - address deployed = LibRainDeploy.deployZoltu(type(StoxOffchainAssetReceiptVaultBeaconSetDeployer).creationCode); - IOffchainAssetReceiptVaultBeaconSetDeployerV2 deployer = IOffchainAssetReceiptVaultBeaconSetDeployerV2(deployed); - - IBeacon vaultBeacon = deployer.iOffchainAssetReceiptVaultBeacon(); - assertEq( - vaultBeacon.implementation(), LibProdDeployV3.STOX_RECEIPT_VAULT, "vault beacon implementation mismatch" - ); - assertEq( - Ownable(address(vaultBeacon)).owner(), LibProdDeployV3.BEACON_INITIAL_OWNER, "vault beacon owner mismatch" - ); - } - - // --- StoxOffchainAssetReceiptVaultAuthorizerV1 --- - - /// Deploying StoxOffchainAssetReceiptVaultAuthorizerV1 via Zoltu MUST - /// produce the expected address and codehash. - function testDeployAddressStoxOffchainAssetReceiptVaultAuthorizerV1() external { - LibRainDeploy.etchZoltuFactory(vm); - address deployed = LibRainDeploy.deployZoltu(type(StoxOffchainAssetReceiptVaultAuthorizerV1).creationCode); - assertEq(deployed, LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1); - assertTrue(deployed.code.length > 0); - assertEq(deployed.codehash, LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_CODEHASH); - } - - /// Fresh-compiled StoxOffchainAssetReceiptVaultAuthorizerV1 codehash MUST - /// match the pointer constant. - function testCodehashStoxOffchainAssetReceiptVaultAuthorizerV1() external { - StoxOffchainAssetReceiptVaultAuthorizerV1 c = new StoxOffchainAssetReceiptVaultAuthorizerV1(); - assertEq(address(c).codehash, LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_CODEHASH); - } - - /// Pointer creation code for StoxOffchainAssetReceiptVaultAuthorizerV1 - /// MUST match compiler output. - function testCreationCodeStoxOffchainAssetReceiptVaultAuthorizerV1() external pure { - assertEq( - keccak256(STOX_AUTHORIZER_V1_CREATION_CODE), - keccak256(type(StoxOffchainAssetReceiptVaultAuthorizerV1).creationCode) - ); - } - - /// Pointer runtime code for StoxOffchainAssetReceiptVaultAuthorizerV1 - /// MUST match deployed bytecode. - function testRuntimeCodeStoxOffchainAssetReceiptVaultAuthorizerV1() external { - StoxOffchainAssetReceiptVaultAuthorizerV1 c = new StoxOffchainAssetReceiptVaultAuthorizerV1(); - assertEq(keccak256(STOX_AUTHORIZER_V1_RUNTIME_CODE), keccak256(address(c).code)); - } - - /// Generated pointer address for StoxOffchainAssetReceiptVaultAuthorizerV1 - /// MUST match library constant. - function testGeneratedAddressStoxOffchainAssetReceiptVaultAuthorizerV1() external pure { - assertEq(STOX_AUTHORIZER_V1_GENERATED_ADDRESS, LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1); - } - - // --- StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1 --- - - /// Deploying StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1 via - /// Zoltu MUST produce the expected address and codehash. - function testDeployAddressStoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1() external { - LibRainDeploy.etchZoltuFactory(vm); - address deployed = - LibRainDeploy.deployZoltu(type(StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1).creationCode); - assertEq(deployed, LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1); - assertTrue(deployed.code.length > 0); - assertEq( - deployed.codehash, LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_CODEHASH - ); - } - - /// Fresh-compiled StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1 - /// codehash MUST match the pointer constant. - function testCodehashStoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1() external { - StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1 c = - new StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1(); - assertEq( - address(c).codehash, LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_CODEHASH - ); - } - - /// Pointer creation code for - /// StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1 MUST match - /// compiler output. - function testCreationCodeStoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1() external pure { - assertEq( - keccak256(STOX_PAYMENT_MINT_AUTHORIZER_V1_CREATION_CODE), - keccak256(type(StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1).creationCode) - ); - } - - /// Pointer runtime code for - /// StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1 MUST match - /// deployed bytecode. - function testRuntimeCodeStoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1() external { - StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1 c = - new StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1(); - assertEq(keccak256(STOX_PAYMENT_MINT_AUTHORIZER_V1_RUNTIME_CODE), keccak256(address(c).code)); - } - - /// Generated pointer address for - /// StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1 MUST match library - /// constant. - function testGeneratedAddressStoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1() external pure { - assertEq( - STOX_PAYMENT_MINT_AUTHORIZER_V1_GENERATED_ADDRESS, - LibProdDeployV3.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1 - ); - } - - // --- StoxCorporateActionsFacet --- - - /// Deploying StoxCorporateActionsFacet via Zoltu MUST produce the expected - /// address and codehash. - function testDeployAddressStoxCorporateActionsFacet() external { - LibRainDeploy.etchZoltuFactory(vm); - address deployed = LibRainDeploy.deployZoltu(type(StoxCorporateActionsFacet).creationCode); - assertEq(deployed, LibProdDeployV3.STOX_CORPORATE_ACTIONS_FACET); - assertTrue(deployed.code.length > 0); - assertEq(deployed.codehash, LibProdDeployV3.STOX_CORPORATE_ACTIONS_FACET_CODEHASH); - } - - /// Pointer creation code for StoxCorporateActionsFacet MUST match compiler - /// output. - function testCreationCodeStoxCorporateActionsFacet() external pure { - assertEq( - keccak256(STOX_CORPORATE_ACTIONS_FACET_CREATION_CODE), - keccak256(type(StoxCorporateActionsFacet).creationCode) - ); - } - - /// Pointer runtime code for StoxCorporateActionsFacet MUST match the - /// runtime bytecode produced by Zoltu deployment. The facet has an - /// `address private immutable _SELF = address(this)` baked into the - /// runtime — comparing against `new` would resolve `address(this)` to - /// some test-context address rather than the Zoltu deterministic one, - /// so the runtime bytes diverge even when source is identical. Zoltu - /// deployment reproduces the address that BuildPointers used. - function testRuntimeCodeStoxCorporateActionsFacet() external { - LibRainDeploy.etchZoltuFactory(vm); - address deployed = LibRainDeploy.deployZoltu(type(StoxCorporateActionsFacet).creationCode); - assertEq(keccak256(STOX_CORPORATE_ACTIONS_FACET_RUNTIME_CODE), keccak256(deployed.code)); - } - - /// Generated pointer address for StoxCorporateActionsFacet MUST match - /// library constant. - function testGeneratedAddressStoxCorporateActionsFacet() external pure { - assertEq(STOX_CORPORATE_ACTIONS_FACET_GENERATED_ADDRESS, LibProdDeployV3.STOX_CORPORATE_ACTIONS_FACET); - } - - // --- Build-order invariants --- - - /// The vault's `fallback()` hardcodes `LibProdDeployV3.STOX_CORPORATE_ACTIONS_FACET`, - /// which resolves to the facet's pointer `DEPLOYED_ADDRESS`. If - /// `BuildPointers.sol` is reordered such that the vault is regenerated - /// before the facet (and the facet pointer file does not yet exist or - /// holds a stale address), the regenerated vault creation code will embed - /// the wrong facet address and route fallback calls to a non-existent or - /// unrelated contract. - /// - /// This asserts the structural invariant: the vault's committed pointer - /// creation code MUST contain the facet's committed pointer - /// `DEPLOYED_ADDRESS` as a 20-byte sequence. Pairs with - /// `testCreationCodeStoxReceiptVault`, which confirms the committed - /// creation code matches a fresh compile (i.e. `LibProdDeployV3` resolves - /// to the same facet address). - function testStoxReceiptVaultCreationCodeEmbedsFacetAddress() external pure { - assertTrue( - bytesContainAddress(STOX_RECEIPT_VAULT_CREATION_CODE, STOX_CORPORATE_ACTIONS_FACET_GENERATED_ADDRESS), - "vault creation code does not embed facet address" - ); - } - - /// Returns true if `haystack` contains `needle` as a contiguous 20-byte - /// sequence. Used by the build-order invariant to scan the vault's - /// creation code for the facet's deployed address. - function bytesContainAddress(bytes memory haystack, address needle) internal pure returns (bool) { - bytes20 needleBytes = bytes20(needle); - if (haystack.length < 20) return false; - for (uint256 i = 0; i + 20 <= haystack.length; i++) { - bool match_ = true; - for (uint256 j = 0; j < 20; j++) { - if (haystack[i + j] != needleBytes[j]) { - match_ = false; - break; - } - } - if (match_) return true; - } - return false; - } -} diff --git a/test/src/lib/LibProdDeployV4.t.sol b/test/src/lib/LibProdDeployV4.t.sol new file mode 100644 index 00000000..00b41f55 --- /dev/null +++ b/test/src/lib/LibProdDeployV4.t.sol @@ -0,0 +1,357 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {Test} from "forge-std-1.16.1/src/Test.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; +import {LibProdDeployV4} from "../../../src/lib/LibProdDeployV4.sol"; +import {StoxReceipt} from "../../../src/concrete/StoxReceipt.sol"; +import {StoxReceiptVault} from "../../../src/concrete/StoxReceiptVault.sol"; +import {StoxWrappedTokenVault} from "../../../src/concrete/StoxWrappedTokenVault.sol"; +import {StoxUnifiedDeployer} from "../../../src/concrete/deploy/StoxUnifiedDeployer.sol"; +import {StoxWrappedTokenVaultBeacon} from "../../../src/concrete/StoxWrappedTokenVaultBeacon.sol"; +import { + StoxWrappedTokenVaultBeaconSetDeployer +} from "../../../src/concrete/deploy/StoxWrappedTokenVaultBeaconSetDeployer.sol"; +import { + StoxOffchainAssetReceiptVaultBeaconSetDeployer +} from "../../../src/concrete/deploy/StoxOffchainAssetReceiptVaultBeaconSetDeployer.sol"; +import { + StoxOffchainAssetReceiptVaultAuthorizerV1 +} from "../../../src/concrete/authorize/StoxOffchainAssetReceiptVaultAuthorizerV1.sol"; +import { + StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1 +} from "../../../src/concrete/authorize/StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1.sol"; +import {StoxCorporateActionsFacet} from "../../../src/concrete/StoxCorporateActionsFacet.sol"; +import { + RUNTIME_CODE as STOX_RECEIPT_RUNTIME_CODE, + DEPLOYED_ADDRESS as STOX_RECEIPT_GENERATED_ADDRESS +} from "../../../src/generated/StoxReceipt.pointers.sol"; +import { + RUNTIME_CODE as STOX_RECEIPT_VAULT_RUNTIME_CODE, + DEPLOYED_ADDRESS as STOX_RECEIPT_VAULT_GENERATED_ADDRESS +} from "../../../src/generated/StoxReceiptVault.pointers.sol"; +import { + RUNTIME_CODE as STOX_WRAPPED_TOKEN_VAULT_RUNTIME_CODE, + DEPLOYED_ADDRESS as STOX_WRAPPED_TOKEN_VAULT_GENERATED_ADDRESS +} from "../../../src/generated/StoxWrappedTokenVault.pointers.sol"; +import { + RUNTIME_CODE as STOX_UNIFIED_DEPLOYER_RUNTIME_CODE, + DEPLOYED_ADDRESS as STOX_UNIFIED_DEPLOYER_GENERATED_ADDRESS +} from "../../../src/generated/StoxUnifiedDeployer.pointers.sol"; +import { + RUNTIME_CODE as STOX_BEACON_RUNTIME_CODE, + DEPLOYED_ADDRESS as STOX_BEACON_GENERATED_ADDRESS +} from "../../../src/generated/StoxWrappedTokenVaultBeacon.pointers.sol"; +import { + RUNTIME_CODE as STOX_BEACON_SET_DEPLOYER_RUNTIME_CODE, + DEPLOYED_ADDRESS as STOX_BEACON_SET_DEPLOYER_GENERATED_ADDRESS +} from "../../../src/generated/StoxWrappedTokenVaultBeaconSetDeployer.pointers.sol"; +import { + RUNTIME_CODE as STOX_OARV_DEPLOYER_RUNTIME_CODE, + DEPLOYED_ADDRESS as STOX_OARV_DEPLOYER_GENERATED_ADDRESS +} from "../../../src/generated/StoxOffchainAssetReceiptVaultBeaconSetDeployer.pointers.sol"; +import { + RUNTIME_CODE as STOX_AUTHORIZER_V1_RUNTIME_CODE, + DEPLOYED_ADDRESS as STOX_AUTHORIZER_V1_GENERATED_ADDRESS +} from "../../../src/generated/StoxOffchainAssetReceiptVaultAuthorizerV1.pointers.sol"; +import { + RUNTIME_CODE as STOX_PAYMENT_MINT_AUTHORIZER_V1_RUNTIME_CODE, + DEPLOYED_ADDRESS as STOX_PAYMENT_MINT_AUTHORIZER_V1_GENERATED_ADDRESS +} from "../../../src/generated/StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1.pointers.sol"; +import { + RUNTIME_CODE as STOX_CORPORATE_ACTIONS_FACET_RUNTIME_CODE, + DEPLOYED_ADDRESS as STOX_CORPORATE_ACTIONS_FACET_GENERATED_ADDRESS +} from "../../../src/generated/StoxCorporateActionsFacet.pointers.sol"; + +/// @title LibProdDeployV4Test +/// @notice Pins every constant in `LibProdDeployV4` so a wrong address or +/// codehash literal fails a test. The lib's deployed-contract pins mirror the +/// `src/generated/*.pointers.sol` files (regenerated by `BuildPointers.sol` +/// against rain.vats 0.1.6) and reproduce as Zoltu-deterministic deployments, +/// so each contract is checked three ways: +/// +/// 1. **Zoltu deploy** — deploy the fresh-compiled creation code through the +/// Zoltu factory and assert the deterministic address + runtime codehash +/// equal the V4 pins. Self-contained (no live fork, no pointer file): proves +/// the V4 pins match what the current source actually compiles + deploys to. +/// 2. **Pointer-address consistency** — the V4 address literal equals the +/// pointer file's `DEPLOYED_ADDRESS`. Pure, compile-independent. +/// 3. **Pointer-codehash consistency** — the V4 codehash literal equals +/// `keccak256(RUNTIME_CODE)` from the pointer file (the lib documents the +/// codehashes as exactly this). Pure, compile-independent. +/// +/// The `STOX_PROD_AUTHORISER_V4_CLONE` pin is a non-deterministic deploy target +/// and is still an `address(0)` placeholder; `testAuthoriserV4ClonePlaceholder` +/// asserts that explicitly so the placeholder can't be silently shipped as a +/// real pin and so the test fails (prompting a real assertion) once the clone +/// is hydrated. +contract LibProdDeployV4Test is Test { + // --- StoxReceipt --- + + function testDeployAddressStoxReceipt() external { + LibRainDeploy.etchZoltuFactory(vm); + address deployed = LibRainDeploy.deployZoltu(type(StoxReceipt).creationCode); + assertEq(deployed, LibProdDeployV4.STOX_RECEIPT_RAIN_VATS_0_1_6); + assertTrue(deployed.code.length > 0); + assertEq(deployed.codehash, LibProdDeployV4.STOX_RECEIPT_CODEHASH_RAIN_VATS_0_1_6); + } + + function testGeneratedAddressStoxReceipt() external pure { + assertEq(STOX_RECEIPT_GENERATED_ADDRESS, LibProdDeployV4.STOX_RECEIPT_RAIN_VATS_0_1_6); + } + + function testCodehashMatchesPointerStoxReceipt() external pure { + assertEq(LibProdDeployV4.STOX_RECEIPT_CODEHASH_RAIN_VATS_0_1_6, keccak256(STOX_RECEIPT_RUNTIME_CODE)); + } + + // --- StoxReceiptVault --- + + function testDeployAddressStoxReceiptVault() external { + LibRainDeploy.etchZoltuFactory(vm); + address deployed = LibRainDeploy.deployZoltu(type(StoxReceiptVault).creationCode); + assertEq(deployed, LibProdDeployV4.STOX_RECEIPT_VAULT_RAIN_VATS_0_1_6); + assertTrue(deployed.code.length > 0); + assertEq(deployed.codehash, LibProdDeployV4.STOX_RECEIPT_VAULT_CODEHASH_RAIN_VATS_0_1_6); + } + + function testGeneratedAddressStoxReceiptVault() external pure { + assertEq(STOX_RECEIPT_VAULT_GENERATED_ADDRESS, LibProdDeployV4.STOX_RECEIPT_VAULT_RAIN_VATS_0_1_6); + } + + function testCodehashMatchesPointerStoxReceiptVault() external pure { + assertEq( + LibProdDeployV4.STOX_RECEIPT_VAULT_CODEHASH_RAIN_VATS_0_1_6, keccak256(STOX_RECEIPT_VAULT_RUNTIME_CODE) + ); + } + + // --- StoxWrappedTokenVault --- + + function testDeployAddressStoxWrappedTokenVault() external { + LibRainDeploy.etchZoltuFactory(vm); + address deployed = LibRainDeploy.deployZoltu(type(StoxWrappedTokenVault).creationCode); + assertEq(deployed, LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_RAIN_VATS_0_1_6); + assertTrue(deployed.code.length > 0); + assertEq(deployed.codehash, LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_CODEHASH_RAIN_VATS_0_1_6); + } + + function testGeneratedAddressStoxWrappedTokenVault() external pure { + assertEq(STOX_WRAPPED_TOKEN_VAULT_GENERATED_ADDRESS, LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_RAIN_VATS_0_1_6); + } + + function testCodehashMatchesPointerStoxWrappedTokenVault() external pure { + assertEq( + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_CODEHASH_RAIN_VATS_0_1_6, + keccak256(STOX_WRAPPED_TOKEN_VAULT_RUNTIME_CODE) + ); + } + + // --- StoxUnifiedDeployer --- + + function testDeployAddressStoxUnifiedDeployer() external { + LibRainDeploy.etchZoltuFactory(vm); + address deployed = LibRainDeploy.deployZoltu(type(StoxUnifiedDeployer).creationCode); + assertEq(deployed, LibProdDeployV4.STOX_UNIFIED_DEPLOYER_RAIN_VATS_0_1_6); + assertTrue(deployed.code.length > 0); + assertEq(deployed.codehash, LibProdDeployV4.STOX_UNIFIED_DEPLOYER_CODEHASH_RAIN_VATS_0_1_6); + } + + function testGeneratedAddressStoxUnifiedDeployer() external pure { + assertEq(STOX_UNIFIED_DEPLOYER_GENERATED_ADDRESS, LibProdDeployV4.STOX_UNIFIED_DEPLOYER_RAIN_VATS_0_1_6); + } + + function testCodehashMatchesPointerStoxUnifiedDeployer() external pure { + assertEq( + LibProdDeployV4.STOX_UNIFIED_DEPLOYER_CODEHASH_RAIN_VATS_0_1_6, + keccak256(STOX_UNIFIED_DEPLOYER_RUNTIME_CODE) + ); + } + + // --- StoxWrappedTokenVaultBeacon (needs the wrapped token vault deployed first) --- + + function testDeployAddressStoxWrappedTokenVaultBeacon() external { + LibRainDeploy.etchZoltuFactory(vm); + LibRainDeploy.deployZoltu(type(StoxWrappedTokenVault).creationCode); + address deployed = LibRainDeploy.deployZoltu(type(StoxWrappedTokenVaultBeacon).creationCode); + assertEq(deployed, LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_0_1_6); + assertTrue(deployed.code.length > 0); + assertEq(deployed.codehash, LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_CODEHASH_RAIN_VATS_0_1_6); + } + + function testGeneratedAddressStoxWrappedTokenVaultBeacon() external pure { + assertEq(STOX_BEACON_GENERATED_ADDRESS, LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_RAIN_VATS_0_1_6); + } + + function testCodehashMatchesPointerStoxWrappedTokenVaultBeacon() external pure { + assertEq( + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_CODEHASH_RAIN_VATS_0_1_6, + keccak256(STOX_BEACON_RUNTIME_CODE) + ); + } + + // --- StoxWrappedTokenVaultBeaconSetDeployer (needs vault + beacon first) --- + + function testDeployAddressStoxWrappedTokenVaultBeaconSetDeployer() external { + LibRainDeploy.etchZoltuFactory(vm); + LibRainDeploy.deployZoltu(type(StoxWrappedTokenVault).creationCode); + LibRainDeploy.deployZoltu(type(StoxWrappedTokenVaultBeacon).creationCode); + address deployed = LibRainDeploy.deployZoltu(type(StoxWrappedTokenVaultBeaconSetDeployer).creationCode); + assertEq(deployed, LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6); + assertTrue(deployed.code.length > 0); + assertEq( + deployed.codehash, LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_CODEHASH_RAIN_VATS_0_1_6 + ); + } + + function testGeneratedAddressStoxWrappedTokenVaultBeaconSetDeployer() external pure { + assertEq( + STOX_BEACON_SET_DEPLOYER_GENERATED_ADDRESS, + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 + ); + } + + function testCodehashMatchesPointerStoxWrappedTokenVaultBeaconSetDeployer() external pure { + assertEq( + LibProdDeployV4.STOX_WRAPPED_TOKEN_VAULT_BEACON_SET_DEPLOYER_CODEHASH_RAIN_VATS_0_1_6, + keccak256(STOX_BEACON_SET_DEPLOYER_RUNTIME_CODE) + ); + } + + // --- StoxOffchainAssetReceiptVaultBeaconSetDeployer (needs receipt + receipt vault first) --- + + function testDeployAddressStoxOffchainAssetReceiptVaultBeaconSetDeployer() external { + LibRainDeploy.etchZoltuFactory(vm); + LibRainDeploy.deployZoltu(type(StoxReceipt).creationCode); + LibRainDeploy.deployZoltu(type(StoxReceiptVault).creationCode); + address deployed = LibRainDeploy.deployZoltu(type(StoxOffchainAssetReceiptVaultBeaconSetDeployer).creationCode); + assertEq(deployed, LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6); + assertTrue(deployed.code.length > 0); + assertEq( + deployed.codehash, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CODEHASH_RAIN_VATS_0_1_6 + ); + } + + function testGeneratedAddressStoxOffchainAssetReceiptVaultBeaconSetDeployer() external pure { + assertEq( + STOX_OARV_DEPLOYER_GENERATED_ADDRESS, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_RAIN_VATS_0_1_6 + ); + } + + function testCodehashMatchesPointerStoxOffchainAssetReceiptVaultBeaconSetDeployer() external pure { + assertEq( + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_BEACON_SET_DEPLOYER_CODEHASH_RAIN_VATS_0_1_6, + keccak256(STOX_OARV_DEPLOYER_RUNTIME_CODE) + ); + } + + // --- StoxOffchainAssetReceiptVaultAuthorizerV1 --- + + function testDeployAddressStoxOffchainAssetReceiptVaultAuthorizerV1() external { + LibRainDeploy.etchZoltuFactory(vm); + address deployed = LibRainDeploy.deployZoltu(type(StoxOffchainAssetReceiptVaultAuthorizerV1).creationCode); + assertEq(deployed, LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_RAIN_VATS_0_1_6); + assertTrue(deployed.code.length > 0); + assertEq( + deployed.codehash, LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_CODEHASH_RAIN_VATS_0_1_6 + ); + } + + function testGeneratedAddressStoxOffchainAssetReceiptVaultAuthorizerV1() external pure { + assertEq( + STOX_AUTHORIZER_V1_GENERATED_ADDRESS, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_RAIN_VATS_0_1_6 + ); + } + + function testCodehashMatchesPointerStoxOffchainAssetReceiptVaultAuthorizerV1() external pure { + assertEq( + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_AUTHORIZER_V1_CODEHASH_RAIN_VATS_0_1_6, + keccak256(STOX_AUTHORIZER_V1_RUNTIME_CODE) + ); + } + + // --- StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1 --- + + function testDeployAddressStoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1() external { + LibRainDeploy.etchZoltuFactory(vm); + address deployed = + LibRainDeploy.deployZoltu(type(StoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1).creationCode); + assertEq(deployed, LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_RAIN_VATS_0_1_6); + assertTrue(deployed.code.length > 0); + assertEq( + deployed.codehash, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_CODEHASH_RAIN_VATS_0_1_6 + ); + } + + function testGeneratedAddressStoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1() external pure { + assertEq( + STOX_PAYMENT_MINT_AUTHORIZER_V1_GENERATED_ADDRESS, + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_RAIN_VATS_0_1_6 + ); + } + + function testCodehashMatchesPointerStoxOffchainAssetReceiptVaultPaymentMintAuthorizerV1() external pure { + assertEq( + LibProdDeployV4.STOX_OFFCHAIN_ASSET_RECEIPT_VAULT_PAYMENT_MINT_AUTHORIZER_V1_CODEHASH_RAIN_VATS_0_1_6, + keccak256(STOX_PAYMENT_MINT_AUTHORIZER_V1_RUNTIME_CODE) + ); + } + + // --- StoxCorporateActionsFacet --- + + function testDeployAddressStoxCorporateActionsFacet() external { + LibRainDeploy.etchZoltuFactory(vm); + address deployed = LibRainDeploy.deployZoltu(type(StoxCorporateActionsFacet).creationCode); + assertEq(deployed, LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_RAIN_VATS_0_1_6); + assertTrue(deployed.code.length > 0); + assertEq(deployed.codehash, LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_CODEHASH_RAIN_VATS_0_1_6); + } + + function testGeneratedAddressStoxCorporateActionsFacet() external pure { + assertEq( + STOX_CORPORATE_ACTIONS_FACET_GENERATED_ADDRESS, LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_RAIN_VATS_0_1_6 + ); + } + + function testCodehashMatchesPointerStoxCorporateActionsFacet() external pure { + assertEq( + LibProdDeployV4.STOX_CORPORATE_ACTIONS_FACET_CODEHASH_RAIN_VATS_0_1_6, + keccak256(STOX_CORPORATE_ACTIONS_FACET_RUNTIME_CODE) + ); + } + + // --- Non-deployed-contract constants --- + + /// The beacon initial owner is rainlang.eth and unchanged across versions. + function testBeaconInitialOwner() external pure { + assertEq(LibProdDeployV4.BEACON_INITIAL_OWNER, address(0x8E4bdeec7CEB9570D440676345dA1dCe10329f5b)); + } + + /// The rain.vats tag string is encoded into every deployed-contract + /// constant name, so it must match the `_RAIN_VATS_0_1_6` suffix used + /// throughout the lib. + function testRainVatsTag() external pure { + assertEq(LibProdDeployV4.RAIN_VATS_TAG, "RAIN_VATS_0_1_6"); + } + + /// The V4 authoriser clone is a non-deterministic deploy target and is + /// still a placeholder. Asserting the placeholder explicitly prevents it + /// from being silently shipped as a real pin, and makes this test fail + /// (prompting a real address + codehash assertion) the moment the clone is + /// hydrated with its deployed literal. + function testAuthoriserV4ClonePlaceholder() external pure { + assertEq( + LibProdDeployV4.STOX_PROD_AUTHORISER_V4_CLONE, + address(0), + "clone hydrated: replace this placeholder guard with a real address + codehash assertion" + ); + assertEq( + LibProdDeployV4.STOX_PROD_AUTHORISER_V4_CLONE_CODEHASH, + bytes32(0), + "clone codehash hydrated: replace this placeholder guard with a real assertion" + ); + } +} diff --git a/test/src/lib/LibSafeInvariants.t.sol b/test/src/lib/LibSafeInvariants.t.sol index 07f0c530..05d34cbb 100644 --- a/test/src/lib/LibSafeInvariants.t.sol +++ b/test/src/lib/LibSafeInvariants.t.sol @@ -6,7 +6,7 @@ import {Test} from "forge-std-1.16.1/src/Test.sol"; import {LibSafeInvariants} from "../../../src/lib/LibSafeInvariants.sol"; import {LibSafeInvariantsHarness} from "./LibSafeInvariantsHarness.sol"; import {IGnosisSafe} from "../../../src/interface/IGnosisSafe.sol"; -import {LibRainDeploy} from "rain-deploy-0.1.3/src/lib/LibRainDeploy.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; import { SafeProxyCodehashMismatch, SafeSingletonMismatch, diff --git a/test/src/lib/LibSafeOps.t.sol b/test/src/lib/LibSafeOps.t.sol index b83803b3..ecf01245 100644 --- a/test/src/lib/LibSafeOps.t.sol +++ b/test/src/lib/LibSafeOps.t.sol @@ -6,7 +6,7 @@ import {Test} from "forge-std-1.16.1/src/Test.sol"; import {LibSafeOps, SafeTx, TxBuilderJsonNoTransactions} from "../../../src/lib/LibSafeOps.sol"; import {LibSafeInvariants} from "../../../src/lib/LibSafeInvariants.sol"; import {IGnosisSafe} from "../../../src/interface/IGnosisSafe.sol"; -import {LibRainDeploy} from "rain-deploy-0.1.3/src/lib/LibRainDeploy.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; import {CallerRecorder} from "./CallerRecorder.sol"; import {ParseHarness} from "./ParseHarness.sol"; import {NPlus1Harness} from "./NPlus1Harness.sol"; diff --git a/test/src/lib/LibStoxDeployNetworks.t.sol b/test/src/lib/LibStoxDeployNetworks.t.sol new file mode 100644 index 00000000..12345efe --- /dev/null +++ b/test/src/lib/LibStoxDeployNetworks.t.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {Test} from "forge-std-1.16.1/src/Test.sol"; +import {LibStoxDeployNetworks} from "../../../src/lib/LibStoxDeployNetworks.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; + +/// @title LibStoxDeployNetworksTest +/// @notice Pins the ST0x deploy network set so any change to the supported +/// networks fails a test. +contract LibStoxDeployNetworksTest is Test { + /// ST0x deploys to Base only. + function testSupportedNetworksIsBaseOnly() external pure { + string[] memory networks = LibStoxDeployNetworks.supportedNetworks(); + assertEq(networks.length, 1, "expected exactly one deploy network"); + assertEq(networks[0], LibRainDeploy.BASE, "expected Base"); + } +} diff --git a/test/src/lib/LibTokenInvariants.t.sol b/test/src/lib/LibTokenInvariants.t.sol index b2cdc4d2..d8bff685 100644 --- a/test/src/lib/LibTokenInvariants.t.sol +++ b/test/src/lib/LibTokenInvariants.t.sol @@ -7,7 +7,7 @@ import {LibAuthoriserInvariants} from "../../../src/lib/LibAuthoriserInvariants. import {LibTokenInvariants, IOwnable, ReceiptVaultOwnerMismatch} from "../../../src/lib/LibTokenInvariants.sol"; import {LibSafeInvariants} from "../../../src/lib/LibSafeInvariants.sol"; import {LibTokenInvariantsHarness} from "./LibTokenInvariantsHarness.sol"; -import {LibRainDeploy} from "rain-deploy-0.1.3/src/lib/LibRainDeploy.sol"; +import {LibRainDeploy} from "rain-deploy-0.1.4/src/lib/LibRainDeploy.sol"; /// @title LibTokenInvariantsTest /// @notice Fork tests for the token-side uniformity invariants: every