Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for Solidity libraries that require deployment is limited #651

Closed
ggrieco-tob opened this issue Apr 30, 2021 · 24 comments
Closed

Support for Solidity libraries that require deployment is limited #651

ggrieco-tob opened this issue Apr 30, 2021 · 24 comments
Labels

Comments

@ggrieco-tob
Copy link
Member

Solidity allows to define libraries. If the libraries contain only internal functions, Echidna will work fine. If the library contains external functions, our tool only support linking libraries when solc is using directly using the solcLibs argument. In any other case, the result can be unexpected (e.g. if the contract is linked during by a third-party framework).

@ggrieco-tob
Copy link
Member Author

@anishnaik should we discuss something here, according to your latest research?

@anishnaik
Copy link

anishnaik commented Jan 19, 2023

tldr; I will be pushing up a few fixes to CC that should aid in this endeavor. At the end of the day, the library linking process in echidna will be "best effort" and it is hard to guarantee a 100% success rate.

Longer response:
@ggrieco-tob have a couple of observations around this:

  1. There is no perfect solution that will work across all compilation platforms + Solidity versions. What we can do is a "best-efforts" attempt at identifying the library that is associated with a given placeholder. For example, Brownie, for some reason, uses the legacy placeholder logic (Solidity v0.4) for the init bytecode but then the latest placeholder logic (Solidity v0.5+) for the runtime bytecode; this is obviously incorrect. Similarly, truffle will use the legacy placeholder logic regardless of the Solidity version used during compilation, also incorrect. Both of these examples showcase the variation and inconsistency in logic across compilation platforms. Note that platforms such as Foundry and Hardhat are compliant with the standard.
  2. This "best efforts" attempt was being done by CC but sort of incorrectly. I have the fix in place and have updated a few more things to simplify the logic for it. There are a total of 3 possibilities for Solidity v0.4 and 3 possibilities for v0.5 and above. Thus, CC will simply bruteforce the matching process in hopes of finding the correct library. Because of this, the logic won't work for platforms like Brownie and Truffle since they deviate from the expected behavior. I don't believe that CC should have incorrect / non-standard logic just because some compilation platforms are not up-to-date with Solidity's standard practice.
  3. After the matching is done, the libraries object in the standard JSON output of CC will hold a mapping from library_name -> placeholder. Echidna can use this to map placeholder -> library_name -> library address. This will also work for libraries that depend on other libraries. Here is an example of the libraries object:
      "libraries": {
        "ExternalExternalLibrary": "__$f8206c9eb556216ac596b183e49a5b0a9b$__"
      },

From echidna's perspective, it will just have to deploy all libraries first, cache the addresses of the deployed libraries, and update the init bytecode for any contract that relies on a deployed library using the cached addresses + the libraries object.

@hellwolf
Copy link

bumping this. is it still considered "wont fix" ?

@ggrieco-tob
Copy link
Member Author

Actually no, there is documentation on a workaround here

@hellwolf
Copy link

Oh, good to know.

I just tried that method:

echidna.yml:

...
cryticArgs: [
  # $ (j=$((0xf11));sed -nE 's/^library\s+(\w+)\s+\{/\1/pg' contracts/utils/SuperfluidFrameworkDeploymentSteps.sol | sort | while read i;do echo -n "($i,$(printf "0x%x" $j)),";j=$((j+1));done)
  "--compile-libraries=(SlotsBitmapLibrary,0xf01),(SuperfluidLoaderLibrary,0xf02),(SuperfluidPoolDeployerLibrary,0xf03),(CFAv1ForwarderDeployerLibrary,0xf11),(GDAv1ForwarderDeployerLibrary,0xf12),(IDAv1ForwarderDeployerLibrary,0xf13),(ProxyDeployerLibrary,0xf14),(SuperfluidCFAv1DeployerLibrary,0xf15),(SuperfluidFlowNFTLogicDeployerLibrary,0xf16),(SuperfluidGDAv1DeployerLibrary,0xf17),(SuperfluidGovDeployerLibrary,0xf18),(SuperfluidHostDeployerLibrary,0xf19),(SuperfluidIDAv1DeployerLibrary,0xf1a),(SuperfluidLoaderDeployerLibrary,0xf1b),(SuperfluidPeripheryDeployerLibrary,0xf1c),(SuperfluidPoolLogicDeployerLibrary,0xf1d),(SuperfluidPoolNFTLogicDeployerLibrary,0xf1e),(SuperTokenDeployerLibrary,0xf1f),(TokenDeployerLibrary,0xf20)"
]
deployContracts: [
  ["0xf01", "SlotsBitmapLibrary"],
  ["0xf02", "SuperfluidLoaderLibrary"],
  ["0xf03", "SuperfluidPoolDeployerLibrary"],
  # to generate:
  # $ (j=$((0xf11));sed -nE 's/^library\s+(\w+)\s+\{/\1/pg' contracts/utils/SuperfluidFrameworkDeploymentSteps.sol | sort | while read i;do echo "[\"$(printf "0x%040x" $j)\", \"$i\"],";j=$((j+1));done)
  ["0xf11", "CFAv1ForwarderDeployerLibrary"],
  ["0xf12", "GDAv1ForwarderDeployerLibrary"],
  ["0xf13", "IDAv1ForwarderDeployerLibrary"],
  ["0xf14", "ProxyDeployerLibrary"],
  ["0xf15", "SuperfluidCFAv1DeployerLibrary"],
  ["0xf16", "SuperfluidFlowNFTLogicDeployerLibrary"],
  ["0xf17", "SuperfluidGDAv1DeployerLibrary"],
  ["0xf18", "SuperfluidGovDeployerLibrary"],
  ["0xf19", "SuperfluidHostDeployerLibrary"],
  ["0xf1a", "SuperfluidIDAv1DeployerLibrary"],
  ["0xf1b", "SuperfluidLoaderDeployerLibrary"],
  ["0xf1c", "SuperfluidPeripheryDeployerLibrary"],
  ["0xf1d", "SuperfluidPoolLogicDeployerLibrary"],
  ["0xf1e", "SuperfluidPoolNFTLogicDeployerLibrary"],
  ["0xf1f", "SuperTokenDeployerLibrary"],
  ["0xf20", "TokenDeployerLibrary"],
]
...

Getting either with foundry:

Analyzing contract: /home/hellwolf/Projects/superfluid/protocol-monorepo_dev/packages/hot-fuzz/packages/hot-fuzz/contracts/superfluid-tests/SuperHotFuzz.sol:SuperHotFuzz
echidna: Error: unlinked libraries detected in bytecode
CallStack (from HasCallStack):
  error, called at src/EVM/Solidity.hs:653:18 in hevm-0.51.3-J1ldUo8hL8f8OHSfPt43cf:EVM.Solidity

or truffle:

Analyzing contract: /home/hellwolf/Projects/superfluid/protocol-monorepo_dev/packages/hot-fuzz/contracts/superfluid-tests/SuperHotFuzz.sol:SuperHotFuzz
echidna: invalid character at offset: 22066
CallStack (from HasCallStack):
  error, called at src/EVM/Solidity.hs:654:18 in hevm-0.51.3-J1ldUo8hL8f8OHSfPt43cf:EVM.Solidity

@ggrieco-tob
Copy link
Member Author

Which crytic-compile version are you using?

@hellwolf
Copy link

nix-shell$ crytic-compile --version
0.3.3

@ggrieco-tob
Copy link
Member Author

Can you try manually executing crytic-compile with the command line: --compile-libraries=(SlotsBitmapLibrary,0xf01),(SuperfluidLoaderLibrary,0xf02),(SuperfluidPoolDeployerLibrary,0xf03),(CFAv1ForwarderDeployerLibrary,0xf11),(GDAv1ForwarderDeployerLibrary,0xf12),(IDAv1ForwarderDeployerLibrary,0xf13),(ProxyDeployerLibrary,0xf14),(SuperfluidCFAv1DeployerLibrary,0xf15),(SuperfluidFlowNFTLogicDeployerLibrary,0xf16),(SuperfluidGDAv1DeployerLibrary,0xf17),(SuperfluidGovDeployerLibrary,0xf18),(SuperfluidHostDeployerLibrary,0xf19),(SuperfluidIDAv1DeployerLibrary,0xf1a),(SuperfluidLoaderDeployerLibrary,0xf1b),(SuperfluidPeripheryDeployerLibrary,0xf1c),(SuperfluidPoolLogicDeployerLibrary,0xf1d),(SuperfluidPoolNFTLogicDeployerLibrary,0xf1e),(SuperTokenDeployerLibrary,0xf1f),(TokenDeployerLibrary,0xf20) to see if the bytecode still contain unlinked libraries?

@hellwolf
Copy link

nix-shell$ crytic-compile . --compile-force-framework=foundry --foundry-out-directory=build/foundry/out --compile-libraries "(SlotsBitmapLibrary,0xf01),(SuperfluidLoaderLibrary,0xf02),(SuperfluidPoolDeployerLibrary,0xf03),(CFAv1ForwarderDeployerLibrary,0xf11),(GDAv1ForwarderDeployerLibrary,0xf12),(IDAv1ForwarderDeployerLibrary,0xf13),(ProxyDeployerLibrary,0xf14),(SuperfluidCFAv1DeployerLibrary,0xf15),(SuperfluidFlowNFTLogicDeployerLibrary,0xf16),(SuperfluidGDAv1DeployerLibrary,0xf17),(SuperfluidGovDeployerLibrary,0xf18),(SuperfluidHostDeployerLibrary,0xf19),(SuperfluidIDAv1DeployerLibrary,0xf1a),(SuperfluidLoaderDeployerLibrary,0xf1b),(SuperfluidPeripheryDeployerLibrary,0xf1c),(SuperfluidPoolLogicDeployerLibrary,0xf1d),(SuperfluidPoolNFTLogicDeployerLibrary,0xf1e),(SuperTokenDeployerLibrary,0xf1f),(TokenDeployerLibrary,0xf20)" --print-libraries 
INFO:CryticCompile:'forge clean' running (wd: /home/hellwolf/Projects/superfluid/protocol-monorepo_dev/packages/hot-fuzz)
INFO:CryticCompile:'forge build --build-info' running (wd: /home/hellwolf/Projects/superfluid/protocol-monorepo_dev/packages/hot-fuzz)
Compilation unit: bd468edc3e97b83d0802165b5ce1f427 solc 0.8.19)
None
## InstantDistributionAgreementV1
	uses: ['SlotsBitmapLibrary']
	runtime bytecode: 608060405234801561001057600080fd5b50600436106101375760003560e01c80637fbc7639116100b8578063acafa1b81161007c578063acafa1b814610336578063acf4a6c214610349578063b6dacdb81461035c578063b96731c21461037e578063cd7245c514610391578063d787840a146103e957600080fd5b80637fbc76391461029f578063899baaec146102b25780639903ad38146102e25780639b2e48bc146102ea578063a5653ced1461031857600080fd5b806350d75d25116100ff57806350d75d251461020457806352d1902d1461020c5780635b534051146102225780636041ae96146102665780637730599e1461027957600080fd5b8063232d2b581461013c57806323fc23f3146101655780632e5e74c6146101a95780633fd4176a146101bc57806346951954146101ef575b600080fd5b61014f61014a3660046143b8565b6103fc565b60405161015c9190614493565b60405180910390f35b6101786101733660046144a6565b610b16565b6040805194151585526001600160801b0393841660208601529183169184019190915216606082015260800161015c565b61014f6101b73660046144f1565b610b81565b6101d773__$0ca4325a4497c5d952bddb238e8b4ce961$__81565b6040516001600160a01b03909116815260200161015c565b6102026101fd366004614545565b6110e8565b005b6101d761113d565b61021461116c565b60405190815260200161015c565b610235610230366004614569565b6111d0565b60405161015c9493929190931515845291151560208401526001600160801b03166040830152606082015260800190565b61014f6102743660046145c5565b6112a6565b7f8aedc3b5d4bf031e11a7e2940f7251c005698405d58e02e1c247fed3b1b3a674610214565b61014f6102ad366004614640565b6116cb565b6102c56102c0366004614681565b6117b8565b604080519283526001600160801b0390911660208301520161015c565b61020261185d565b6102fd6102f83660046146d2565b61196b565b6040805193845260208401929092529082015260600161015c565b61032161010081565b60405163ffffffff909116815260200161015c565b61014f6103443660046144f1565b611b76565b61014f6103573660046145c5565b611f7b565b61036f61036a366004614713565b612535565b60405161015c93929190614790565b61014f61038c36600461482d565b61278a565b6103a461039f366004614882565b61288a565b604080516001600160a01b03909616865263ffffffff9094166020860152911515928401929092526001600160801b039091166060830152608082015260a00161015c565b61014f6103f73660046148ae565b61298c565b60606001600160a01b03851661042557604051633242919d60e21b815260040160405180910390fd5b61042d614210565b61043561426e565b606060008061047a8c89898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b4792505050565b90508060a00151925080606001519150506104998b828b8d6000612d14565b60808901521515602080890191909152606088019190915260408088018390529287528251908101909252600082526104d5918d918c91612e07565b925086868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050602086015191965050156105395764040000000060c084015261052f8386612e35565b60a0850152610554565b64010000000060c084015261054e8386612e35565b60a08501525b83602001518015610571575060808401515163ffffffff90811614155b1561064c576105c08460800151608001516001600160801b0316896001600160801b03168660600151602001516001600160801b03166105b19190614928565b6105bb919061493b565b612fec565b6060850180516001600160801b03909216602090920191909152845190516001600160a01b038d169163a1b2bf8b916105f890613059565b6040518363ffffffff1660e01b815260040161061592919061497e565b600060405180830381600087803b15801561062f57600080fd5b505af1158015610643573d6000803e3d6000fd5b50505050610833565b8360200151156106c9576106918460800151608001516001600160801b0316896001600160801b03168660600151604001516001600160801b03166105b19190614928565b6060850180516001600160801b03909216604090920191909152845190516001600160a01b038d169163a1b2bf8b916105f890613059565b6040518060a0016040528063ffffffff80168152602001826001600160a01b031681526020018b63ffffffff1681526020018560600151600001516001600160801b03168152602001896001600160801b031681525084608001819052508a6001600160a01b03166312a6a3f8856040015161074887608001516130f7565b6040518363ffffffff1660e01b815260040161076592919061497e565b600060405180830381600087803b15801561077f57600080fd5b505af1158015610793573d6000803e3d6000fd5b50505050878460600151604001516107ab9190614997565b6060850180516001600160801b03909216604090920191909152845190516001600160a01b038d169163a1b2bf8b916107e390613059565b6040518363ffffffff1660e01b815260040161080092919061497e565b600060405180830381600087803b15801561081a57600080fd5b505af115801561082e573d6000803e3d6000fd5b505050505b60008460800151608001516001600160801b031685608001516060015186606001516000015161086391906149be565b6001600160801b031661087691906149de565b905063ffffffff801685608001516000015163ffffffff160361090f576108a68c836108a184614a0e565b61319e565b6001600160a01b038c1663cf97256d836108bf84614a0e565b6040518363ffffffff1660e01b81526004016108dc929190614a2a565b600060405180830381600087803b1580156108f657600080fd5b505af115801561090a573d6000803e3d6000fd5b505050505b60405163cf97256d60e01b81526001600160a01b038d169063cf97256d9061093d908d908590600401614a2a565b600060405180830381600087803b15801561095757600080fd5b505af115801561096b573d6000803e3d6000fd5b50505050846020015115610a115760608086015151608080880180516001600160801b039384169401939093528251918c16910152604086015190516001600160a01b038e169163a1b2bf8b916109c1906130f7565b6040518363ffffffff1660e01b81526004016109de92919061497e565b600060405180830381600087803b1580156109f857600080fd5b505af1158015610a0c573d6000803e3d6000fd5b505050505b846020015115610a405764080000000060c085015260a0850151610a37908590886132ec565b9650610a609050565b64020000000060c085015260a0850151610a5c908590886132ec565b9650505b8a63ffffffff16826001600160a01b03168d6001600160a01b03167f0115987243fd19d615b5ea62a80372a06a2b37fec378b148ee7a507c5c4c0a398d8d88604051610aae93929190614a43565b60405180910390a4896001600160a01b03168c6001600160a01b03167fe0707ac7efb8b59c22189af8d004ed17dc9e4379e71b9066119b62c182524977848e8d88604051610aff9493929190614a7f565b60405180910390a350505050509695505050505050565b600080600080610b3f604080516060810182526000808252602082018190529181019190915290565b6000610b4b8888613538565b9050610b57898261359f565b90965091508515610b7657815160208301516040840151919650945092505b505093509350935093565b6060610b8b614210565b610b9361426e565b600060606000610bd98c89898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b4792505050565b606081015160a0909101519093509150506001600160a01b038816610c1157604051633242919d60e21b815260040160405180910390fd5b896001600160a01b0316826001600160a01b031614610c43576040516392da6d1760e01b815260040160405180910390fd5b610c518b8b8a8c6001612d14565b6080890152506060870152604080870182905291865281516020810190925260008252610c81918d918b91612e07565b925086868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505064100000000060c087015250909550610cd290508386612e35565b60a08501526080808501519081015160609182015191860151516000926001600160801b0390921691610d04916149be565b6001600160801b0316610d1791906149de565b60808601515190915063ffffffff90811614610d6457846080015160800151856060015160200151610d4991906149be565b60608601516001600160801b03909116602090910152610d97565b846080015160800151856060015160400151610d8091906149be565b60608601516001600160801b039091166040909101525b8b6001600160a01b031663a1b2bf8b8660000151610db88860600151613059565b6040518363ffffffff1660e01b8152600401610dd592919061497e565b600060405180830381600087803b158015610def57600080fd5b505af1158015610e03573d6000803e3d6000fd5b5050505060808501515163ffffffff90811614610e2d57610e2d8c8a8760800151600001516136b3565b60808501515163ffffffff1663fffffffe1901610ebb57610e528c8c6108a184614a0e565b6001600160a01b038c1663cf97256d8c610e6b84614a0e565b6040518363ffffffff1660e01b8152600401610e88929190614a2a565b600060405180830381600087803b158015610ea257600080fd5b505af1158015610eb6573d6000803e3d6000fd5b505050505b6040858101519051632704839760e01b81526004810191909152600260248201526001600160a01b038d1690632704839790604401600060405180830381600087803b158015610f0a57600080fd5b505af1158015610f1e573d6000803e3d6000fd5b505060405163cf97256d60e01b81526001600160a01b038f16925063cf97256d9150610f50908c908590600401614a2a565b600060405180830381600087803b158015610f6a57600080fd5b505af1158015610f7e573d6000803e3d6000fd5b505064200000000060c0870152505060a0850151610f9e908590886132ec565b9050809650508963ffffffff168b6001600160a01b03168d6001600160a01b03167fe1f8e9cd8061e5b251769965bda6ca9ef1674bc6541fb9131039fa53f024d1428c86604051610ff0929190614ac8565b60405180910390a4886001600160a01b03168c6001600160a01b03167f9e02127550b99adc8cc6ee332a36f31338facdbc396cebefce9a047247cd04558d8d8660405161103f93929190614aec565b60405180910390a38963ffffffff168b6001600160a01b03168d6001600160a01b03167f0115987243fd19d615b5ea62a80372a06a2b37fec378b148ee7a507c5c4c0a398c60008760405161109693929190614a43565b60405180910390a4886001600160a01b03168c6001600160a01b03167fe0707ac7efb8b59c22189af8d004ed17dc9e4379e71b9066119b62c1825249778d8d600087604051610aff9493929190614a7f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461113157604051630b00ec8f60e11b815260040160405180910390fd5b61113a8161373e565b50565b60006111677f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905090565b6000306001600160a01b0316637730599e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111679190614b1c565b6000806000806000806111fc604080516060810182526000808252602082018190529181019190915290565b6112046142a9565b6112128c8c8b8d6000612d14565b909b50929650909450925090508761123b5760008060008097509750975097505050505061129b565b8051608082015163ffffffff9182169091141597509550866112915780608001516001600160801b03168160600151836000015161127991906149be565b6001600160801b031661128c9190614b35565b611294565b60005b9450505050505b945094509450949050565b60606112b0614210565b6112b861426e565b6000606060006112fe8b89898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b4792505050565b9050806060015192508060a0015191505061131d8a8a848b6001612d14565b6080890181905260608901929092525060408701919091529085525163ffffffff1663fffffffe190161136357604051633741257360e01b815260040160405180910390fd5b6113828a8a866040015160405180602001604052806000815250612e07565b925086868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505064100000000060c0870152509095506113d390508386612e35565b60a08501526080808501519081015160609182015191860151516000926001600160801b0390921691611405916149be565b6001600160801b031661141891906149de565b905084608001516080015185606001516020015161143691906149be565b6060860180516001600160801b0390921660209092019190915260808087015101519051604001516114689190614997565b6060860180516001600160801b03909216604090920191909152855190516001600160a01b038d169163a1b2bf8b916114a090613059565b6040518363ffffffff1660e01b81526004016114bd92919061497e565b600060405180830381600087803b1580156114d757600080fd5b505af11580156114eb573d6000803e3d6000fd5b505050506115028b848760800151600001516136b3565b606080860151516080870180516001600160801b039092169190920152805163ffffffff9052604086015190516001600160a01b038d169163a1b2bf8b91611549906130f7565b6040518363ffffffff1660e01b815260040161156692919061497e565b600060405180830381600087803b15801561158057600080fd5b505af1158015611594573d6000803e3d6000fd5b505060405163cf97256d60e01b81526001600160a01b038e16925063cf97256d91506115c69086908590600401614a2a565b600060405180830381600087803b1580156115e057600080fd5b505af11580156115f4573d6000803e3d6000fd5b505064200000000060c0870152505060a0850151611614908590886132ec565b9050809650508863ffffffff168a6001600160a01b03168c6001600160a01b03167fe1f8e9cd8061e5b251769965bda6ca9ef1674bc6541fb9131039fa53f024d1428686604051611666929190614ac8565b60405180910390a4826001600160a01b03168b6001600160a01b03167f9e02127550b99adc8cc6ee332a36f31338facdbc396cebefce9a047247cd04558c8c866040516116b593929190614aec565b60405180910390a3505050505095945050505050565b6060600061170f8785858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b4792505050565b60608101519091506000806117258a848b613946565b9150915080600001516001600160801b0316886001600160801b031610156117605760405163cfdca72560e01b815260040160405180910390fd5b6117738a848b85858d8a60a001516139a5565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929d9c50505050505050505050505050565b60008060006117c78686613538565b90506000806117d6898461359f565b91509150816117f85760405163edeaa63b60e01b815260040160405180910390fd5b60008160400151826020015161180e9190614997565b6001600160801b0316905060006118286105bb838a614b4c565b8351909150611838908290614997565b955061184d826001600160801b038316614b35565b9650505050505094509492505050565b600054610100900460ff161580801561187d5750600054600160ff909116105b806118975750303b158015611897575060005460ff166001145b6118ff5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015611922576000805461ff0019166101001790555b801561113a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a150565b600080600060608061197d8888613bd4565b909250905060005b81518163ffffffff161015611b5a57600061199e6142a9565b600080868563ffffffff16815181106119b9576119b9614b6e565b602002602001015190506119ec8d878763ffffffff16815181106119df576119df614b6e565b6020026020010151613cc7565b9094509250836119fe576119fe614b84565b8063ffffffff16836000015163ffffffff1614611a1d57611a1d614b84565b6001600160a01b038d16634b61cc33308e611a4263ffffffff8616600160801b614928565b60016040518563ffffffff1660e01b8152600401611a639493929190614b9a565b600060405180830381865afa158015611a80573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611aa89190810190614cc0565b600081518110611aba57611aba614b6e565b6020026020010151915050611ae8604080516060810182526000808252602082018190529181019190915290565b611af28d8361359f565b909450905083611b0457611b04614b84565b82608001516001600160801b031683606001518260000151611b2691906149be565b6001600160801b0316611b3991906149de565b611b43908b614cf4565b99505050505080611b5390614d1c565b9050611985565b50611b658888613de3565b935060009250505093509350939050565b6060611bb88784848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b4792505050565b506001600160a01b038416611be057604051633242919d60e21b815260040160405180910390fd5b611be8614210565b611bf061426e565b611bfe8989888a6001612d14565b6080870181905260608701929092525060408501919091529083525163ffffffff90811614611c4057604051633eb2f84960e01b815260040160405180910390fd5b60008260800151608001516001600160801b0316836080015160600151846060015160000151611c7091906149be565b6001600160801b0316611c839190614b35565b9050611ca48a8a856040015160405180602001604052806000815250612e07565b915085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509296505082159150611f3490505764040000000060c0830152611cfc8285612e35565b60a0840152611d0f8a8a6108a184614a0e565b6001600160a01b038a1663cf97256d8a611d2884614a0e565b6040518363ffffffff1660e01b8152600401611d45929190614a2a565b600060405180830381600087803b158015611d5f57600080fd5b505af1158015611d73573d6000803e3d6000fd5b50505050606083810151516080850180516001600160801b039092169190920152604084015190516001600160a01b038c169163a1b2bf8b91611db5906130f7565b6040518363ffffffff1660e01b8152600401611dd292919061497e565b600060405180830381600087803b158015611dec57600080fd5b505af1158015611e00573d6000803e3d6000fd5b505060405163cf97256d60e01b81526001600160a01b038d16925063cf97256d9150611e32908a908590600401614a2a565b600060405180830381600087803b158015611e4c57600080fd5b505af1158015611e60573d6000803e3d6000fd5b505050508763ffffffff16896001600160a01b03168b6001600160a01b03167f467eccd248ef31c8bcef16d94856855799a8783aeef10f3759e43614059a6bb18a85604051611eb0929190614a2a565b60405180910390a4604080516001600160a01b038b8116825263ffffffff8b166020830152918101839052818916918c16907f48a3d91d4a07e4982b081260e24f922bd33bb965882772d6de19c922c3eabdea9060600160405180910390a364080000000060c083015260a0830151611f2b908390866132ec565b9450611f6e9050565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509296505050505b5050509695505050505050565b6060611f85614210565b611f8d61426e565b600060606000611fd38b89898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b4792505050565b9050806060015192508060a00151915050611ff28a8a848b6000612d14565b60808901521580156020890152606088019190915260408701919091529085526120425760808401515163ffffffff9081161461204257604051633eb2f84960e01b815260040160405180910390fd5b86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506040808a015181516020810190925291815294995061209b948f94508e9350909150612e07565b925083602001516121c45764010000000060c08401526120bb8386612e35565b60a08086019190915260408051918201815260008083526001600160a01b038c16602084015263ffffffff8b1691830191909152606080870151516001600160801b031690830152608080830191909152850152835161211e908b908490613e8c565b60808501805163ffffffff909216909152604085015190516001600160a01b038c16916312a6a3f891612150906130f7565b6040518363ffffffff1660e01b815260040161216d92919061497e565b600060405180830381600087803b15801561218757600080fd5b505af115801561219b573d6000803e3d6000fd5b505064020000000060c0860152505060a08401516121bb908490876132ec565b95506124859050565b64040000000060c08401526121d98386612e35565b60a08501526080808501519081015160609182015191860151516000926001600160801b039092169161220b916149be565b6001600160801b031661221e91906149de565b9050846080015160800151856060015160200181815161223e9190614997565b6001600160801b03169052506080808601510151606086015160400180516122679083906149be565b6001600160801b0316905250845160608601516001600160a01b038d169163a1b2bf8b9161229490613059565b6040518363ffffffff1660e01b81526004016122b192919061497e565b600060405180830381600087803b1580156122cb57600080fd5b505af11580156122df573d6000803e3d6000fd5b505050506122f28b8b836108a190614a0e565b6001600160a01b038b1663cf97256d8b61230b84614a0e565b6040518363ffffffff1660e01b8152600401612328929190614a2a565b600060405180830381600087803b15801561234257600080fd5b505af1158015612356573d6000803e3d6000fd5b505060405163cf97256d60e01b81526001600160a01b038e16925063cf97256d91506123889086908590600401614a2a565b600060405180830381600087803b1580156123a257600080fd5b505af11580156123b6573d6000803e3d6000fd5b5050506060808701515160808801516001600160801b039091169101525084516123e3908c908590613e8c565b60808601805163ffffffff909216909152604086015190516001600160a01b038d169163a1b2bf8b91612415906130f7565b6040518363ffffffff1660e01b815260040161243292919061497e565b600060405180830381600087803b15801561244c57600080fd5b505af1158015612460573d6000803e3d6000fd5b505064080000000060c0870152505060a0850151612480908590886132ec565b965050505b8763ffffffff16896001600160a01b03168b6001600160a01b03167f492d2641617cfaf24ac7328f85bc5bdf5113537d78dc7671afa4f49a73f053c285856040516124d1929190614ac8565b60405180910390a4816001600160a01b03168a6001600160a01b03167fc0b8396b655615cdb85fe462a9a1792480816f909cd46d9517a940b386dfbf6b8b8b8560405161252093929190614aec565b60405180910390a35050505095945050505050565b60608060608060606125478787613bd4565b909250905060006125566142a9565b82516001600160401b0381111561256f5761256f614bc3565b604051908082528060200260200182016040528015612598578160200160208202803683370190505b50965082516001600160401b038111156125b4576125b4614bc3565b6040519080825280602002602001820160405280156125dd578160200160208202803683370190505b50955082516001600160401b038111156125f9576125f9614bc3565b604051908082528060200260200182016040528015612622578160200160208202803683370190505b50945060005b83518163ffffffff16101561277e576000858263ffffffff168151811061265157612651614b6e565b602002602001015190506000858363ffffffff168151811061267557612675614b6e565b602002602001015190506126898c82613cc7565b90955093508461269b5761269b614b84565b8163ffffffff16846000015163ffffffff16146126ba576126ba614b84565b83602001518a8463ffffffff16815181106126d7576126d7614b6e565b60200260200101906001600160a01b031690816001600160a01b0316815250508360400151898463ffffffff168151811061271457612714614b6e565b602002602001019063ffffffff16908163ffffffff16815250508360800151888463ffffffff168151811061274b5761274b614b6e565b60200260200101906001600160801b031690816001600160801b03168152505050508061277790614d1c565b9050612628565b50505050509250925092565b606060006127ce8785858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b4792505050565b60608101519091506000806127e48a848b613946565b915091506000816040015182602001516127fe9190614997565b6001600160801b03169050801561284457600061281e6105bb838c614b4c565b90506128428c868d87878689600001516128389190614997565b8c60a001516139a5565b505b87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929e9d5050505050505050505050505050565b60008060008060008060006128b8604080516060810182526000808252602082018190529181019190915290565b6128c06142a9565b6128ca8b8b613cc7565b9094509050836128ed5760405163016d919360e71b815260040160405180910390fd5b80602001519850806040015197506129058989613538565b92506129118b8461359f565b90945091508361292357612923614b84565b8051608082015163ffffffff9182169091141597509550866129795780608001516001600160801b03168160600151836000015161296191906149be565b6001600160801b03166129749190614b35565b61297c565b60005b9450505050509295509295909350565b606060006129d08685858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b4792505050565b606081015190915060006129e48288613538565b90506129f08882613f33565b15612a0e57604051635c02a51760e01b815260040160405180910390fd5b876001600160a01b03166312a6a3f882612a5f604051806060016040528060006001600160801b0316815260200160006001600160801b0316815260200160006001600160801b0316815250613059565b6040518363ffffffff1660e01b8152600401612a7c92919061497e565b600060405180830381600087803b158015612a9657600080fd5b505af1158015612aaa573d6000803e3d6000fd5b505050508663ffffffff16826001600160a01b0316896001600160a01b03167f01ab8663165edfb7390d9e5f75d960a66dacf4f01fa9787e3a731c870d0da9218660a00151604051612afc9190614493565b60405180910390a485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929b9a5050505050505050505050565b612b4f6142d7565b336001600160a01b0316836001600160a01b03166320bc44256040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbb9190614d4a565b6001600160a01b031614612c055760405162461bcd60e51b81526020600482015260116024820152701d5b985d5d1a1bdc9a5e9959081a1bdcdd607a1b60448201526064016118f6565b604051632fd0a1cd60e21b8152339063bf42873490612c28908590600401614493565b602060405180830381865afa158015612c45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c699190614d77565b612ca35760405162461bcd60e51b815260206004820152600b60248201526a0d2dcecc2d8d2c840c6e8f60ab1b60448201526064016118f6565b604051631fb6491d60e11b81523390633f6c923a90612cc6908590600401614493565b600060405180830381865afa158015612ce3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612d0b9190810190614e1e565b90505b92915050565b6040805160608101825260008082526020820181905291810182905281906000612d3c6142a9565b6000612d488a89613538565b9550612d548987613fdf565b9450612d608b8761359f565b9450905080612d825760405163edeaa63b60e01b815260040160405180910390fd5b612d8c8b86613cc7565b90935091508615612df95782612db55760405163016d919360e71b815260040160405180910390fd5b896001600160a01b031682602001516001600160a01b031614612dda57612dda614b84565b8763ffffffff16826040015163ffffffff1614612df957612df9614b84565b509550955095509550959050565b612e0f61426e565b6001600160a01b0394851681529290931660208301526040820152606081019190915290565b6020820151604051633e7d48bd60e21b81526001600160a01b03909116600482015260609060009081908190339063f9f522f490602401606060405180830381865afa158015612e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ead9190614f24565b91945092509050828015612ebf575081155b15612fe3576000612ed08688614020565b90508660c001518216600003612fd5576000612eef8860c0015161409e565b88516040808b015160608c015182516000815260208101909352612f1b93923092919060448101614f60565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031990951694909417909352918a015160c08b01519251633a020f0160e11b815291935033926374041e0292612f8a9291869164100000000091909114908890600401614fa5565b6000604051808303816000875af1158015612fa9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612fd19190810190614fee565b9550505b612fe0866000614135565b50505b50505092915050565b60006001600160801b038211156130555760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b60648201526084016118f6565b5090565b604080516002808252606080830184529260208301908036833701905050905081600001516001600160801b0316600160801b1760001b816000815181106130a3576130a3614b6e565b602002602001018181525050608082604001516001600160801b0316901b82602001516001600160801b03161760001b816001815181106130e6576130e6614b6e565b602002602001018181525050919050565b6040805160028082526060808301845292602083019080368337019050509050816000015163ffffffff166020836040015163ffffffff16901b606084602001516001600160a01b0316901b171760001b8160008151811061315b5761315b614b6e565b602002602001018181525050608082608001516001600160801b0316901b82606001516001600160801b03161760001b816001815181106130e6576130e6614b6e565b806000036131ab57505050565b604051634b61cc3360e01b81526000906001600160a01b03851690634b61cc33906131e6903090879064010000000090600190600401614b9a565b600060405180830381865afa158015613203573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261322b9190810190614cc0565b9050816132548260008151811061324457613244614b6e565b602002602001015160001c61415d565b61325e9190614cf4565b60001b8160008151811061327457613274614b6e565b602090810291909101015260405163048620af60e11b81526001600160a01b0385169063090c415e906132b4908690640100000000908690600401615022565b600060405180830381600087803b1580156132ce57600080fd5b505af11580156132e2573d6000803e3d6000fd5b5050505050505050565b6132f46142d7565b6020840151604051633e7d48bd60e21b81526001600160a01b03909116600482015260609060009081908190339063f9f522f490602401606060405180830381865afa158015613348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061336c9190614f24565b88965091945092509050828015613381575081155b1561352d576133908489614020565b93508760c00151811660000361351b5760006133af8960c0015161409e565b89516040808c015160608d0151825160008152602081019093526133dd9392309291908e9060448101615049565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031990951694909417909352918b015160c08c0151925163079b42a160e21b81529193503392631e6d0a849261344c9291869164200000000091909114908b90600401614fa5565b6000604051808303816000875af115801561346b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526134939190810190614fee565b604051631fb6491d60e11b81529095503390633f6c923a906134b9908890600401614493565b600060405180830381865afa1580156134d6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526134fe9190810190614e1e565b955061351389608001518761010001516141c7565b610100870152505b61352a86866101000151614135565b93505b505050935093915050565b60405168383ab13634b9b432b960b91b60208201526bffffffffffffffffffffffff19606084901b1660298201526001600160e01b031960e083901b16603d8201526000906041015b60405160208183030381529060405280519060200120905092915050565b60408051606081018252600080825260208201819052918101829052604051636c2d9f2f60e01b815230600482015260248101849052600260448201526000906001600160a01b03861690636c2d9f2f90606401600060405180830381865afa158015613610573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526136389190810190614cc0565b905060008160008151811061364f5761364f614b6e565b602002602001015160001c905060008260018151811061367157613671614b6e565b602002602001015160001c905060008211945084156136a9576001600160801b03808316855281166020850152608081901c60408501525b5050509250929050565b604051631528e57f60e31b81526001600160a01b038085166004830152831660248201526000604482015263ffffffff8216606482015273__$0ca4325a4497c5d952bddb238e8b4ce961$__9063a9472bf89060840160006040518083038186803b15801561372157600080fd5b505af4158015613735573d6000803e3d6000fd5b50505050505050565b60006137687f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6001600160a01b0316036137be5760405162461bcd60e51b815260206004820152601d60248201527f5555505350726f786961626c653a206e6f742075706772616461626c6500000060448201526064016118f6565b806001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138209190614b1c565b61382861116c565b146138815760405162461bcd60e51b815260206004820152602360248201527f5555505350726f786961626c653a206e6f7420636f6d70617469626c65206c6f60448201526267696360e81b60648201526084016118f6565b6001600160a01b03811630036138d95760405162461bcd60e51b815260206004820152601960248201527f5555505350726f786961626c653a2070726f7879206c6f6f700000000000000060448201526064016118f6565b613901817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b7fe011bc04c286c344a8fcbb8de77f953da762c3e25d8cdea984147fc4168a5dcc61392a61116c565b604080519182526001600160a01b038416602083015201611960565b60408051606081018252600080825260208201819052918101829052600061396e8585613538565b925061397a868461359f565b925090508061399c5760405163edeaa63b60e01b815260040160405180910390fd5b50935093915050565b866001600160a01b031663cf97256d8785602001516001600160801b03168660000151866139d391906149be565b6001600160801b03166139e590614a0e565b6139ef91906149de565b6040518363ffffffff1660e01b8152600401613a0c929190614a2a565b600060405180830381600087803b158015613a2657600080fd5b505af1158015613a3a573d6000803e3d6000fd5b50505050613a74878785604001516001600160801b0316866000015186613a6191906149be565b6001600160801b03166108a191906149de565b82516001600160801b03831684526001600160a01b03881663a1b2bf8b86613a9b87613059565b6040518363ffffffff1660e01b8152600401613ab892919061497e565b600060405180830381600087803b158015613ad257600080fd5b505af1158015613ae6573d6000803e3d6000fd5b505050508563ffffffff16876001600160a01b0316896001600160a01b03167f81e37f3d9f16cbf29a62d6a1c21d79b23ef29b54124ec44af43a50fffb9304f3848789604001518a6020015189604051613b449594939291906150af565b60405180910390a46040516379359f6f60e01b81526001600160a01b0388811660048301528916906379359f6f90602401602060405180830381865afa158015613b92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bb69190614d77565b156132e2576040516316e759bb60e01b815260040160405180910390fd5b60608073__$0ca4325a4497c5d952bddb238e8b4ce961$__6306967a8c85856000600160801b6040518563ffffffff1660e01b8152600401613c199493929190614b9a565b600060405180830381865af4158015613c36573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613c5e91908101906150eb565b909250905060005b8151811015613cbf57613c9284838381518110613c8557613c85614b6e565b6020026020010151613fdf565b828281518110613ca457613ca4614b6e565b6020908102919091010152613cb8816151af565b9050613c66565b509250929050565b6000613cd16142a9565b604051636c2d9f2f60e01b815230600482015260248101849052600260448201526000906001600160a01b03861690636c2d9f2f90606401600060405180830381865afa158015613d26573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613d4e9190810190614cc0565b9050600081600081518110613d6557613d65614b6e565b602002602001015160001c9050600082600181518110613d8757613d87614b6e565b602002602001015160001c905060008211945084156136a957606082811c60208087019190915283901c63ffffffff9081166040870152831685526001600160801b03821690850152608081811c908501525050509250929050565b600080836001600160a01b0316634b61cc33308564010000000060016040518563ffffffff1660e01b8152600401613e1e9493929190614b9a565b600060405180830381865afa158015613e3b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613e639190810190614cc0565b905080600081518110613e7857613e78614b6e565b602002602001015160001c91505092915050565b604051630a32470160e41b81526001600160a01b03808516600483015283166024820152600060448201819052600160801b6064830152608482018390529073__$0ca4325a4497c5d952bddb238e8b4ce961$__9063a32470109060a401602060405180830381865af4158015613f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f2b91906151c8565b949350505050565b604051636c2d9f2f60e01b8152306004820152602481018290526002604482015260009081906001600160a01b03851690636c2d9f2f90606401600060405180830381865afa158015613f8a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613fb29190810190614cc0565b9050600081600081518110613fc957613fc9614b6e565b6020908102919091010151151595945050505050565b604080516b39bab139b1b934b83a34b7b760a11b6020820152606084811b6bffffffffffffffffffffffff1916602c83015291810183905260009101613581565b6020810151608082015160a08301518351604051630768fabb60e41b8152606094339463768fabb094614057948a946004016151e5565b6000604051808303816000875af1158015614076573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612d0b9190810190614fee565b600064010000000082036140ba57506330d9c91560e01b919050565b64040000000082036140d45750630221347d60e61b919050565b64100000000082036140ee5750635f9e7d7760e01b919050565b6402000000008203614108575063d86ed3e560e01b919050565b6408000000008203614122575063230dbd2960e01b919050565b506353c11f9960e01b919050565b919050565b604051634c4d861f60e11b8152606090339063989b0c3e90614057908690869060040161522a565b60006001600160ff1b038211156130555760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016118f6565b6000612d0b60006141e06141da8661415d565b856141e5565b6141fa565b60008183136141f45782612d0b565b50919050565b60008183136142095781612d0b565b5090919050565b6040805160c0810182526000808252602082018190529181019190915260608101614254604080516060810182526000808252602082018190529181019190915290565b81526020016142616142a9565b8152602001606081525090565b6040805160e0810182526000808252602082018190529181018290526060808201526080810182905260a0810182905260c081019190915290565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a082015260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b6001600160a01b038116811461113a57600080fd5b63ffffffff8116811461113a57600080fd5b80356001600160801b038116811461413057600080fd5b60008083601f84011261438257600080fd5b5081356001600160401b0381111561439957600080fd5b6020830191508360208285010111156143b157600080fd5b9250929050565b60008060008060008060a087890312156143d157600080fd5b86356143dc81614332565b955060208701356143ec81614347565b945060408701356143fc81614332565b935061440a60608801614359565b925060808701356001600160401b0381111561442557600080fd5b61443189828a01614370565b979a9699509497509295939492505050565b60005b8381101561445e578181015183820152602001614446565b50506000910152565b6000815180845261447f816020860160208601614443565b601f01601f19169290920160200192915050565b602081526000612d0b6020830184614467565b6000806000606084860312156144bb57600080fd5b83356144c681614332565b925060208401356144d681614332565b915060408401356144e681614347565b809150509250925092565b60008060008060008060a0878903121561450a57600080fd5b863561451581614332565b9550602087013561452581614332565b9450604087013561453581614347565b9350606087013561440a81614332565b60006020828403121561455757600080fd5b813561456281614332565b9392505050565b6000806000806080858703121561457f57600080fd5b843561458a81614332565b9350602085013561459a81614332565b925060408501356145aa81614347565b915060608501356145ba81614332565b939692955090935050565b6000806000806000608086880312156145dd57600080fd5b85356145e881614332565b945060208601356145f881614332565b9350604086013561460881614347565b925060608601356001600160401b0381111561462357600080fd5b61462f88828901614370565b969995985093965092949392505050565b60008060008060006080868803121561465857600080fd5b853561466381614332565b9450602086013561467381614347565b935061460860408701614359565b6000806000806080858703121561469757600080fd5b84356146a281614332565b935060208501356146b281614332565b925060408501356146c281614347565b9396929550929360600135925050565b6000806000606084860312156146e757600080fd5b83356146f281614332565b9250602084013561470281614332565b929592945050506040919091013590565b6000806040838503121561472657600080fd5b823561473181614332565b9150602083013561474181614332565b809150509250929050565b600081518084526020808501945080840160005b838110156147855781516001600160801b031687529582019590820190600101614760565b509495945050505050565b606080825284519082018190526000906020906080840190828801845b828110156147d25781516001600160a01b0316845292840192908401906001016147ad565b5050508381038285015285518082528683019183019060005b8181101561480d57835163ffffffff16835292840192918401916001016147eb565b50508481036040860152614821818761474c565b98975050505050505050565b60008060008060006080868803121561484557600080fd5b853561485081614332565b9450602086013561486081614347565b93506040860135925060608601356001600160401b0381111561462357600080fd5b6000806040838503121561489557600080fd5b82356148a081614332565b946020939093013593505050565b600080600080606085870312156148c457600080fd5b84356148cf81614332565b935060208501356148df81614347565b925060408501356001600160401b038111156148fa57600080fd5b61490687828801614370565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b80820180821115612d0e57612d0e614912565b81810381811115612d0e57612d0e614912565b600081518084526020808501945080840160005b8381101561478557815187529582019590820190600101614962565b828152604060208201526000613f2b604083018461494e565b6001600160801b038181168382160190808211156149b7576149b7614912565b5092915050565b6001600160801b038281168282160390808211156149b7576149b7614912565b80820260008212600160ff1b841416156149fa576149fa614912565b8181058314821517612d0e57612d0e614912565b6000600160ff1b8201614a2357614a23614912565b5060000390565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03841681526001600160801b0383166020820152606060408201819052600090614a7690830184614467565b95945050505050565b6001600160a01b038516815263ffffffff841660208201526001600160801b0383166040820152608060608201819052600090614abe90830184614467565b9695505050505050565b6001600160a01b0383168152604060208201819052600090613f2b90830184614467565b6001600160a01b038416815263ffffffff83166020820152606060408201819052600090614a7690830184614467565b600060208284031215614b2e57600080fd5b5051919050565b8082028115828204841417612d0e57612d0e614912565b600082614b6957634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b0381118282101715614bfc57614bfc614bc3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c2a57614c2a614bc3565b604052919050565b60006001600160401b03821115614c4b57614c4b614bc3565b5060051b60200190565b600082601f830112614c6657600080fd5b81516020614c7b614c7683614c32565b614c02565b82815260059290921b84018101918181019086841115614c9a57600080fd5b8286015b84811015614cb55780518352918301918301614c9e565b509695505050505050565b600060208284031215614cd257600080fd5b81516001600160401b03811115614ce857600080fd5b613f2b84828501614c55565b8082018281126000831280158216821582161715614d1457614d14614912565b505092915050565b600063ffffffff808316818103614d3557614d35614912565b6001019392505050565b805161413081614332565b600060208284031215614d5c57600080fd5b815161456281614332565b8051801515811461413057600080fd5b600060208284031215614d8957600080fd5b612d0b82614d67565b805160ff8116811461413057600080fd5b80516001600160e01b03198116811461413057600080fd5b600082601f830112614dcc57600080fd5b81516001600160401b03811115614de557614de5614bc3565b614df8601f8201601f1916602001614c02565b818152846020838601011115614e0d57600080fd5b613f2b826020830160208701614443565b600060208284031215614e3057600080fd5b81516001600160401b0380821115614e4757600080fd5b908301906101608286031215614e5c57600080fd5b614e64614bd9565b614e6d83614d92565b8152614e7b60208401614d92565b602082015260408301516040820152614e9660608401614d3f565b6060820152614ea760808401614da3565b608082015260a083015182811115614ebe57600080fd5b614eca87828601614dbb565b60a08301525060c083015160c082015260e083015160e0820152610100915081830151828201526101209150614f01828401614d3f565b828201526101409150614f15828401614d3f565b91810191909152949350505050565b600080600060608486031215614f3957600080fd5b614f4284614d67565b9250614f5060208501614d67565b9150604084015190509250925092565b6001600160a01b038681168252851660208201526040810184905260a060608201819052600090614f9390830185614467565b82810360808401526148218185614467565b6001600160a01b0385168152608060208201819052600090614fc990830186614467565b84151560408401528281036060840152614fe38185614467565b979650505050505050565b60006020828403121561500057600080fd5b81516001600160401b0381111561501657600080fd5b613f2b84828501614dbb565b60018060a01b0384168152826020820152606060408201526000614a76606083018461494e565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061507c90830186614467565b828103608084015261508e8186614467565b905082810360a08401526150a28185614467565b9998505050505050505050565b60006001600160801b0380881683528087166020840152808616604084015280851660608401525060a06080830152614fe360a0830184614467565b600080604083850312156150fe57600080fd5b82516001600160401b038082111561511557600080fd5b818501915085601f83011261512957600080fd5b81516020615139614c7683614c32565b82815260059290921b8401810191818101908984111561515857600080fd5b948201945b8386101561517f57855161517081614347565b8252948201949082019061515d565b9188015191965090935050508082111561519857600080fd5b506151a585828601614c55565b9150509250929050565b6000600182016151c1576151c1614912565b5060010190565b6000602082840312156151da57600080fd5b815161456281614347565b60a0815260006151f860a0830188614467565b6001600160a01b0396871660208401526040830195909552506060810192909252909216608090920191909152919050565b60408152600061523d6040830185614467565b9050826020830152939250505056fea2646970667358221220b170a39f1f43d5696bdd663f44ee9f00c23deec081aeaecc754fa62b0f6c7b3264736f6c63430008130033
## SuperfluidFrameworkDeployer
	uses: ['SuperfluidCFAv1DeployerLibrary', 'TokenDeployerLibrary', 'SuperfluidNFTLogicDeployerLibrary', 'SuperTokenDeployerLibrary', 'SuperfluidHostDeployerLibrary', 'SuperfluidIDAv1DeployerLibrary', 'ProxyDeployerLibrary', 'CFAv1ForwarderDeployerLibrary', 'IDAv1ForwarderDeployerLibrary', 'SuperfluidLoaderDeployerLibrary', 'SuperfluidPeripheryDeployerLibrary', 'SuperfluidGovDeployerLibrary']
	runtime bytecode: 60806040523480156200001157600080fd5b5060043610620001695760003560e01c806376f30be811620000d3578063b3083cf81162000086578063b3083cf81462000225578063c8c25ad51462000310578063cbcd74491462000320578063dfa98ad51462000337578063f2fde38b146200046c578063fa0215fc146200048357600080fd5b806376f30be8146200028c5780637dc2dc121462000296578063888a37b114620002ce57806393786bf014620002d9578063acbeaa0714620002e2578063ad6eb49914620002f957600080fd5b80633df285fe116200012c5780633df285fe14620001db5780634d59c136146200021b578063520994701462000225578063547047c7146200023f57806362a32e1e14620002495780637296cb5a146200027557600080fd5b806305bfa3e0146200016e57806306e83586146200018b5780631903410d14620001975780632a49664814620001c757806338bc37a414620001d1575b600080fd5b6200017861070881565b6040519081526020015b60405180910390f35b620001956200049a565b005b620001ae620001a83660046200298d565b620004a6565b6040516001600160a01b03909116815260200162000182565b62000195620004d1565b62000195620004db565b6200020c6040518060400160405280601181526020017039bab832b93a37b5b2b739973a32b9ba1760791b81525081565b604051620001829190620029fb565b6200017861384081565b6200022e600081565b604051901515815260200162000182565b62000195620004fe565b6200020c6040518060400160405280600c81526020016b3a37b5b2b739973a32b9ba1760a11b81525081565b620001956200028636600462002b65565b6200051c565b6200019562000527565b620002ad620002a736600462002c92565b620005c8565b604080516001600160a01b0393841681529290911660208301520162000182565b6200017862093a8081565b620001ae604581565b62000195620002f336600462002d24565b62000918565b620001956200030a36600462002b65565b62000923565b6040516008815260200162000182565b620001ae6200033136600462002d42565b6200092e565b6200045d604080516101608101825260008082526020808301829052828401829052835180850185528281528082018390526060840152608083018290528351808501909452818452830181905260a082019290925260c0810182905260e08101829052610100810182905261012081018290526101408101919091525060408051610160810182526001546001600160a01b03610100918290048116835260025481166020808501829052600354831685870181905286518088018852838152808301919091526060860152600554831660808601819052865180880190975291865285015260a0830193909352600c54831660c0830152600e54831660e0830152600f54831690820152601054821661012082015260115490911661014082015290565b60405162000182919062002db5565b620001956200047d36600462002ee5565b62000b3e565b620001ae6200049436600462002f05565b62000ba8565b620004a462000e25565b565b60008181548110620004b757600080fd5b6000918252602090912001546001600160a01b0316905081565b620004a462000e63565b620004e562002927565b6001815260006020820152620004fb8162000eab565b50565b6200050862002927565b62093a8060c0820152620004fb8162000eca565b620004fb8162000eca565b6040805160e08101825260008082526020808301829052815484518183028101830186528181529294840192918591908301828280156200059257602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162000573575b5050509183525050604560208201526138406040820152610708606082015262093a806080909101529050620004fb8162000fbf565b600c5460009081906001600160a01b0316620005f757604051635006ee6d60e11b815260040160405180910390fd5b731820a4b7618bde71dce8cdc73aab6c95905fad243b6200062a57604051622b682760e71b815260040160405180910390fd5b6040516302a510b960e61b815273__$89775cdd39a3bf6782bb7d0b41e5f2a8cf$__9063a9442e40906200066d908b908b908b908b908b908b9060040162002fa9565b602060405180830381865af41580156200068b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006b1919062002fed565b915060008686604051602001620006ca9291906200300d565b60408051601f1981840301815290829052600c549092506001600160a01b03169063431f148190859060019062000708908c908c9060200162003023565b604051602081830303815290604052856040518563ffffffff1660e01b815260040162000739949392919062003045565b6020604051808303816000875af115801562000759573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200077f919062002fed565b915060006040518060400160405280600c81526020016b3a37b5b2b739973a32b9ba1760a11b815250846001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620007e7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620008119190810190620030a2565b6040516020016200082492919062003141565b6040516020818303038152906040529050620008436001828662001043565b60006040518060400160405280601181526020017039bab832b93a37b5b2b739973a32b9ba1760791b815250846001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620008ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620008d89190810190620030a2565b604051602001620008eb92919062003141565b60405160208183030381529060405290506200090a6001828662001043565b505050965096945050505050565b620004fb81620010e2565b620004fb8162000eab565b600c546000906001600160a01b03166200095b57604051635006ee6d60e11b815260040160405180910390fd5b731820a4b7618bde71dce8cdc73aab6c95905fad243b6200098e57604051622b682760e71b815260040160405180910390fd5b600073__$89775cdd39a3bf6782bb7d0b41e5f2a8cf$__63f7c3bdc96040518163ffffffff1660e01b8152600401602060405180830381865af4158015620009da573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a00919062002fed565b600c54604051633504b4d160e21b81526001600160a01b03808416600483015292945084935091169063d412d34490602401600060405180830381600087803b15801562000a4d57600080fd5b505af115801562000a62573d6000803e3d6000fd5b50506040516285fc1360e71b81526001600160a01b03851692506342fe0980915062000a9f906000906012908b908b908b908b9060040162003174565b600060405180830381600087803b15801562000aba57600080fd5b505af115801562000acf573d6000803e3d6000fd5b5050505060006040518060400160405280601181526020017039bab832b93a37b5b2b739973a32b9ba1760791b815250858560405160200162000b1593929190620031c6565b604051602081830303815290604052905062000b346001828562001043565b5050949350505050565b60015460405163f2fde38b60e01b81526001600160a01b0383811660048301526101009092049091169063f2fde38b90602401600060405180830381600087803b15801562000b8c57600080fd5b505af115801562000ba1573d6000803e3d6000fd5b5050505050565b600c546000906001600160a01b031662000bd557604051635006ee6d60e11b815260040160405180910390fd5b731820a4b7618bde71dce8cdc73aab6c95905fad243b62000c0857604051622b682760e71b815260040160405180910390fd5b600073__$89775cdd39a3bf6782bb7d0b41e5f2a8cf$__631f2d18966040518163ffffffff1660e01b8152600401602060405180830381865af415801562000c54573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c7a919062002fed565b600c54604051633504b4d160e21b81526001600160a01b03808416600483015292935091169063d412d34490602401600060405180830381600087803b15801562000cc457600080fd5b505af115801562000cd9573d6000803e3d6000fd5b505060405163588ca48760e11b81526001600160a01b038416925063b119490e915062000d13908a908a908a908a908a90600401620031f0565b600060405180830381600087803b15801562000d2e57600080fd5b505af115801562000d43573d6000803e3d6000fd5b5050505080915062000da660016040518060400160405280601181526020017039bab832b93a37b5b2b739973a32b9ba1760791b815250878760405160200162000d9093929190620031c6565b6040516020818303038152906040528462001043565b60405163a9059cbb60e01b8152336004820152602481018490526001600160a01b0383169063a9059cbb906044016020604051808303816000875af115801562000df4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000e1a91906200322e565b505095945050505050565b6002546001600160a01b031662000e4f57604051633b8034db60e11b815260040160405180910390fd5b62000e59620012ba565b620004a46200135f565b6002546001600160a01b031662000e8d5760405163bb57a2c760e01b815260040160405180910390fd5b62000e9762001404565b62000ea16200190e565b620004a4620019ca565b62000eb63062001a91565b620004fb8160000151826020015162001b93565b6002546001600160a01b031662000ef45760405163608e9db560e01b815260040160405180910390fd5b62000eff3062001c37565b62000f0962001cd9565b600e54604051637048027560e01b81523360048201526001600160a01b0390911690637048027590602401600060405180830381600087803b15801562000f4f57600080fd5b505af115801562000f64573d6000803e3d6000fd5b5050505062000f7262001d7e565b62000f7c62001e23565b62000f8b8160c0015162001ec6565b6003546001600160a01b031662000fb5576040516302a9c2c560e61b815260040160405180910390fd5b620004fb62001f05565b62000fca8162000eab565b62000fd462001f80565b62000ff2816060015182608001518360a00151846040015162001feb565b62000ffc62000e25565b6200100662002068565b6200101062000e63565b6200101a62002348565b620010258162000eca565b6200102f62002496565b62001039620024e2565b620004fb6200252e565b600e546001600160a01b03166200106d5760405163521c4a7d60e01b815260040160405180910390fd5b8215620010dd57600e5460405163a815ff1560e01b81526001600160a01b039091169063a815ff1590620010a890859085906004016200324e565b600060405180830381600087803b158015620010c357600080fd5b505af1158015620010d8573d6000803e3d6000fd5b505050505b505050565b60015460ff828116911614620011305760405162461bcd60e51b815260206004820152600e60248201526d0496e636f727265637420737465760941b60448201526064015b60405180910390fd5b8060ff166000036200114d57620011473062001a91565b62001289565b8060ff1660010362001167576200114760016000620027c4565b8060ff166002036200117d57620011476200284d565b8060ff166003036200119d576200119362002861565b6200114762002875565b600460ff82161462001289578060ff16600503620011bf576200114762001404565b8060ff16600603620011d5576200114762002889565b8060ff166007036200125157620011ec306200289d565b600e54604051637048027560e01b81523360048201526001600160a01b0390911690637048027590602401600060405180830381600087803b1580156200123257600080fd5b505af115801562001247573d6000803e3d6000fd5b5050505062001289565b60405162461bcd60e51b815260206004820152600c60248201526b0496e76616c696420737465760a41b604482015260640162001127565b6001805460ff169060006200129e836200327a565b91906101000a81548160ff021916908360ff1602179055505050565b600254604051630dbabbff60e11b81526001600160a01b03909116600482015273__$100e900eead8761f703396da9adb9d02fb$__90631b7577fe90602401602060405180830381865af415801562001317573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200133d919062002fed565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b600254604051630cce0ce360e31b81526001600160a01b03909116600482015273__$19e05bb61541bb47e59f1d01c8fc474939$__90636670671890602401602060405180830381865af4158015620013bc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620013e2919062002fed565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b600073__$a8dc14dd180b6fc11141960b4b3fcd72ee$__63c465e06c6040518163ffffffff1660e01b8152600401602060405180830381865af415801562001450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001476919062002fed565b9050600073__$a8dc14dd180b6fc11141960b4b3fcd72ee$__63c465e06c6040518163ffffffff1660e01b8152600401602060405180830381865af4158015620014c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620014ea919062002fed565b600254604051635e1673bb60e11b81526001600160a01b039182166004820152908216602482015290915073__$29bfd6d2f1b844495450d685faea9e543e$__9063bc2ce77690604401602060405180830381865af415801562001552573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001578919062002fed565b600780546001600160a01b0319166001600160a01b039290921691821790556040805163132075a760e31b81529051639903ad389160048082019260009290919082900301818387803b158015620015cf57600080fd5b505af1158015620015e4573d6000803e3d6000fd5b50506002546040516326c043d360e11b81526001600160a01b039182166004820152908516602482015273__$29bfd6d2f1b844495450d685faea9e543e$__9250634d8087a69150604401602060405180830381865af41580156200164d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001673919062002fed565b600880546001600160a01b0319166001600160a01b039290921691821790556040805163132075a760e31b81529051639903ad389160048082019260009290919082900301818387803b158015620016ca57600080fd5b505af1158015620016df573d6000803e3d6000fd5b5050600754604051634a0687ef60e01b81526001600160a01b0391821660048201529085169250634a0687ef9150602401600060405180830381600087803b1580156200172b57600080fd5b505af115801562001740573d6000803e3d6000fd5b5050600854604051634a0687ef60e01b81526001600160a01b0391821660048201529084169250634a0687ef9150602401600060405180830381600087803b1580156200178c57600080fd5b505af1158015620017a1573d6000803e3d6000fd5b50506040805163266c45bb60e11b81526004810191909152601460448201527310dbdb9cdd185b9d0813dd5d199b1bddc813919560621b606482015260806024820152600360848201526221a7a360e91b60a48201526001600160a01b0385169250634cd88b76915060c401600060405180830381600087803b1580156200182857600080fd5b505af11580156200183d573d6000803e3d6000fd5b50506040805163266c45bb60e11b81526004810191909152601360448201527210dbdb9cdd185b9d08125b999b1bddc8139195606a1b606482015260806024820152600360848201526221a4a360e91b60a48201526001600160a01b0384169250634cd88b76915060c401600060405180830381600087803b158015620018c357600080fd5b505af1158015620018d8573d6000803e3d6000fd5b5050600980546001600160a01b039586166001600160a01b031991821617909155600a8054949095169316929092179092555050565b600254600954600a54604051630e07777960e31b81526001600160a01b039384166004820152918316602483015291909116604482015273__$5b3c2c3af32bb84e8dfcf888ba6e793ada$__9063703bbbc890606401602060405180830381865af415801562001982573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620019a8919062002fed565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600254600b54600754600854604051630243059d60e01b81526001600160a01b0394851660048201529284166024840152908316604483015291909116606482015273__$8feb492d5ab16bc1ab1a47e3c40c7b6b72$__90630243059d90608401602060405180830381865af415801562001a49573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a6f919062002fed565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b73__$a87cd658f18cfcfcaadd744da84b7b2d3a$__63c3acf1b36040518163ffffffff1660e01b8152600401602060405180830381865af415801562001adb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001b01919062002fed565b60018054610100600160a81b0319166101006001600160a01b0393841681029190911791829055604051633f5b172b60e11b8152910482166004820152908216602482015273__$a87cd658f18cfcfcaadd744da84b7b2d3a$__90637eb62e569060440160006040518083038186803b15801562001b7e57600080fd5b505af415801562000ba1573d6000803e3d6000fd5b604051638a25422160e01b81528215156004820152811515602482015273__$8c2e45707028db74379ce75cf7ce73f00c$__90638a25422190604401602060405180830381865af415801562001bed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001c13919062002fed565b600280546001600160a01b0319166001600160a01b03929092169190911790555050565b604051632f0f279d60e01b81526001600160a01b038216600482015273__$8feb492d5ab16bc1ab1a47e3c40c7b6b72$__90632f0f279d90602401602060405180830381865af415801562001c90573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001cb6919062002fed565b600e80546001600160a01b0319166001600160a01b039290921691909117905550565b600e54604051630b5bd8c560e01b81526001600160a01b03909116600482015273__$c019f7d2e8192ab61753db9130e1c2a9cc$__90630b5bd8c590602401602060405180830381865af415801562001d36573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001d5c919062002fed565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b60025460405163269c683160e11b81526001600160a01b03909116600482015273__$4ee71b956ec4d3c70a32eaf0cf2f7fe5ff$__90634d38d06290602401602060405180830381865af415801562001ddb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001e01919062002fed565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b600254604051623b2bcd60e01b81526001600160a01b03909116600482015273__$427843469579e60d1d63eed3ffc26a7f39$__90623b2bcd90602401602060405180830381865af415801562001e7e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001ea4919062002fed565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b731820a4b7618bde71dce8cdc73aab6c95905fad243b62001efa57604051630c9b12e760e01b815260040160405180910390fd5b620004fb81620028b2565b6002546003546040516001600160a01b03928316929091169062001f299062002971565b6001600160a01b03928316815291166020820152604001604051809103906000f08015801562001f5d573d6000803e3d6000fd5b50601280546001600160a01b0319166001600160a01b0392909216919091179055565b60025460015460405163189acdbd60e31b81526001600160a01b036101009092048216600482015291169063c4d66de8906024015b600060405180830381600087803b15801562001fd057600080fd5b505af115801562001fe5573d6000803e3d6000fd5b50505050565b600154600254604051630b520f0360e31b81526001600160a01b03610100909304831692635a907818926200202e929116908890889088908890600401620032ee565b600060405180830381600087803b1580156200204957600080fd5b505af11580156200205e573d6000803e3d6000fd5b5050505050505050565b6001546002546004805460405163cadf8f8560e01b81526001600160a01b039384169281019290925282166024820152610100909204169063cadf8f8590604401600060405180830381600087803b158015620020c457600080fd5b505af1158015620020d9573d6000803e3d6000fd5b50506002546004805460408051633b982ccf60e11b815290516001600160a01b03948516965063b6d200de95509390911692637730599e928281019260209291908290030181865afa15801562002134573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200215a91906200332a565b6040518263ffffffff1660e01b81526004016200217991815260200190565b602060405180830381865afa15801562002197573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620021bd919062002fed565b600380546001600160a01b0319166001600160a01b0392831617905560015460025460065460405163cadf8f8560e01b81529184166004830152831660248201526101009091049091169063cadf8f8590604401600060405180830381600087803b1580156200222c57600080fd5b505af115801562002241573d6000803e3d6000fd5b505060025460065460408051633b982ccf60e11b815290516001600160a01b03938416955063b6d200de94509190921691637730599e9160048083019260209291908290030181865afa1580156200229d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022c391906200332a565b6040518263ffffffff1660e01b8152600401620022e291815260200190565b602060405180830381865afa15801562002300573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002326919062002fed565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001546002546001600160a01b0361010090920482169163427942a4911660008060405190808252806020026020018201604052801562002393578160200160208202803683370190505b50600d546040516001600160e01b031960e087901b168152620023c6949392916001600160a01b03169060040162003344565b600060405180830381600087803b158015620023e157600080fd5b505af1158015620023f6573d6000803e3d6000fd5b50505050600260009054906101000a90046001600160a01b03166001600160a01b031663731aed6e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200244e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002474919062002fed565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001546002546010546040516355c2378d60e11b81526001600160a01b039283166004820152600060248201529082166044820152610100909204169063ab846f1a9060640162001fb5565b6001546002546011546040516355c2378d60e11b81526001600160a01b039283166004820152600060248201529082166044820152610100909204169063ab846f1a9060640162001fb5565b600e546001546040805163a815ff1560e01b81526004810191909152601360448201527215195cdd11dbdd995c9b985b98d94b9d195cdd606a1b60648201526001600160a01b036101009092048216602482015291169063a815ff1590608401600060405180830381600087803b158015620025a957600080fd5b505af1158015620025be573d6000803e3d6000fd5b5050600e546002546040805163a815ff1560e01b81526004810191909152600f60448201526e14dd5c195c999b1d5a590b9d195cdd608a1b60648201526001600160a01b0391821660248201529116925063a815ff159150608401600060405180830381600087803b1580156200263457600080fd5b505af115801562002649573d6000803e3d6000fd5b5050600e54600f546040805163a815ff1560e01b8152600481019190915260136044820152725375706572666c7569644c6f616465722d763160681b60648201526001600160a01b0391821660248201529116925063a815ff159150608401600060405180830381600087803b158015620026c357600080fd5b505af1158015620026d8573d6000803e3d6000fd5b5050600e80546010546040805163a815ff1560e01b8152600481019190915260448101939093526d21a320bb18a337b93bb0b93232b960911b60648401526001600160a01b03908116602484015216925063a815ff159150608401600060405180830381600087803b1580156200274e57600080fd5b505af115801562002763573d6000803e3d6000fd5b5050600e80546011546040805163a815ff1560e01b8152600481019190915260448101939093526d24a220bb18a337b93bb0b93232b960911b60648401526001600160a01b03908116602484015216925063a815ff15915060840162001fb5565b620027d0828262001b93565b620027da62001f80565b62002849604561384061070860008054806020026020016040519081016040528092919081815260200182805480156200283e57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116200281f575b505050505062001feb565b5050565b6200285762000e4f565b620004a462002068565b6200286b62001d7e565b620004a462002496565b6200287f62001e23565b620004a4620024e2565b6200289362000e97565b620004a462002348565b620028a88162001c37565b6200103962001cd9565b6002546040516001600160a01b03909116908290620028d1906200297f565b6001600160a01b0390921682526020820152604001604051809103906000f08015801562002903573d6000803e3d6000fd5b50601380546001600160a01b0319166001600160a01b039290921691909117905550565b6040518060e001604052806000151581526020016000151581526020016060815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b6109d8806200338583390190565b6118338062003d5d83390190565b600060208284031215620029a057600080fd5b5035919050565b60005b83811015620029c4578181015183820152602001620029aa565b50506000910152565b60008151808452620029e7816020860160208601620029a7565b601f01601f19169290920160200192915050565b60208152600062002a106020830184620029cd565b9392505050565b634e487b7160e01b600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171562002a535762002a5362002a17565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171562002a855762002a8562002a17565b604052919050565b8015158114620004fb57600080fd5b803562002aa98162002a8d565b919050565b6001600160a01b0381168114620004fb57600080fd5b803562002aa98162002aae565b600082601f83011262002ae357600080fd5b8135602067ffffffffffffffff82111562002b025762002b0262002a17565b8160051b62002b1382820162002a59565b928352848101820192828101908785111562002b2e57600080fd5b83870192505b8483101562002b5a57823562002b4a8162002aae565b8252918301919083019062002b34565b979650505050505050565b60006020828403121562002b7857600080fd5b813567ffffffffffffffff8082111562002b9157600080fd5b9083019060e0828603121562002ba657600080fd5b62002bb062002a2d565b62002bbb8362002a9c565b815262002bcb6020840162002a9c565b602082015260408301358281111562002be357600080fd5b62002bf18782860162002ad1565b60408301525062002c056060840162002ac4565b60608201526080830135608082015260a083013560a082015260c083013560c082015280935050505092915050565b60008083601f84011262002c4757600080fd5b50813567ffffffffffffffff81111562002c6057600080fd5b60208301915083602082850101111562002c7957600080fd5b9250929050565b803560ff8116811462002aa957600080fd5b6000806000806000806080878903121562002cac57600080fd5b863567ffffffffffffffff8082111562002cc557600080fd5b62002cd38a838b0162002c34565b9098509650602089013591508082111562002ced57600080fd5b5062002cfc89828a0162002c34565b909550935062002d1190506040880162002c80565b9150606087013590509295509295509295565b60006020828403121562002d3757600080fd5b62002a108262002c80565b6000806000806040858703121562002d5957600080fd5b843567ffffffffffffffff8082111562002d7257600080fd5b62002d808883890162002c34565b9096509450602087013591508082111562002d9a57600080fd5b5062002da98782880162002c34565b95989497509550505050565b81516001600160a01b031681526101a08101602083015162002de260208401826001600160a01b03169052565b50604083015162002dfe60408401826001600160a01b03169052565b50606083015162002e28606084018280516001600160a01b03908116835260209182015116910152565b5060808301516001600160a01b03811660a08401525060a083015180516001600160a01b0390811660c085015260208201511660e08401525060c083015161010062002e7e818501836001600160a01b03169052565b60e0850151915061012062002e9d818601846001600160a01b03169052565b9085015191506101409062002ebc858301846001600160a01b03169052565b8501516001600160a01b0390811661016086015294015190931661018090920191909152919050565b60006020828403121562002ef857600080fd5b813562002a108162002aae565b60008060008060006060868803121562002f1e57600080fd5b853567ffffffffffffffff8082111562002f3757600080fd5b62002f4589838a0162002c34565b9097509550602088013591508082111562002f5f57600080fd5b5062002f6e8882890162002c34565b96999598509660400135949350505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60808152600062002fbf60808301888a62002f80565b828103602084015262002fd481878962002f80565b60ff959095166040840152505060600152949350505050565b6000602082840312156200300057600080fd5b815162002a108162002aae565b81838237600f60fb1b9101908152600101919050565b65029bab832b9160d51b81528183600683013760009101600601908152919050565b6001600160a01b03851681526000600385106200307257634e487b7160e01b600052602160045260246000fd5b846020830152608060408301526200308e6080830185620029cd565b828103606084015262002b5a8185620029cd565b600060208284031215620030b557600080fd5b815167ffffffffffffffff80821115620030ce57600080fd5b818401915084601f830112620030e357600080fd5b815181811115620030f857620030f862002a17565b6200310d601f8201601f191660200162002a59565b91508082528560208285010111156200312557600080fd5b62003138816020840160208601620029a7565b50949350505050565b6000835162003155818460208801620029a7565b8351908301906200316b818360208801620029a7565b01949350505050565b6001600160a01b038716815260ff86166020820152608060408201819052600090620031a4908301868862002f80565b8281036060840152620031b981858762002f80565b9998505050505050505050565b60008451620031da818460208901620029a7565b8201838582376000930192835250909392505050565b6060815260006200320660608301878962002f80565b82810360208401526200321b81868862002f80565b9150508260408301529695505050505050565b6000602082840312156200324157600080fd5b815162002a108162002a8d565b604081526000620032636040830185620029cd565b905060018060a01b03831660208301529392505050565b600060ff821660ff81036200329f57634e487b7160e01b600052601160045260246000fd5b60010192915050565b600081518084526020808501945080840160005b83811015620032e35781516001600160a01b031687529582019590820190600101620032bc565b509495945050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009062002b5a90830184620032a8565b6000602082840312156200333d57600080fd5b5051919050565b600060018060a01b038087168352808616602084015260806040840152620033706080840186620032a8565b91508084166060840152509594505050505056fe60c060405234801561001057600080fd5b506040516109d83803806109d883398101604081905261002f91610062565b6001600160a01b039182166080521660a052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516108f76100e16000396000818160560152818161012b015281816103c401526103e501526000818160c10152818160ff0152818161036b015261039501526108f76000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80631054df8c146100515780638dc7d29c146100945780638f95895f146100a9578063f437bc59146100bc575b600080fd5b6100787f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100a76100a236600461065e565b6100e3565b005b6100a76100b73660046106ed565b61033d565b6100787f000000000000000000000000000000000000000000000000000000000000000081565b6040805160008082526020820190925281906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169182916339255d5b917f00000000000000000000000000000000000000000000000000000000000000009182169063b4b333c690610167908c908c908c90604481016107be565b60408051601f19818403018152918152602080830180516001600160e01b031660e09590951b9490941790935280516000815292830190526101af93925090604481016107fc565b60408051601f198184030181529181526020820180516001600160e01b031660e09490941b9390931790925290516101e79250610832565b6000604051808303816000865af19150503d8060008114610224576040519150601f19603f3d011682016040523d82523d6000602084013e610229565b606091505b50915091508161024957805160000361024157600080fd5b805181602001fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa158015610290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b4919061084e565b90508015610335576040516323b872dd60e01b8152306004820152336024820152604481018290526001600160a01b038716906323b872dd906064016020604051808303816000875af115801561030f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103339190610867565b505b505050505050565b8281811461035e5760405163277c943f60e21b815260040160405180910390fd5b60005b8181101561054d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166339255d5b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b4b333c68c8c8c8981811061042557610425610890565b905060200201602081019061043a91906108a6565b8b8b8a81811061044c5761044c610890565b905060200201602081019061046191906108a6565b60408051600081526020810190915261048093929190604481016107be565b60408051601f19818403018152918152602080830180516001600160e01b031660e09590951b9490941790935280516000815292830190526104c893925090604481016107fc565b60408051601f198184030181529181526020820180516001600160e01b031660e09490941b9390931790925290516105009250610832565b6000604051808303816000865af19150503d806000811461053d576040519150601f19603f3d011682016040523d82523d6000602084013e610542565b606091505b505050600101610361565b506040516370a0823160e01b81523060048201526000906001600160a01b038816906370a0823190602401602060405180830381865afa158015610595573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b9919061084e565b90508015610333576040516323b872dd60e01b8152306004820152336024820152604481018290526001600160a01b038816906323b872dd906064016020604051808303816000875af1158015610614573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106389190610867565b5050505050505050565b80356001600160a01b038116811461065957600080fd5b919050565b60008060006060848603121561067357600080fd5b61067c84610642565b925061068a60208501610642565b915061069860408501610642565b90509250925092565b60008083601f8401126106b357600080fd5b50813567ffffffffffffffff8111156106cb57600080fd5b6020830191508360208260051b85010111156106e657600080fd5b9250929050565b60008060008060006060868803121561070557600080fd5b61070e86610642565b9450602086013567ffffffffffffffff8082111561072b57600080fd5b61073789838a016106a1565b9096509450604088013591508082111561075057600080fd5b5061075d888289016106a1565b969995985093965092949392505050565b60005b83811015610789578181015183820152602001610771565b50506000910152565b600081518084526107aa81602086016020860161076e565b601f01601f19169290920160200192915050565b6001600160a01b0385811682528481166020830152831660408201526080606082018190526000906107f290830184610792565b9695505050505050565b6001600160a01b038416815260606020820181905260009061082090830185610792565b82810360408401526107f28185610792565b6000825161084481846020870161076e565b9190910192915050565b60006020828403121561086057600080fd5b5051919050565b60006020828403121561087957600080fd5b8151801515811461088957600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156108b857600080fd5b6108898261064256fea2646970667358221220101f409fabaaace8b2da6b5adc89e3337c43af021e0fb5654b772e2a528bbff464736f6c6343000813003360e06040523480156200001157600080fd5b5060405162001833380380620018338339810160408190526200003491620002b5565b6001600160a01b038216608081905260c0829052604051635b69006f60e11b81527fa9214cc96615e0085d3bb077758db69497dc2dce3b2b1e97bc93c3d18d83efd3600482015263b6d200de90602401602060405180830381865afa158015620000a2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c89190620002e6565b6001600160a01b031660a0526040516329965a1d60e01b815230600482018190527fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b60248301819052604483019190915290731820a4b7618bde71dce8cdc73aab6c95905fad24906329965a1d90606401600060405180830381600087803b1580156200015457600080fd5b505af115801562000169573d6000803e3d6000fd5b50506040516329965a1d60e01b815230600482018190527fece6fc2bcfc93e4c34c28aeaa114be1a6161decb8268f79cbe7c3c7f31b1e8c660248301526044820152731820a4b7618bde71dce8cdc73aab6c95905fad2492506329965a1d9150606401600060405180830381600087803b158015620001e757600080fd5b505af1158015620001fc573d6000803e3d6000fd5b50506040516329965a1d60e01b815230600482018190527fca6323f8f0faf3d4f41f2397ee46c8d85bed576d54aadeb20b6cf7b45b3a696460248301526044820152731820a4b7618bde71dce8cdc73aab6c95905fad2492506329965a1d9150606401600060405180830381600087803b1580156200027a57600080fd5b505af11580156200028f573d6000803e3d6000fd5b505050505050506200030d565b6001600160a01b0381168114620002b257600080fd5b50565b60008060408385031215620002c957600080fd5b8251620002d6816200029c565b6020939093015192949293505050565b600060208284031215620002f957600080fd5b815162000306816200029c565b9392505050565b60805160a05160c05161148d620003a66000396000818161011d015281816102dd0152818161074201528181610792015261093501526000818161037e0152818161043f0152818161058f0152818161061e015281816107fa01528181610a5601528181610b170152610ce701526000818161041501528181610565015281816105f401528181610aed0152610cbd015261148d6000f3fe608060405234801561001057600080fd5b506004361061007c5760003560e01c8063362910631161005b57806336291063146100d457806360dfa69514610118578063b8a140331461014d578063bf8903dd1461016057600080fd5b806223de291461008157806302f3c6c51461009657806316e23b9f146100a9575b600080fd5b61009461008f366004610fc0565b61019b565b005b6100946100a4366004611080565b610243565b6100bc6100b73660046110b9565b610735565b604051600b9190910b81526020015b60405180910390f35b6101006100e23660046110e5565b6001600160a01b039081166000908152602081905260409020541690565b6040516001600160a01b0390911681526020016100cb565b61013f7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016100cb565b6100bc61015b3660046110b9565b610785565b61017361016e3660046110e5565b6107b7565b604080516001600160a01b0390941684526020840192909252600b0b908201526060016100cb565b336000818152602081905260409020546001600160a01b038981169116146101f457600084156101d6576101d185870187611109565b6101e0565b6101e08288610735565b90506101ee828a898461089b565b50610238565b806001600160a01b03167fb9c1b85a7ee70d95c61aca7cda03ef957abc5265a191ca74cc335faf594095668760405161022f91815260200190565b60405180910390a25b505050505050505050565b6001600160a01b03808316600090815260208190526040902054163381146102ab5760405162461bcd60e51b81526020600482015260166024820152751513d1d04e881bdb9b1e48141250c8185b1b1bddd95960521b60448201526064015b60405180910390fd5b600082600b0b12156102cf5760405162461bcd60e51b81526004016102a290611126565b6102d883610e28565b6103067f0000000000000000000000000000000000000000000000000000000000000000600b85900b61117f565b111561034e5760405162461bcd60e51b81526020600482015260176024820152760a89e8e827440caf0d2e8a4c2e8ca40e8dede40d0d2ced604b1b60448201526064016102a2565b604051631cd43d1160e31b81526001600160a01b03848116600483015230602483015282811660448301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a1e88890606401608060405180830381865afa1580156103c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103eb9190611196565b5050915050600081600b0b1380156104065750600083600b0b135b15610540576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116906339255d5b907f00000000000000000000000000000000000000000000000000000000000000009081166350209a6288878960005b6040519080825280601f01601f191660200182016040528015610496576020820181803683370190505b506040516024016104aa949392919061123a565b60408051808303601f1901815291815260208201805160e094851b6001600160e01b03909116179052519185901b6001600160e01b03191682526104f39392509060040161127a565b6000604051808303816000875af1158015610512573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261053a91908101906112c1565b506106ed565b80600b0b60001480156105565750600083600b0b135b156105c0576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116906339255d5b907f00000000000000000000000000000000000000000000000000000000000000009081166362fc305e888789600061046c565b600081600b0b1380156105d6575082600b0b6000145b156106ed576040805160008152602081019091526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116916339255d5b917f0000000000000000000000000000000000000000000000000000000000000000919082169063b4b333c69061065b908a9030908a906044810161136e565b60408051808303601f1901815291815260208201805160e094851b6001600160e01b03909116179052519185901b6001600160e01b03191682526106a49392509060040161127a565b6000604051808303816000875af11580156106c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106eb91908101906112c1565b505b604051600b84900b81526001600160a01b038516907f0988aefa675e81e1db7fca08264db5dc2a1cc2a604f2a78d902a9747146a56719060200160405180910390a250505050565b600061077c6107776107687f0000000000000000000000000000000000000000000000000000000000000000600461117f565b61077290856113a2565b610ec9565b610f37565b90505b92915050565b600061077c6107776107727f0000000000000000000000000000000000000000000000000000000000000000856113a2565b6001600160a01b03818116600081815260208190526040808220549051631cd43d1160e31b815260048101939093523060248401528316604483015291829182917f0000000000000000000000000000000000000000000000000000000000000000169063e6a1e88890606401608060405180830381865afa158015610841573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108659190611196565b50506001600160a01b0380871660009081526020819052604090205491935016905061089085610e28565b925092509193909250565b6001600160a01b038416600090815260208190526040902054600160a01b900460ff161561090b5760405162461bcd60e51b815260206004820152601c60248201527f544f47413a207265656e7472616e6379206e6f7420616c6c6f7765640000000060448201526064016102a2565b600081600b0b121561092f5760405162461bcd60e51b81526004016102a290611126565b8161095e7f0000000000000000000000000000000000000000000000000000000000000000600b84900b61117f565b11156109a65760405162461bcd60e51b81526020600482015260176024820152760a89e8e827440caf0d2e8a4c2e8ca40e8dede40d0d2ced604b1b60448201526064016102a2565b6000826109b286610e28565b6109bc91906113c4565b9050808311610a015760405162461bcd60e51b8152602060048201526011602482015270544f47413a2062696420746f6f206c6f7760781b60448201526064016102a2565b6001600160a01b038581166000818152602081905260408082208054600160a01b60ff60a01b198216179091559051631cd43d1160e31b815260048101939093523060248401528316604483018190529290917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a1e88890606401608060405180830381865afa158015610a9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac39190611196565b5050915050600081600b0b1315610be6576040805160008152602081019091526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116916339255d5b917f0000000000000000000000000000000000000000000000000000000000000000919082169063b4b333c690610b54908d9030908a906044810161136e565b60408051808303601f1901815291815260208201805160e094851b6001600160e01b03909116179052519185901b6001600160e01b0319168252610b9d9392509060040161127a565b6000604051808303816000875af1158015610bbc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610be491908101906112c1565b505b6001600160a01b03821615610c6a5760405163a9059cbb60e01b81526001600160a01b0383811660048301526024820185905288169063a9059cbb906044016020604051808303816000875af1158015610c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6891906113d7565b505b6001600160a01b03878116600090815260208190526040812080546001600160a01b03191692891692909217909155600b85900b1315610db6576040805160008152602081019091526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116916339255d5b917f000000000000000000000000000000000000000000000000000000000000000091908216906362fc305e90610d24908d908d908c906044810161123a565b60408051808303601f1901815291815260208201805160e094851b6001600160e01b03909116179052519185901b6001600160e01b0319168252610d6d9392509060040161127a565b6000604051808303816000875af1158015610d8c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610db491908101906112c1565b505b6001600160a01b0387811660008181526020818152604091829020805460ff60a01b191690558151938a1684528301889052600b87900b90830152907f836808e57755d5535898b7203c7d68b1bfb2701b1943ecb133c675e0d00780159060600160405180910390a250505050505050565b604051632ec8eec760e01b8152306004820152600090819081906001600160a01b03851690632ec8eec790602401608060405180830381865afa158015610e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9791906113f9565b50509150915060008183610eab919061142f565b13610eb7576000610ec1565b610ec1818361142f565b949350505050565b60006001600160ff1b03821115610f335760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016102a2565b5090565b60006b7fffffffffffffffffffffff8212610f33576b7fffffffffffffffffffffff92915050565b6001600160a01b0381168114610f7457600080fd5b50565b60008083601f840112610f8957600080fd5b50813567ffffffffffffffff811115610fa157600080fd5b602083019150836020828501011115610fb957600080fd5b9250929050565b60008060008060008060008060c0898b031215610fdc57600080fd5b8835610fe781610f5f565b97506020890135610ff781610f5f565b9650604089013561100781610f5f565b955060608901359450608089013567ffffffffffffffff8082111561102b57600080fd5b6110378c838d01610f77565b909650945060a08b013591508082111561105057600080fd5b5061105d8b828c01610f77565b999c989b5096995094979396929594505050565b80600b0b8114610f7457600080fd5b6000806040838503121561109357600080fd5b823561109e81610f5f565b915060208301356110ae81611071565b809150509250929050565b600080604083850312156110cc57600080fd5b82356110d781610f5f565b946020939093013593505050565b6000602082840312156110f757600080fd5b813561110281610f5f565b9392505050565b60006020828403121561111b57600080fd5b813561110281611071565b60208082526023908201527f544f47413a206e65676174697665206578697452617465206e6f7420616c6c6f6040820152621dd95960ea1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761077f5761077f611169565b600080600080608085870312156111ac57600080fd5b8451935060208501516111be81611071565b6040860151606090960151949790965092505050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156112055781810151838201526020016111ed565b50506000910152565b600081518084526112268160208601602086016111ea565b601f01601f19169290920160200192915050565b6001600160a01b03858116825284166020820152600b83900b60408201526080606082018190526000906112709083018461120e565b9695505050505050565b6001600160a01b038316815260606020820181905260009061129e9083018461120e565b8281036040938401526002815261060f60f31b6020820152919091019392505050565b6000602082840312156112d357600080fd5b815167ffffffffffffffff808211156112eb57600080fd5b818401915084601f8301126112ff57600080fd5b815181811115611311576113116111d4565b604051601f8201601f19908116603f01168101908382118183101715611339576113396111d4565b8160405282815287602084870101111561135257600080fd5b6113638360208301602088016111ea565b979650505050505050565b6001600160a01b0385811682528481166020830152831660408201526080606082018190526000906112709083018461120e565b6000826113bf57634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561077f5761077f611169565b6000602082840312156113e957600080fd5b8151801515811461110257600080fd5b6000806000806080858703121561140f57600080fd5b505082516020840151604085015160609095015191969095509092509050565b808201828112600083128015821682158216171561144f5761144f611169565b50509291505056fea264697066735822122042d616199b34b565ae44dcbe6007b90db7ea391b62bcbb2de7e74c725d91f7ec64736f6c63430008130033a26469706673582212201853888532f3c04e6e75f807a5e21ea84bf1e6b937602a539db9aa74dfe0dde064736f6c63430008130033
## SuperfluidIDAv1DeployerLibrary
	uses: ['SlotsBitmapLibrary']
	runtime bytecode: 73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063667067181461003a575b600080fd5b81801561004657600080fd5b5061005a6100553660046100c5565b610076565b6040516001600160a01b03909116815260200160405180910390f35b600081604051610085906100b8565b6001600160a01b039091168152602001604051809103906000f0801580156100b1573d6000803e3d6000fd5b5092915050565b615316806100f683390190565b6000602082840312156100d757600080fd5b81356001600160a01b03811681146100ee57600080fd5b939250505056fe60a06040523480156200001157600080fd5b506040516200531638038062005316833981016040819052620000349162000046565b6001600160a01b031660805262000078565b6000602082840312156200005957600080fd5b81516001600160a01b03811681146200007157600080fd5b9392505050565b6080516152826200009460003960006110f301526152826000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80637fbc7639116100b8578063acafa1b81161007c578063acafa1b814610336578063acf4a6c214610349578063b6dacdb81461035c578063b96731c21461037e578063cd7245c514610391578063d787840a146103e957600080fd5b80637fbc76391461029f578063899baaec146102b25780639903ad38146102e25780639b2e48bc146102ea578063a5653ced1461031857600080fd5b806350d75d25116100ff57806350d75d251461020457806352d1902d1461020c5780635b534051146102225780636041ae96146102665780637730599e1461027957600080fd5b8063232d2b581461013c57806323fc23f3146101655780632e5e74c6146101a95780633fd4176a146101bc57806346951954146101ef575b600080fd5b61014f61014a3660046143b8565b6103fc565b60405161015c9190614493565b60405180910390f35b6101786101733660046144a6565b610b16565b6040805194151585526001600160801b0393841660208601529183169184019190915216606082015260800161015c565b61014f6101b73660046144f1565b610b81565b6101d773__$0ca4325a4497c5d952bddb238e8b4ce961$__81565b6040516001600160a01b03909116815260200161015c565b6102026101fd366004614545565b6110e8565b005b6101d761113d565b61021461116c565b60405190815260200161015c565b610235610230366004614569565b6111d0565b60405161015c9493929190931515845291151560208401526001600160801b03166040830152606082015260800190565b61014f6102743660046145c5565b6112a6565b7f8aedc3b5d4bf031e11a7e2940f7251c005698405d58e02e1c247fed3b1b3a674610214565b61014f6102ad366004614640565b6116cb565b6102c56102c0366004614681565b6117b8565b604080519283526001600160801b0390911660208301520161015c565b61020261185d565b6102fd6102f83660046146d2565b61196b565b6040805193845260208401929092529082015260600161015c565b61032161010081565b60405163ffffffff909116815260200161015c565b61014f6103443660046144f1565b611b76565b61014f6103573660046145c5565b611f7b565b61036f61036a366004614713565b612535565b60405161015c93929190614790565b61014f61038c36600461482d565b61278a565b6103a461039f366004614882565b61288a565b604080516001600160a01b03909616865263ffffffff9094166020860152911515928401929092526001600160801b039091166060830152608082015260a00161015c565b61014f6103f73660046148ae565b61298c565b60606001600160a01b03851661042557604051633242919d60e21b815260040160405180910390fd5b61042d614210565b61043561426e565b606060008061047a8c89898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b4792505050565b90508060a00151925080606001519150506104998b828b8d6000612d14565b60808901521515602080890191909152606088019190915260408088018390529287528251908101909252600082526104d5918d918c91612e07565b925086868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050602086015191965050156105395764040000000060c084015261052f8386612e35565b60a0850152610554565b64010000000060c084015261054e8386612e35565b60a08501525b83602001518015610571575060808401515163ffffffff90811614155b1561064c576105c08460800151608001516001600160801b0316896001600160801b03168660600151602001516001600160801b03166105b19190614928565b6105bb919061493b565b612fec565b6060850180516001600160801b03909216602090920191909152845190516001600160a01b038d169163a1b2bf8b916105f890613059565b6040518363ffffffff1660e01b815260040161061592919061497e565b600060405180830381600087803b15801561062f57600080fd5b505af1158015610643573d6000803e3d6000fd5b50505050610833565b8360200151156106c9576106918460800151608001516001600160801b0316896001600160801b03168660600151604001516001600160801b03166105b19190614928565b6060850180516001600160801b03909216604090920191909152845190516001600160a01b038d169163a1b2bf8b916105f890613059565b6040518060a0016040528063ffffffff80168152602001826001600160a01b031681526020018b63ffffffff1681526020018560600151600001516001600160801b03168152602001896001600160801b031681525084608001819052508a6001600160a01b03166312a6a3f8856040015161074887608001516130f7565b6040518363ffffffff1660e01b815260040161076592919061497e565b600060405180830381600087803b15801561077f57600080fd5b505af1158015610793573d6000803e3d6000fd5b50505050878460600151604001516107ab9190614997565b6060850180516001600160801b03909216604090920191909152845190516001600160a01b038d169163a1b2bf8b916107e390613059565b6040518363ffffffff1660e01b815260040161080092919061497e565b600060405180830381600087803b15801561081a57600080fd5b505af115801561082e573d6000803e3d6000fd5b505050505b60008460800151608001516001600160801b031685608001516060015186606001516000015161086391906149be565b6001600160801b031661087691906149de565b905063ffffffff801685608001516000015163ffffffff160361090f576108a68c836108a184614a0e565b61319e565b6001600160a01b038c1663cf97256d836108bf84614a0e565b6040518363ffffffff1660e01b81526004016108dc929190614a2a565b600060405180830381600087803b1580156108f657600080fd5b505af115801561090a573d6000803e3d6000fd5b505050505b60405163cf97256d60e01b81526001600160a01b038d169063cf97256d9061093d908d908590600401614a2a565b600060405180830381600087803b15801561095757600080fd5b505af115801561096b573d6000803e3d6000fd5b50505050846020015115610a115760608086015151608080880180516001600160801b039384169401939093528251918c16910152604086015190516001600160a01b038e169163a1b2bf8b916109c1906130f7565b6040518363ffffffff1660e01b81526004016109de92919061497e565b600060405180830381600087803b1580156109f857600080fd5b505af1158015610a0c573d6000803e3d6000fd5b505050505b846020015115610a405764080000000060c085015260a0850151610a37908590886132ec565b9650610a609050565b64020000000060c085015260a0850151610a5c908590886132ec565b9650505b8a63ffffffff16826001600160a01b03168d6001600160a01b03167f0115987243fd19d615b5ea62a80372a06a2b37fec378b148ee7a507c5c4c0a398d8d88604051610aae93929190614a43565b60405180910390a4896001600160a01b03168c6001600160a01b03167fe0707ac7efb8b59c22189af8d004ed17dc9e4379e71b9066119b62c182524977848e8d88604051610aff9493929190614a7f565b60405180910390a350505050509695505050505050565b600080600080610b3f604080516060810182526000808252602082018190529181019190915290565b6000610b4b8888613538565b9050610b57898261359f565b90965091508515610b7657815160208301516040840151919650945092505b505093509350935093565b6060610b8b614210565b610b9361426e565b600060606000610bd98c89898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b4792505050565b606081015160a0909101519093509150506001600160a01b038816610c1157604051633242919d60e21b815260040160405180910390fd5b896001600160a01b0316826001600160a01b031614610c43576040516392da6d1760e01b815260040160405180910390fd5b610c518b8b8a8c6001612d14565b6080890152506060870152604080870182905291865281516020810190925260008252610c81918d918b91612e07565b925086868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505064100000000060c087015250909550610cd290508386612e35565b60a08501526080808501519081015160609182015191860151516000926001600160801b0390921691610d04916149be565b6001600160801b0316610d1791906149de565b60808601515190915063ffffffff90811614610d6457846080015160800151856060015160200151610d4991906149be565b60608601516001600160801b03909116602090910152610d97565b846080015160800151856060015160400151610d8091906149be565b60608601516001600160801b039091166040909101525b8b6001600160a01b031663a1b2bf8b8660000151610db88860600151613059565b6040518363ffffffff1660e01b8152600401610dd592919061497e565b600060405180830381600087803b158015610def57600080fd5b505af1158015610e03573d6000803e3d6000fd5b5050505060808501515163ffffffff90811614610e2d57610e2d8c8a8760800151600001516136b3565b60808501515163ffffffff1663fffffffe1901610ebb57610e528c8c6108a184614a0e565b6001600160a01b038c1663cf97256d8c610e6b84614a0e565b6040518363ffffffff1660e01b8152600401610e88929190614a2a565b600060405180830381600087803b158015610ea257600080fd5b505af1158015610eb6573d6000803e3d6000fd5b505050505b6040858101519051632704839760e01b81526004810191909152600260248201526001600160a01b038d1690632704839790604401600060405180830381600087803b158015610f0a57600080fd5b505af1158015610f1e573d6000803e3d6000fd5b505060405163cf97256d60e01b81526001600160a01b038f16925063cf97256d9150610f50908c908590600401614a2a565b600060405180830381600087803b158015610f6a57600080fd5b505af1158015610f7e573d6000803e3d6000fd5b505064200000000060c0870152505060a0850151610f9e908590886132ec565b9050809650508963ffffffff168b6001600160a01b03168d6001600160a01b03167fe1f8e9cd8061e5b251769965bda6ca9ef1674bc6541fb9131039fa53f024d1428c86604051610ff0929190614ac8565b60405180910390a4886001600160a01b03168c6001600160a01b03167f9e02127550b99adc8cc6ee332a36f31338facdbc396cebefce9a047247cd04558d8d8660405161103f93929190614aec565b60405180910390a38963ffffffff168b6001600160a01b03168d6001600160a01b03167f0115987243fd19d615b5ea62a80372a06a2b37fec378b148ee7a507c5c4c0a398c60008760405161109693929190614a43565b60405180910390a4886001600160a01b03168c6001600160a01b03167fe0707ac7efb8b59c22189af8d004ed17dc9e4379e71b9066119b62c1825249778d8d600087604051610aff9493929190614a7f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461113157604051630b00ec8f60e11b815260040160405180910390fd5b61113a8161373e565b50565b60006111677f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905090565b6000306001600160a01b0316637730599e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111679190614b1c565b6000806000806000806111fc604080516060810182526000808252602082018190529181019190915290565b6112046142a9565b6112128c8c8b8d6000612d14565b909b50929650909450925090508761123b5760008060008097509750975097505050505061129b565b8051608082015163ffffffff9182169091141597509550866112915780608001516001600160801b03168160600151836000015161127991906149be565b6001600160801b031661128c9190614b35565b611294565b60005b9450505050505b945094509450949050565b60606112b0614210565b6112b861426e565b6000606060006112fe8b89898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b4792505050565b9050806060015192508060a0015191505061131d8a8a848b6001612d14565b6080890181905260608901929092525060408701919091529085525163ffffffff1663fffffffe190161136357604051633741257360e01b815260040160405180910390fd5b6113828a8a866040015160405180602001604052806000815250612e07565b925086868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505064100000000060c0870152509095506113d390508386612e35565b60a08501526080808501519081015160609182015191860151516000926001600160801b0390921691611405916149be565b6001600160801b031661141891906149de565b905084608001516080015185606001516020015161143691906149be565b6060860180516001600160801b0390921660209092019190915260808087015101519051604001516114689190614997565b6060860180516001600160801b03909216604090920191909152855190516001600160a01b038d169163a1b2bf8b916114a090613059565b6040518363ffffffff1660e01b81526004016114bd92919061497e565b600060405180830381600087803b1580156114d757600080fd5b505af11580156114eb573d6000803e3d6000fd5b505050506115028b848760800151600001516136b3565b606080860151516080870180516001600160801b039092169190920152805163ffffffff9052604086015190516001600160a01b038d169163a1b2bf8b91611549906130f7565b6040518363ffffffff1660e01b815260040161156692919061497e565b600060405180830381600087803b15801561158057600080fd5b505af1158015611594573d6000803e3d6000fd5b505060405163cf97256d60e01b81526001600160a01b038e16925063cf97256d91506115c69086908590600401614a2a565b600060405180830381600087803b1580156115e057600080fd5b505af11580156115f4573d6000803e3d6000fd5b505064200000000060c0870152505060a0850151611614908590886132ec565b9050809650508863ffffffff168a6001600160a01b03168c6001600160a01b03167fe1f8e9cd8061e5b251769965bda6ca9ef1674bc6541fb9131039fa53f024d1428686604051611666929190614ac8565b60405180910390a4826001600160a01b03168b6001600160a01b03167f9e02127550b99adc8cc6ee332a36f31338facdbc396cebefce9a047247cd04558c8c866040516116b593929190614aec565b60405180910390a3505050505095945050505050565b6060600061170f8785858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b4792505050565b60608101519091506000806117258a848b613946565b9150915080600001516001600160801b0316886001600160801b031610156117605760405163cfdca72560e01b815260040160405180910390fd5b6117738a848b85858d8a60a001516139a5565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929d9c50505050505050505050505050565b60008060006117c78686613538565b90506000806117d6898461359f565b91509150816117f85760405163edeaa63b60e01b815260040160405180910390fd5b60008160400151826020015161180e9190614997565b6001600160801b0316905060006118286105bb838a614b4c565b8351909150611838908290614997565b955061184d826001600160801b038316614b35565b9650505050505094509492505050565b600054610100900460ff161580801561187d5750600054600160ff909116105b806118975750303b158015611897575060005460ff166001145b6118ff5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015611922576000805461ff0019166101001790555b801561113a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a150565b600080600060608061197d8888613bd4565b909250905060005b81518163ffffffff161015611b5a57600061199e6142a9565b600080868563ffffffff16815181106119b9576119b9614b6e565b602002602001015190506119ec8d878763ffffffff16815181106119df576119df614b6e565b6020026020010151613cc7565b9094509250836119fe576119fe614b84565b8063ffffffff16836000015163ffffffff1614611a1d57611a1d614b84565b6001600160a01b038d16634b61cc33308e611a4263ffffffff8616600160801b614928565b60016040518563ffffffff1660e01b8152600401611a639493929190614b9a565b600060405180830381865afa158015611a80573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611aa89190810190614cc0565b600081518110611aba57611aba614b6e565b6020026020010151915050611ae8604080516060810182526000808252602082018190529181019190915290565b611af28d8361359f565b909450905083611b0457611b04614b84565b82608001516001600160801b031683606001518260000151611b2691906149be565b6001600160801b0316611b3991906149de565b611b43908b614cf4565b99505050505080611b5390614d1c565b9050611985565b50611b658888613de3565b935060009250505093509350939050565b6060611bb88784848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b4792505050565b506001600160a01b038416611be057604051633242919d60e21b815260040160405180910390fd5b611be8614210565b611bf061426e565b611bfe8989888a6001612d14565b6080870181905260608701929092525060408501919091529083525163ffffffff90811614611c4057604051633eb2f84960e01b815260040160405180910390fd5b60008260800151608001516001600160801b0316836080015160600151846060015160000151611c7091906149be565b6001600160801b0316611c839190614b35565b9050611ca48a8a856040015160405180602001604052806000815250612e07565b915085858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509296505082159150611f3490505764040000000060c0830152611cfc8285612e35565b60a0840152611d0f8a8a6108a184614a0e565b6001600160a01b038a1663cf97256d8a611d2884614a0e565b6040518363ffffffff1660e01b8152600401611d45929190614a2a565b600060405180830381600087803b158015611d5f57600080fd5b505af1158015611d73573d6000803e3d6000fd5b50505050606083810151516080850180516001600160801b039092169190920152604084015190516001600160a01b038c169163a1b2bf8b91611db5906130f7565b6040518363ffffffff1660e01b8152600401611dd292919061497e565b600060405180830381600087803b158015611dec57600080fd5b505af1158015611e00573d6000803e3d6000fd5b505060405163cf97256d60e01b81526001600160a01b038d16925063cf97256d9150611e32908a908590600401614a2a565b600060405180830381600087803b158015611e4c57600080fd5b505af1158015611e60573d6000803e3d6000fd5b505050508763ffffffff16896001600160a01b03168b6001600160a01b03167f467eccd248ef31c8bcef16d94856855799a8783aeef10f3759e43614059a6bb18a85604051611eb0929190614a2a565b60405180910390a4604080516001600160a01b038b8116825263ffffffff8b166020830152918101839052818916918c16907f48a3d91d4a07e4982b081260e24f922bd33bb965882772d6de19c922c3eabdea9060600160405180910390a364080000000060c083015260a0830151611f2b908390866132ec565b9450611f6e9050565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509296505050505b5050509695505050505050565b6060611f85614210565b611f8d61426e565b600060606000611fd38b89898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b4792505050565b9050806060015192508060a00151915050611ff28a8a848b6000612d14565b60808901521580156020890152606088019190915260408701919091529085526120425760808401515163ffffffff9081161461204257604051633eb2f84960e01b815260040160405180910390fd5b86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506040808a015181516020810190925291815294995061209b948f94508e9350909150612e07565b925083602001516121c45764010000000060c08401526120bb8386612e35565b60a08086019190915260408051918201815260008083526001600160a01b038c16602084015263ffffffff8b1691830191909152606080870151516001600160801b031690830152608080830191909152850152835161211e908b908490613e8c565b60808501805163ffffffff909216909152604085015190516001600160a01b038c16916312a6a3f891612150906130f7565b6040518363ffffffff1660e01b815260040161216d92919061497e565b600060405180830381600087803b15801561218757600080fd5b505af115801561219b573d6000803e3d6000fd5b505064020000000060c0860152505060a08401516121bb908490876132ec565b95506124859050565b64040000000060c08401526121d98386612e35565b60a08501526080808501519081015160609182015191860151516000926001600160801b039092169161220b916149be565b6001600160801b031661221e91906149de565b9050846080015160800151856060015160200181815161223e9190614997565b6001600160801b03169052506080808601510151606086015160400180516122679083906149be565b6001600160801b0316905250845160608601516001600160a01b038d169163a1b2bf8b9161229490613059565b6040518363ffffffff1660e01b81526004016122b192919061497e565b600060405180830381600087803b1580156122cb57600080fd5b505af11580156122df573d6000803e3d6000fd5b505050506122f28b8b836108a190614a0e565b6001600160a01b038b1663cf97256d8b61230b84614a0e565b6040518363ffffffff1660e01b8152600401612328929190614a2a565b600060405180830381600087803b15801561234257600080fd5b505af1158015612356573d6000803e3d6000fd5b505060405163cf97256d60e01b81526001600160a01b038e16925063cf97256d91506123889086908590600401614a2a565b600060405180830381600087803b1580156123a257600080fd5b505af11580156123b6573d6000803e3d6000fd5b5050506060808701515160808801516001600160801b039091169101525084516123e3908c908590613e8c565b60808601805163ffffffff909216909152604086015190516001600160a01b038d169163a1b2bf8b91612415906130f7565b6040518363ffffffff1660e01b815260040161243292919061497e565b600060405180830381600087803b15801561244c57600080fd5b505af1158015612460573d6000803e3d6000fd5b505064080000000060c0870152505060a0850151612480908590886132ec565b965050505b8763ffffffff16896001600160a01b03168b6001600160a01b03167f492d2641617cfaf24ac7328f85bc5bdf5113537d78dc7671afa4f49a73f053c285856040516124d1929190614ac8565b60405180910390a4816001600160a01b03168a6001600160a01b03167fc0b8396b655615cdb85fe462a9a1792480816f909cd46d9517a940b386dfbf6b8b8b8560405161252093929190614aec565b60405180910390a35050505095945050505050565b60608060608060606125478787613bd4565b909250905060006125566142a9565b82516001600160401b0381111561256f5761256f614bc3565b604051908082528060200260200182016040528015612598578160200160208202803683370190505b50965082516001600160401b038111156125b4576125b4614bc3565b6040519080825280602002602001820160405280156125dd578160200160208202803683370190505b50955082516001600160401b038111156125f9576125f9614bc3565b604051908082528060200260200182016040528015612622578160200160208202803683370190505b50945060005b83518163ffffffff16101561277e576000858263ffffffff168151811061265157612651614b6e565b602002602001015190506000858363ffffffff168151811061267557612675614b6e565b602002602001015190506126898c82613cc7565b90955093508461269b5761269b614b84565b8163ffffffff16846000015163ffffffff16146126ba576126ba614b84565b83602001518a8463ffffffff16815181106126d7576126d7614b6e565b60200260200101906001600160a01b031690816001600160a01b0316815250508360400151898463ffffffff168151811061271457612714614b6e565b602002602001019063ffffffff16908163ffffffff16815250508360800151888463ffffffff168151811061274b5761274b614b6e565b60200260200101906001600160801b031690816001600160801b03168152505050508061277790614d1c565b9050612628565b50505050509250925092565b606060006127ce8785858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b4792505050565b60608101519091506000806127e48a848b613946565b915091506000816040015182602001516127fe9190614997565b6001600160801b03169050801561284457600061281e6105bb838c614b4c565b90506128428c868d87878689600001516128389190614997565b8c60a001516139a5565b505b87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929e9d5050505050505050505050505050565b60008060008060008060006128b8604080516060810182526000808252602082018190529181019190915290565b6128c06142a9565b6128ca8b8b613cc7565b9094509050836128ed5760405163016d919360e71b815260040160405180910390fd5b80602001519850806040015197506129058989613538565b92506129118b8461359f565b90945091508361292357612923614b84565b8051608082015163ffffffff9182169091141597509550866129795780608001516001600160801b03168160600151836000015161296191906149be565b6001600160801b03166129749190614b35565b61297c565b60005b9450505050509295509295909350565b606060006129d08685858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612b4792505050565b606081015190915060006129e48288613538565b90506129f08882613f33565b15612a0e57604051635c02a51760e01b815260040160405180910390fd5b876001600160a01b03166312a6a3f882612a5f604051806060016040528060006001600160801b0316815260200160006001600160801b0316815260200160006001600160801b0316815250613059565b6040518363ffffffff1660e01b8152600401612a7c92919061497e565b600060405180830381600087803b158015612a9657600080fd5b505af1158015612aaa573d6000803e3d6000fd5b505050508663ffffffff16826001600160a01b0316896001600160a01b03167f01ab8663165edfb7390d9e5f75d960a66dacf4f01fa9787e3a731c870d0da9218660a00151604051612afc9190614493565b60405180910390a485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929b9a5050505050505050505050565b612b4f6142d7565b336001600160a01b0316836001600160a01b03166320bc44256040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbb9190614d4a565b6001600160a01b031614612c055760405162461bcd60e51b81526020600482015260116024820152701d5b985d5d1a1bdc9a5e9959081a1bdcdd607a1b60448201526064016118f6565b604051632fd0a1cd60e21b8152339063bf42873490612c28908590600401614493565b602060405180830381865afa158015612c45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c699190614d77565b612ca35760405162461bcd60e51b815260206004820152600b60248201526a0d2dcecc2d8d2c840c6e8f60ab1b60448201526064016118f6565b604051631fb6491d60e11b81523390633f6c923a90612cc6908590600401614493565b600060405180830381865afa158015612ce3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612d0b9190810190614e1e565b90505b92915050565b6040805160608101825260008082526020820181905291810182905281906000612d3c6142a9565b6000612d488a89613538565b9550612d548987613fdf565b9450612d608b8761359f565b9450905080612d825760405163edeaa63b60e01b815260040160405180910390fd5b612d8c8b86613cc7565b90935091508615612df95782612db55760405163016d919360e71b815260040160405180910390fd5b896001600160a01b031682602001516001600160a01b031614612dda57612dda614b84565b8763ffffffff16826040015163ffffffff1614612df957612df9614b84565b509550955095509550959050565b612e0f61426e565b6001600160a01b0394851681529290931660208301526040820152606081019190915290565b6020820151604051633e7d48bd60e21b81526001600160a01b03909116600482015260609060009081908190339063f9f522f490602401606060405180830381865afa158015612e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ead9190614f24565b91945092509050828015612ebf575081155b15612fe3576000612ed08688614020565b90508660c001518216600003612fd5576000612eef8860c0015161409e565b88516040808b015160608c015182516000815260208101909352612f1b93923092919060448101614f60565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031990951694909417909352918a015160c08b01519251633a020f0160e11b815291935033926374041e0292612f8a9291869164100000000091909114908890600401614fa5565b6000604051808303816000875af1158015612fa9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612fd19190810190614fee565b9550505b612fe0866000614135565b50505b50505092915050565b60006001600160801b038211156130555760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b60648201526084016118f6565b5090565b604080516002808252606080830184529260208301908036833701905050905081600001516001600160801b0316600160801b1760001b816000815181106130a3576130a3614b6e565b602002602001018181525050608082604001516001600160801b0316901b82602001516001600160801b03161760001b816001815181106130e6576130e6614b6e565b602002602001018181525050919050565b6040805160028082526060808301845292602083019080368337019050509050816000015163ffffffff166020836040015163ffffffff16901b606084602001516001600160a01b0316901b171760001b8160008151811061315b5761315b614b6e565b602002602001018181525050608082608001516001600160801b0316901b82606001516001600160801b03161760001b816001815181106130e6576130e6614b6e565b806000036131ab57505050565b604051634b61cc3360e01b81526000906001600160a01b03851690634b61cc33906131e6903090879064010000000090600190600401614b9a565b600060405180830381865afa158015613203573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261322b9190810190614cc0565b9050816132548260008151811061324457613244614b6e565b602002602001015160001c61415d565b61325e9190614cf4565b60001b8160008151811061327457613274614b6e565b602090810291909101015260405163048620af60e11b81526001600160a01b0385169063090c415e906132b4908690640100000000908690600401615022565b600060405180830381600087803b1580156132ce57600080fd5b505af11580156132e2573d6000803e3d6000fd5b5050505050505050565b6132f46142d7565b6020840151604051633e7d48bd60e21b81526001600160a01b03909116600482015260609060009081908190339063f9f522f490602401606060405180830381865afa158015613348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061336c9190614f24565b88965091945092509050828015613381575081155b1561352d576133908489614020565b93508760c00151811660000361351b5760006133af8960c0015161409e565b89516040808c015160608d0151825160008152602081019093526133dd9392309291908e9060448101615049565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031990951694909417909352918b015160c08c0151925163079b42a160e21b81529193503392631e6d0a849261344c9291869164200000000091909114908b90600401614fa5565b6000604051808303816000875af115801561346b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526134939190810190614fee565b604051631fb6491d60e11b81529095503390633f6c923a906134b9908890600401614493565b600060405180830381865afa1580156134d6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526134fe9190810190614e1e565b955061351389608001518761010001516141c7565b610100870152505b61352a86866101000151614135565b93505b505050935093915050565b60405168383ab13634b9b432b960b91b60208201526bffffffffffffffffffffffff19606084901b1660298201526001600160e01b031960e083901b16603d8201526000906041015b60405160208183030381529060405280519060200120905092915050565b60408051606081018252600080825260208201819052918101829052604051636c2d9f2f60e01b815230600482015260248101849052600260448201526000906001600160a01b03861690636c2d9f2f90606401600060405180830381865afa158015613610573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526136389190810190614cc0565b905060008160008151811061364f5761364f614b6e565b602002602001015160001c905060008260018151811061367157613671614b6e565b602002602001015160001c905060008211945084156136a9576001600160801b03808316855281166020850152608081901c60408501525b5050509250929050565b604051631528e57f60e31b81526001600160a01b038085166004830152831660248201526000604482015263ffffffff8216606482015273__$0ca4325a4497c5d952bddb238e8b4ce961$__9063a9472bf89060840160006040518083038186803b15801561372157600080fd5b505af4158015613735573d6000803e3d6000fd5b50505050505050565b60006137687f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6001600160a01b0316036137be5760405162461bcd60e51b815260206004820152601d60248201527f5555505350726f786961626c653a206e6f742075706772616461626c6500000060448201526064016118f6565b806001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138209190614b1c565b61382861116c565b146138815760405162461bcd60e51b815260206004820152602360248201527f5555505350726f786961626c653a206e6f7420636f6d70617469626c65206c6f60448201526267696360e81b60648201526084016118f6565b6001600160a01b03811630036138d95760405162461bcd60e51b815260206004820152601960248201527f5555505350726f786961626c653a2070726f7879206c6f6f700000000000000060448201526064016118f6565b613901817f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc55565b7fe011bc04c286c344a8fcbb8de77f953da762c3e25d8cdea984147fc4168a5dcc61392a61116c565b604080519182526001600160a01b038416602083015201611960565b60408051606081018252600080825260208201819052918101829052600061396e8585613538565b925061397a868461359f565b925090508061399c5760405163edeaa63b60e01b815260040160405180910390fd5b50935093915050565b866001600160a01b031663cf97256d8785602001516001600160801b03168660000151866139d391906149be565b6001600160801b03166139e590614a0e565b6139ef91906149de565b6040518363ffffffff1660e01b8152600401613a0c929190614a2a565b600060405180830381600087803b158015613a2657600080fd5b505af1158015613a3a573d6000803e3d6000fd5b50505050613a74878785604001516001600160801b0316866000015186613a6191906149be565b6001600160801b03166108a191906149de565b82516001600160801b03831684526001600160a01b03881663a1b2bf8b86613a9b87613059565b6040518363ffffffff1660e01b8152600401613ab892919061497e565b600060405180830381600087803b158015613ad257600080fd5b505af1158015613ae6573d6000803e3d6000fd5b505050508563ffffffff16876001600160a01b0316896001600160a01b03167f81e37f3d9f16cbf29a62d6a1c21d79b23ef29b54124ec44af43a50fffb9304f3848789604001518a6020015189604051613b449594939291906150af565b60405180910390a46040516379359f6f60e01b81526001600160a01b0388811660048301528916906379359f6f90602401602060405180830381865afa158015613b92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bb69190614d77565b156132e2576040516316e759bb60e01b815260040160405180910390fd5b60608073__$0ca4325a4497c5d952bddb238e8b4ce961$__6306967a8c85856000600160801b6040518563ffffffff1660e01b8152600401613c199493929190614b9a565b600060405180830381865af4158015613c36573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613c5e91908101906150eb565b909250905060005b8151811015613cbf57613c9284838381518110613c8557613c85614b6e565b6020026020010151613fdf565b828281518110613ca457613ca4614b6e565b6020908102919091010152613cb8816151af565b9050613c66565b509250929050565b6000613cd16142a9565b604051636c2d9f2f60e01b815230600482015260248101849052600260448201526000906001600160a01b03861690636c2d9f2f90606401600060405180830381865afa158015613d26573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613d4e9190810190614cc0565b9050600081600081518110613d6557613d65614b6e565b602002602001015160001c9050600082600181518110613d8757613d87614b6e565b602002602001015160001c905060008211945084156136a957606082811c60208087019190915283901c63ffffffff9081166040870152831685526001600160801b03821690850152608081811c908501525050509250929050565b600080836001600160a01b0316634b61cc33308564010000000060016040518563ffffffff1660e01b8152600401613e1e9493929190614b9a565b600060405180830381865afa158015613e3b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613e639190810190614cc0565b905080600081518110613e7857613e78614b6e565b602002602001015160001c91505092915050565b604051630a32470160e41b81526001600160a01b03808516600483015283166024820152600060448201819052600160801b6064830152608482018390529073__$0ca4325a4497c5d952bddb238e8b4ce961$__9063a32470109060a401602060405180830381865af4158015613f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f2b91906151c8565b949350505050565b604051636c2d9f2f60e01b8152306004820152602481018290526002604482015260009081906001600160a01b03851690636c2d9f2f90606401600060405180830381865afa158015613f8a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613fb29190810190614cc0565b9050600081600081518110613fc957613fc9614b6e565b6020908102919091010151151595945050505050565b604080516b39bab139b1b934b83a34b7b760a11b6020820152606084811b6bffffffffffffffffffffffff1916602c83015291810183905260009101613581565b6020810151608082015160a08301518351604051630768fabb60e41b8152606094339463768fabb094614057948a946004016151e5565b6000604051808303816000875af1158015614076573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612d0b9190810190614fee565b600064010000000082036140ba57506330d9c91560e01b919050565b64040000000082036140d45750630221347d60e61b919050565b64100000000082036140ee5750635f9e7d7760e01b919050565b6402000000008203614108575063d86ed3e560e01b919050565b6408000000008203614122575063230dbd2960e01b919050565b506353c11f9960e01b919050565b919050565b604051634c4d861f60e11b8152606090339063989b0c3e90614057908690869060040161522a565b60006001600160ff1b038211156130555760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016118f6565b6000612d0b60006141e06141da8661415d565b856141e5565b6141fa565b60008183136141f45782612d0b565b50919050565b60008183136142095781612d0b565b5090919050565b6040805160c0810182526000808252602082018190529181019190915260608101614254604080516060810182526000808252602082018190529181019190915290565b81526020016142616142a9565b8152602001606081525090565b6040805160e0810182526000808252602082018190529181018290526060808201526080810182905260a0810182905260c081019190915290565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a082015260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b6001600160a01b038116811461113a57600080fd5b63ffffffff8116811461113a57600080fd5b80356001600160801b038116811461413057600080fd5b60008083601f84011261438257600080fd5b5081356001600160401b0381111561439957600080fd5b6020830191508360208285010111156143b157600080fd5b9250929050565b60008060008060008060a087890312156143d157600080fd5b86356143dc81614332565b955060208701356143ec81614347565b945060408701356143fc81614332565b935061440a60608801614359565b925060808701356001600160401b0381111561442557600080fd5b61443189828a01614370565b979a9699509497509295939492505050565b60005b8381101561445e578181015183820152602001614446565b50506000910152565b6000815180845261447f816020860160208601614443565b601f01601f19169290920160200192915050565b602081526000612d0b6020830184614467565b6000806000606084860312156144bb57600080fd5b83356144c681614332565b925060208401356144d681614332565b915060408401356144e681614347565b809150509250925092565b60008060008060008060a0878903121561450a57600080fd5b863561451581614332565b9550602087013561452581614332565b9450604087013561453581614347565b9350606087013561440a81614332565b60006020828403121561455757600080fd5b813561456281614332565b9392505050565b6000806000806080858703121561457f57600080fd5b843561458a81614332565b9350602085013561459a81614332565b925060408501356145aa81614347565b915060608501356145ba81614332565b939692955090935050565b6000806000806000608086880312156145dd57600080fd5b85356145e881614332565b945060208601356145f881614332565b9350604086013561460881614347565b925060608601356001600160401b0381111561462357600080fd5b61462f88828901614370565b969995985093965092949392505050565b60008060008060006080868803121561465857600080fd5b853561466381614332565b9450602086013561467381614347565b935061460860408701614359565b6000806000806080858703121561469757600080fd5b84356146a281614332565b935060208501356146b281614332565b925060408501356146c281614347565b9396929550929360600135925050565b6000806000606084860312156146e757600080fd5b83356146f281614332565b9250602084013561470281614332565b929592945050506040919091013590565b6000806040838503121561472657600080fd5b823561473181614332565b9150602083013561474181614332565b809150509250929050565b600081518084526020808501945080840160005b838110156147855781516001600160801b031687529582019590820190600101614760565b509495945050505050565b606080825284519082018190526000906020906080840190828801845b828110156147d25781516001600160a01b0316845292840192908401906001016147ad565b5050508381038285015285518082528683019183019060005b8181101561480d57835163ffffffff16835292840192918401916001016147eb565b50508481036040860152614821818761474c565b98975050505050505050565b60008060008060006080868803121561484557600080fd5b853561485081614332565b9450602086013561486081614347565b93506040860135925060608601356001600160401b0381111561462357600080fd5b6000806040838503121561489557600080fd5b82356148a081614332565b946020939093013593505050565b600080600080606085870312156148c457600080fd5b84356148cf81614332565b935060208501356148df81614347565b925060408501356001600160401b038111156148fa57600080fd5b61490687828801614370565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b80820180821115612d0e57612d0e614912565b81810381811115612d0e57612d0e614912565b600081518084526020808501945080840160005b8381101561478557815187529582019590820190600101614962565b828152604060208201526000613f2b604083018461494e565b6001600160801b038181168382160190808211156149b7576149b7614912565b5092915050565b6001600160801b038281168282160390808211156149b7576149b7614912565b80820260008212600160ff1b841416156149fa576149fa614912565b8181058314821517612d0e57612d0e614912565b6000600160ff1b8201614a2357614a23614912565b5060000390565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03841681526001600160801b0383166020820152606060408201819052600090614a7690830184614467565b95945050505050565b6001600160a01b038516815263ffffffff841660208201526001600160801b0383166040820152608060608201819052600090614abe90830184614467565b9695505050505050565b6001600160a01b0383168152604060208201819052600090613f2b90830184614467565b6001600160a01b038416815263ffffffff83166020820152606060408201819052600090614a7690830184614467565b600060208284031215614b2e57600080fd5b5051919050565b8082028115828204841417612d0e57612d0e614912565b600082614b6957634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b634e487b7160e01b600052604160045260246000fd5b60405161016081016001600160401b0381118282101715614bfc57614bfc614bc3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c2a57614c2a614bc3565b604052919050565b60006001600160401b03821115614c4b57614c4b614bc3565b5060051b60200190565b600082601f830112614c6657600080fd5b81516020614c7b614c7683614c32565b614c02565b82815260059290921b84018101918181019086841115614c9a57600080fd5b8286015b84811015614cb55780518352918301918301614c9e565b509695505050505050565b600060208284031215614cd257600080fd5b81516001600160401b03811115614ce857600080fd5b613f2b84828501614c55565b8082018281126000831280158216821582161715614d1457614d14614912565b505092915050565b600063ffffffff808316818103614d3557614d35614912565b6001019392505050565b805161413081614332565b600060208284031215614d5c57600080fd5b815161456281614332565b8051801515811461413057600080fd5b600060208284031215614d8957600080fd5b612d0b82614d67565b805160ff8116811461413057600080fd5b80516001600160e01b03198116811461413057600080fd5b600082601f830112614dcc57600080fd5b81516001600160401b03811115614de557614de5614bc3565b614df8601f8201601f1916602001614c02565b818152846020838601011115614e0d57600080fd5b613f2b826020830160208701614443565b600060208284031215614e3057600080fd5b81516001600160401b0380821115614e4757600080fd5b908301906101608286031215614e5c57600080fd5b614e64614bd9565b614e6d83614d92565b8152614e7b60208401614d92565b602082015260408301516040820152614e9660608401614d3f565b6060820152614ea760808401614da3565b608082015260a083015182811115614ebe57600080fd5b614eca87828601614dbb565b60a08301525060c083015160c082015260e083015160e0820152610100915081830151828201526101209150614f01828401614d3f565b828201526101409150614f15828401614d3f565b91810191909152949350505050565b600080600060608486031215614f3957600080fd5b614f4284614d67565b9250614f5060208501614d67565b9150604084015190509250925092565b6001600160a01b038681168252851660208201526040810184905260a060608201819052600090614f9390830185614467565b82810360808401526148218185614467565b6001600160a01b0385168152608060208201819052600090614fc990830186614467565b84151560408401528281036060840152614fe38185614467565b979650505050505050565b60006020828403121561500057600080fd5b81516001600160401b0381111561501657600080fd5b613f2b84828501614dbb565b60018060a01b0384168152826020820152606060408201526000614a76606083018461494e565b6001600160a01b038781168252861660208201526040810185905260c06060820181905260009061507c90830186614467565b828103608084015261508e8186614467565b905082810360a08401526150a28185614467565b9998505050505050505050565b60006001600160801b0380881683528087166020840152808616604084015280851660608401525060a06080830152614fe360a0830184614467565b600080604083850312156150fe57600080fd5b82516001600160401b038082111561511557600080fd5b818501915085601f83011261512957600080fd5b81516020615139614c7683614c32565b82815260059290921b8401810191818101908984111561515857600080fd5b948201945b8386101561517f57855161517081614347565b8252948201949082019061515d565b9188015191965090935050508082111561519857600080fd5b506151a585828601614c55565b9150509250929050565b6000600182016151c1576151c1614912565b5060010190565b6000602082840312156151da57600080fd5b815161456281614347565b60a0815260006151f860a0830188614467565b6001600160a01b0396871660208401526040830195909552506060810192909252909216608090920191909152919050565b60408152600061523d6040830185614467565b9050826020830152939250505056fea2646970667358221220b170a39f1f43d5696bdd663f44ee9f00c23deec081aeaecc754fa62b0f6c7b3264736f6c63430008130033a2646970667358221220a429027aa4c3f112077d231faae9919c52f7e46ad3a3d2c9d1a0a74e2f95e5f564736f6c63430008130033
## HotFuzzBase
	uses: ['SuperfluidCFAv1DeployerLibrary', 'TokenDeployerLibrary', 'SuperfluidNFTLogicDeployerLibrary', 'SuperTokenDeployerLibrary', 'SuperfluidHostDeployerLibrary', 'SuperfluidIDAv1DeployerLibrary', 'ProxyDeployerLibrary', 'CFAv1ForwarderDeployerLibrary', 'IDAv1ForwarderDeployerLibrary', 'SuperfluidLoaderDeployerLibrary', 'SuperfluidPeripheryDeployerLibrary', 'SuperfluidGovDeployerLibrary']
	runtime bytecode: 608060405234801561001057600080fd5b50600436106100415760003560e01c80633179f0e61461004657806341df636d14610062578063de65ac6b1461006a575b600080fd5b61004e610072565b604051901515815260200160405180910390f35b61004e610191565b61004e6102ca565b6000600f547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100f9919061058b565b14610106576101066105a4565b600f547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061018b919061058b565b14905090565b6000808061019d6103e4565b905060005b81518110156102ae5760008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632ec8eec78686815181106101f1576101f16105ba565b60200260200101516040518263ffffffff1660e01b815260040161022491906001600160a01b0391909116815260200190565b608060405180830381865afa158015610241573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026591906105d0565b5092509250925080821161027a576000610284565b610284818361061c565b61028e9084610643565b6102989087610643565b9550505050806102a79061066b565b90506101a2565b5081600f54146102c0576102c06105a4565b50600f5414919050565b600080806102d66103e4565b905060005b81518110156103c65760025482516001600160a01b039091169063e8e7e2d1907f00000000000000000000000000000000000000000000000000000000000000009085908590811061032f5761032f6105ba565b60200260200101516040518363ffffffff1660e01b81526004016103699291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015610386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103aa9190610684565b6103b490846106ae565b92506103bf8161066b565b90506102db565b5081600b0b6000146103da576103da6105a4565b50600b0b15919050565b600e54606090610414907f00000000000000000000000000000000000000000000000000000000000000006106eb565b67ffffffffffffffff81111561042c5761042c6106fe565b604051908082528060200260200182016040528015610455578160200160208202803683370190505b50905060005b7f00000000000000000000000000000000000000000000000000000000000000008110156104ee57600d8181548110610496576104966105ba565b9060005260206000200160009054906101000a90046001600160a01b03168282815181106104c6576104c66105ba565b6001600160a01b03909216602092830291909101909101526104e78161066b565b905061045b565b5060005b600e5481101561058757600e818154811061050f5761050f6105ba565b6000918252602090912001546001600160a01b03168261054f7f0000000000000000000000000000000000000000000000000000000000000000846106eb565b8151811061055f5761055f6105ba565b6001600160a01b03909216602092830291909101909101526105808161066b565b90506104f2565b5090565b60006020828403121561059d57600080fd5b5051919050565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600080600080608085870312156105e657600080fd5b505082516020840151604085015160609095015191969095509092509050565b634e487b7160e01b600052601160045260246000fd5b818103600083128015838313168383128216171561063c5761063c610606565b5092915050565b808201828112600083128015821682158216171561066357610663610606565b505092915050565b60006001820161067d5761067d610606565b5060010190565b60006020828403121561069657600080fd5b815180600b0b81146106a757600080fd5b9392505050565b600b81810b9083900b016b7fffffffffffffffffffffff81136b7fffffffffffffffffffffff19821217156106e5576106e5610606565b92915050565b808201808211156106e5576106e5610606565b634e487b7160e01b600052604160045260246000fdfea2646970667358221220604e13480cd0dc786633cc7fabfcabbff7f2c4b3ed8bdf44a0cbb38ca7aacdde64736f6c63430008130033
## CFAHotFuzz
	uses: ['SuperfluidCFAv1DeployerLibrary', 'TokenDeployerLibrary', 'SuperfluidNFTLogicDeployerLibrary', 'SuperTokenDeployerLibrary', 'SuperfluidHostDeployerLibrary', 'SuperfluidIDAv1DeployerLibrary', 'ProxyDeployerLibrary', 'CFAv1ForwarderDeployerLibrary', 'IDAv1ForwarderDeployerLibrary', 'SuperfluidLoaderDeployerLibrary', 'SuperfluidPeripheryDeployerLibrary', 'SuperfluidGovDeployerLibrary']
	runtime bytecode: 608060405234801561001057600080fd5b50600436106100575760003560e01c80633179f0e61461005c57806341df636d146100785780635442d87714610080578063c844876414610095578063de65ac6b146100a8575b600080fd5b6100646100b0565b604051901515815260200160405180910390f35b6100646101cf565b61009361008e3660046107f1565b610308565b005b6100936100a336600461083e565b610398565b610064610414565b6000600f547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610113573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101379190610871565b146101445761014461088a565b600f547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c99190610871565b14905090565b600080806101db61052e565b905060005b81518110156102ec5760008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632ec8eec786868151811061022f5761022f6108a0565b60200260200101516040518263ffffffff1660e01b815260040161026291906001600160a01b0391909116815260200190565b608060405180830381865afa15801561027f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102a391906108b6565b509250925092508082116102b85760006102c2565b6102c28183610902565b6102cc9084610929565b6102d69087610929565b9550505050806102e590610951565b90506101e0565b5081600f54146102fe576102fe61088a565b50600f5414919050565b60008160070b1361031857600080fd5b60008061032585856106d5565b604051631e5a81c160e11b81526001600160a01b038083166004830152600787900b602483015292945090925090831690633cb5038290604401600060405180830381600087803b15801561037957600080fd5b505af115801561038d573d6000803e3d6000fd5b505050505050505050565b6000806103a584846106d5565b604051631e5a81c160e11b81526001600160a01b0380831660048301526000602483015292945090925090831690633cb5038290604401600060405180830381600087803b1580156103f657600080fd5b505af115801561040a573d6000803e3d6000fd5b5050505050505050565b6000808061042061052e565b905060005b81518110156105105760025482516001600160a01b039091169063e8e7e2d1907f000000000000000000000000000000000000000000000000000000000000000090859085908110610479576104796108a0565b60200260200101516040518363ffffffff1660e01b81526004016104b39291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa1580156104d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f4919061096a565b6104fe9084610994565b925061050981610951565b9050610425565b5081600b0b6000146105245761052461088a565b50600b0b15919050565b600e5460609061055e907f00000000000000000000000000000000000000000000000000000000000000006109d1565b67ffffffffffffffff811115610576576105766109e4565b60405190808252806020026020018201604052801561059f578160200160208202803683370190505b50905060005b7f000000000000000000000000000000000000000000000000000000000000000081101561063857600d81815481106105e0576105e06108a0565b9060005260206000200160009054906101000a90046001600160a01b0316828281518110610610576106106108a0565b6001600160a01b039092166020928302919091019091015261063181610951565b90506105a5565b5060005b600e548110156106d157600e8181548110610659576106596108a0565b6000918252602090912001546001600160a01b0316826106997f0000000000000000000000000000000000000000000000000000000000000000846109d1565b815181106106a9576106a96108a0565b6001600160a01b03909216602092830291909101909101526106ca81610951565b905061063c565b5090565b600080600d6107077f000000000000000000000000000000000000000000000000000000000000000060ff87166109fa565b81548110610717576107176108a0565b6000918252602090912001546001600160a01b03169150600d7f000000000000000000000000000000000000000000000000000000000000000061075c600182610a1c565b6107699060ff87166109fa565b6107967f000000000000000000000000000000000000000000000000000000000000000060ff89166109fa565b6107a091906109d1565b6107aa91906109fa565b815481106107ba576107ba6108a0565b60009182526020909120015491946001600160a01b03909216935090915050565b803560ff811681146107ec57600080fd5b919050565b60008060006060848603121561080657600080fd5b61080f846107db565b925061081d602085016107db565b915060408401358060070b811461083357600080fd5b809150509250925092565b6000806040838503121561085157600080fd5b61085a836107db565b9150610868602084016107db565b90509250929050565b60006020828403121561088357600080fd5b5051919050565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600080600080608085870312156108cc57600080fd5b505082516020840151604085015160609095015191969095509092509050565b634e487b7160e01b600052601160045260246000fd5b8181036000831280158383131683831282161715610922576109226108ec565b5092915050565b8082018281126000831280158216821582161715610949576109496108ec565b505092915050565b600060018201610963576109636108ec565b5060010190565b60006020828403121561097c57600080fd5b815180600b0b811461098d57600080fd5b9392505050565b600b81810b9083900b016b7fffffffffffffffffffffff81136b7fffffffffffffffffffffff19821217156109cb576109cb6108ec565b92915050565b808201808211156109cb576109cb6108ec565b634e487b7160e01b600052604160045260246000fd5b600082610a1757634e487b7160e01b600052601260045260246000fd5b500690565b818103818111156109cb576109cb6108ec56fea26469706673582212201d72e571de7960ffd0ad2eceea05e639c8a48123bab18795eb5fff2aa79c6f3f64736f6c63430008130033
## IDAHotFuzz
	uses: ['SuperfluidCFAv1DeployerLibrary', 'TokenDeployerLibrary', 'SuperfluidNFTLogicDeployerLibrary', 'SuperTokenDeployerLibrary', 'SuperfluidHostDeployerLibrary', 'SuperfluidIDAv1DeployerLibrary', 'ProxyDeployerLibrary', 'CFAv1ForwarderDeployerLibrary', 'IDAv1ForwarderDeployerLibrary', 'SuperfluidLoaderDeployerLibrary', 'SuperfluidPeripheryDeployerLibrary', 'SuperfluidGovDeployerLibrary']
	runtime bytecode: 608060405234801561001057600080fd5b506004361061007d5760003560e01c806393d0bc5d1161005b57806393d0bc5d146100bb578063d3fafad3146100ce578063dc2317fb146100e1578063de65ac6b146100f457600080fd5b80631f7d8a55146100825780633179f0e61461009757806341df636d146100b3575b600080fd5b610095610090366004610f4b565b6100fc565b005b61009f610317565b604051901515815260200160405180910390f35b61009f610436565b6100956100c9366004610f9f565b61056f565b6100956100dc366004610ff5565b610707565b6100956100ef366004610f9f565b6108f7565b61009f610a65565b61010760038361104e565b9150600061011484610b7f565b6005546040516323fc23f360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152838116602483015263ffffffff87166044830152929350600092909116906323fc23f390606401608060405180830381865afa158015610198573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101bc9190611081565b5050509050801561031057600554604051632266eabb60e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152848116602483015263ffffffff8716604483015260648201869052600092169063899baaec906084016040805180830381865afa15801561024c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061027091906110d2565b50604051630c46a46360e11b815263ffffffff87166004820152602481018690529091506001600160a01b0384169063188d48c690604401600060405180830381600087803b1580156102c257600080fd5b505af11580156102d6573d6000803e3d6000fd5b5050505060006102e584610bdb565b905060006102f285610bdb565b9050826102ff8284611118565b1461030c5761030c61113f565b5050505b5050505050565b6000600f547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561037a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039e9190611155565b146103ab576103ab61113f565b600f547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561040c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104309190611155565b14905090565b60008080610442610c74565b905060005b81518110156105535760008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632ec8eec78686815181106104965761049661116e565b60200260200101516040518263ffffffff1660e01b81526004016104c991906001600160a01b0391909116815260200190565b608060405180830381865afa1580156104e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050a9190611184565b5092509250925080821161051f576000610529565b6105298183611118565b61053390846111ba565b61053d90876111ba565b95505050508061054c906111e2565b9050610447565b5081600f54146105655761056561113f565b50600f5414919050565b61057a60038361104e565b91506000806105898686610e1b565b6005546040516323fc23f360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152848116602483015263ffffffff8916604483015293955091935060009216906323fc23f390606401608060405180830381865afa15801561060e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106329190611081565b50505090508061069c57604051633ea5c14b60e21b815263ffffffff861660048201526001600160a01b0384169063fa97052c90602401600060405180830381600087803b15801561068357600080fd5b505af1158015610697573d6000803e3d6000fd5b505050505b60405163dc28972b60e01b81526001600160a01b0384169063dc28972b906106cc908890869089906004016111fb565b600060405180830381600087803b1580156106e657600080fd5b505af11580156106fa573d6000803e3d6000fd5b5050505050505050505050565b61071260038261104e565b90506000806107218585610e1b565b600554604051635b53405160e01b815292945090925060009182916001600160a01b031690635b53405190610780907f00000000000000000000000000000000000000000000000000000000000000009088908a90899060040161122b565b608060405180830381865afa15801561079d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c1919061125c565b5050604051630876f0d760e11b81526001600160a01b03878116600483015263ffffffff89166024830152861692506310ede1ae9150604401600060405180830381600087803b15801561081457600080fd5b505af1158015610828573d6000803e3d6000fd5b5050600554604051635b53405160e01b81526001600160a01b039091169250635b5340519150610882907f00000000000000000000000000000000000000000000000000000000000000009088908a90899060040161122b565b608060405180830381865afa15801561089f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c3919061125c565b509193509150506001821515146108dc576108dc61113f565b6001811515146108ee576108ee61113f565b50505050505050565b6000816001600160801b03161161090d57600080fd5b61091860038361104e565b91506000806109278686610e1b565b60405163dc28972b60e01b815291935091506001600160a01b0383169063dc28972b9061095c908790859088906004016111fb565b600060405180830381600087803b15801561097657600080fd5b505af115801561098a573d6000803e3d6000fd5b5050600554604051635b53405160e01b8152600093508392506001600160a01b0390911690635b534051906109e9907f00000000000000000000000000000000000000000000000000000000000000009088908b90899060040161122b565b608060405180830381865afa158015610a06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2a919061125c565b5091935090915050600182151514610a4457610a4461113f565b846001600160801b0316816001600160801b03161461030c5761030c61113f565b60008080610a71610c74565b905060005b8151811015610b615760025482516001600160a01b039091169063e8e7e2d1907f000000000000000000000000000000000000000000000000000000000000000090859085908110610aca57610aca61116e565b60200260200101516040518363ffffffff1660e01b8152600401610b049291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015610b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4591906112a9565b610b4f90846112d3565b9250610b5a816111e2565b9050610a76565b5081600b0b600014610b7557610b7561113f565b50600b0b15919050565b6000600d610bb07f000000000000000000000000000000000000000000000000000000000000000060ff8516611310565b81548110610bc057610bc061116e565b6000918252602090912001546001600160a01b031692915050565b604051632ec8eec760e01b81526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690632ec8eec790602401608060405180830381865afa158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a9190611184565b5091949350505050565b600e54606090610ca4907f0000000000000000000000000000000000000000000000000000000000000000611324565b67ffffffffffffffff811115610cbc57610cbc611337565b604051908082528060200260200182016040528015610ce5578160200160208202803683370190505b50905060005b7f0000000000000000000000000000000000000000000000000000000000000000811015610d7e57600d8181548110610d2657610d2661116e565b9060005260206000200160009054906101000a90046001600160a01b0316828281518110610d5657610d5661116e565b6001600160a01b0390921660209283029190910190910152610d77816111e2565b9050610ceb565b5060005b600e54811015610e1757600e8181548110610d9f57610d9f61116e565b6000918252602090912001546001600160a01b031682610ddf7f000000000000000000000000000000000000000000000000000000000000000084611324565b81518110610def57610def61116e565b6001600160a01b0390921660209283029190910190910152610e10816111e2565b9050610d82565b5090565b600080600d610e4d7f000000000000000000000000000000000000000000000000000000000000000060ff8716611310565b81548110610e5d57610e5d61116e565b6000918252602090912001546001600160a01b03169150600d7f0000000000000000000000000000000000000000000000000000000000000000610ea260018261134d565b610eaf9060ff8716611310565b610edc7f000000000000000000000000000000000000000000000000000000000000000060ff8916611310565b610ee69190611324565b610ef09190611310565b81548110610f0057610f0061116e565b60009182526020909120015491946001600160a01b03909216935090915050565b803560ff81168114610f3257600080fd5b919050565b803563ffffffff81168114610f3257600080fd5b600080600060608486031215610f6057600080fd5b610f6984610f21565b9250610f7760208501610f37565b9150604084013590509250925092565b6001600160801b0381168114610f9c57600080fd5b50565b60008060008060808587031215610fb557600080fd5b610fbe85610f21565b9350610fcc60208601610f21565b9250610fda60408601610f37565b91506060850135610fea81610f87565b939692955090935050565b60008060006060848603121561100a57600080fd5b61101384610f21565b925061102160208501610f21565b915061102f60408501610f37565b90509250925092565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff8084168061106557611065611038565b92169190910692915050565b80518015158114610f3257600080fd5b6000806000806080858703121561109757600080fd5b6110a085611071565b935060208501516110b081610f87565b60408601519093506110c181610f87565b6060860151909250610fea81610f87565b600080604083850312156110e557600080fd5b8251915060208301516110f781610f87565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b818103600083128015838313168383128216171561113857611138611102565b5092915050565b634e487b7160e01b600052600160045260246000fd5b60006020828403121561116757600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b6000806000806080858703121561119a57600080fd5b505082516020840151604085015160609095015191969095509092509050565b80820182811260008312801582168215821617156111da576111da611102565b505092915050565b6000600182016111f4576111f4611102565b5060010190565b63ffffffff9390931683526001600160a01b039190911660208301526001600160801b0316604082015260600190565b6001600160a01b039485168152928416602084015263ffffffff919091166040830152909116606082015260800190565b6000806000806080858703121561127257600080fd5b61127b85611071565b935061128960208601611071565b9250604085015161129981610f87565b6060959095015193969295505050565b6000602082840312156112bb57600080fd5b815180600b0b81146112cc57600080fd5b9392505050565b600b81810b9083900b016b7fffffffffffffffffffffff81136b7fffffffffffffffffffffff198212171561130a5761130a611102565b92915050565b60008261131f5761131f611038565b500690565b8082018082111561130a5761130a611102565b634e487b7160e01b600052604160045260246000fd5b8181038181111561130a5761130a61110256fea264697066735822122044547d82076682de87882c3856652d2ea58c83b9448d611b8d714ab35c45faad64736f6c63430008130033
## SuperHotFuzz
	uses: ['SuperfluidCFAv1DeployerLibrary', 'TokenDeployerLibrary', 'SuperfluidNFTLogicDeployerLibrary', 'SuperTokenDeployerLibrary', 'SuperfluidHostDeployerLibrary', 'SuperfluidIDAv1DeployerLibrary', 'ProxyDeployerLibrary', 'CFAv1ForwarderDeployerLibrary', 'IDAv1ForwarderDeployerLibrary', 'SuperfluidLoaderDeployerLibrary', 'SuperfluidPeripheryDeployerLibrary', 'SuperfluidGovDeployerLibrary']
	runtime bytecode: 608060405234801561001057600080fd5b50600436106100a95760003560e01c80635442d877116100715780635442d8771461010d57806393d0bc5d14610120578063c844876414610133578063d3fafad314610146578063dc2317fb14610159578063de65ac6b1461016c57600080fd5b806314e0cdda146100ae5780631f7d8a55146100c35780633179f0e6146100d657806338657763146100f257806341df636d14610105575b600080fd5b6100c16100bc366004611519565b610174565b005b6100c16100d1366004611571565b6103bb565b6100de6105d6565b604051901515815260200160405180910390f35b6100c1610100366004611519565b6106f5565b6100de610916565b6100c161011b3660046115ad565b610a4f565b6100c161012e366004611612565b610adf565b6100c1610141366004611668565b610c77565b6100c161015436600461169b565b610ce9565b6100c1610167366004611612565b610ed9565b6100de611047565b60008167ffffffffffffffff161161018b57600080fd5b600061019683611161565b905060006101a3826111bd565b90508267ffffffffffffffff168112156101bc57600080fd5b6040516370a0823160e01b81526001600160a01b0383811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610227573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061024b91906116de565b604051634091c42f60e01b815267ffffffffffffffff861660048201529091506001600160a01b03841690634091c42f90602401600060405180830381600087803b15801561029957600080fd5b505af11580156102ad573d6000803e3d6000fd5b5050505060006102bc846111bd565b6040516370a0823160e01b81526001600160a01b0386811660048301529192506000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610328573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034c91906116de565b9050610358838261170d565b8667ffffffffffffffff161461037057610370611734565b61037a828561170d565b610384848361170d565b1461039157610391611734565b8567ffffffffffffffff16600f60008282546103ad919061174a565b909155505050505050505050565b6103c6600383611779565b915060006103d384611161565b6005546040516323fc23f360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152838116602483015263ffffffff87166044830152929350600092909116906323fc23f390606401608060405180830381865afa158015610457573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047b91906117ac565b505050905080156105cf57600554604051632266eabb60e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152848116602483015263ffffffff8716604483015260648201869052600092169063899baaec906084016040805180830381865afa15801561050b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052f91906117fd565b50604051630c46a46360e11b815263ffffffff87166004820152602481018690529091506001600160a01b0384169063188d48c690604401600060405180830381600087803b15801561058157600080fd5b505af1158015610595573d6000803e3d6000fd5b5050505060006105a4846111bd565b905060006105b1856111bd565b9050826105be828461170d565b146105cb576105cb611734565b5050505b5050505050565b6000600f547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610639573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065d91906116de565b1461066a5761066a611734565b600f547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ef91906116de565b14905090565b60008167ffffffffffffffff161161070c57600080fd5b600061071783611161565b90506000610724826111bd565b6040516370a0823160e01b81526001600160a01b0384811660048301529192506000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610790573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b491906116de565b6040516308ffe02760e01b815267ffffffffffffffff861660048201529091506001600160a01b038416906308ffe02790602401600060405180830381600087803b15801561080257600080fd5b505af1158015610816573d6000803e3d6000fd5b505050506000610825846111bd565b6040516370a0823160e01b81526001600160a01b0386811660048301529192506000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610891573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b591906116de565b90506108c1818461170d565b8667ffffffffffffffff16146108d9576108d9611734565b6108e3848361170d565b6108ed828561170d565b146108fa576108fa611734565b8567ffffffffffffffff16600f60008282546103ad9190611822565b60008080610922611256565b905060005b8151811015610a335760008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632ec8eec786868151811061097657610976611835565b60200260200101516040518263ffffffff1660e01b81526004016109a991906001600160a01b0391909116815260200190565b608060405180830381865afa1580156109c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ea919061184b565b509250925092508082116109ff576000610a09565b610a09818361170d565b610a139084611881565b610a1d9087611881565b955050505080610a2c906118a9565b9050610927565b5081600f5414610a4557610a45611734565b50600f5414919050565b60008160070b13610a5f57600080fd5b600080610a6c85856113fd565b604051631e5a81c160e11b81526001600160a01b038083166004830152600787900b602483015292945090925090831690633cb5038290604401600060405180830381600087803b158015610ac057600080fd5b505af1158015610ad4573d6000803e3d6000fd5b505050505050505050565b610aea600383611779565b9150600080610af986866113fd565b6005546040516323fc23f360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152848116602483015263ffffffff8916604483015293955091935060009216906323fc23f390606401608060405180830381865afa158015610b7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba291906117ac565b505050905080610c0c57604051633ea5c14b60e21b815263ffffffff861660048201526001600160a01b0384169063fa97052c90602401600060405180830381600087803b158015610bf357600080fd5b505af1158015610c07573d6000803e3d6000fd5b505050505b60405163dc28972b60e01b81526001600160a01b0384169063dc28972b90610c3c908890869089906004016118c2565b600060405180830381600087803b158015610c5657600080fd5b505af1158015610c6a573d6000803e3d6000fd5b5050505050505050505050565b600080610c8484846113fd565b604051631e5a81c160e11b81526001600160a01b0380831660048301526000602483015292945090925090831690633cb5038290604401600060405180830381600087803b158015610cd557600080fd5b505af11580156105cb573d6000803e3d6000fd5b610cf4600382611779565b9050600080610d0385856113fd565b600554604051635b53405160e01b815292945090925060009182916001600160a01b031690635b53405190610d62907f00000000000000000000000000000000000000000000000000000000000000009088908a9089906004016118f2565b608060405180830381865afa158015610d7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da39190611923565b5050604051630876f0d760e11b81526001600160a01b03878116600483015263ffffffff89166024830152861692506310ede1ae9150604401600060405180830381600087803b158015610df657600080fd5b505af1158015610e0a573d6000803e3d6000fd5b5050600554604051635b53405160e01b81526001600160a01b039091169250635b5340519150610e64907f00000000000000000000000000000000000000000000000000000000000000009088908a9089906004016118f2565b608060405180830381865afa158015610e81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea59190611923565b50919350915050600182151514610ebe57610ebe611734565b600181151514610ed057610ed0611734565b50505050505050565b6000816001600160801b031611610eef57600080fd5b610efa600383611779565b9150600080610f0986866113fd565b60405163dc28972b60e01b815291935091506001600160a01b0383169063dc28972b90610f3e908790859088906004016118c2565b600060405180830381600087803b158015610f5857600080fd5b505af1158015610f6c573d6000803e3d6000fd5b5050600554604051635b53405160e01b8152600093508392506001600160a01b0390911690635b53405190610fcb907f00000000000000000000000000000000000000000000000000000000000000009088908b9089906004016118f2565b608060405180830381865afa158015610fe8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100c9190611923565b509193509091505060018215151461102657611026611734565b846001600160801b0316816001600160801b0316146105cb576105cb611734565b60008080611053611256565b905060005b81518110156111435760025482516001600160a01b039091169063e8e7e2d1907f0000000000000000000000000000000000000000000000000000000000000000908590859081106110ac576110ac611835565b60200260200101516040518363ffffffff1660e01b81526004016110e69291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015611103573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111279190611970565b611131908461199a565b925061113c816118a9565b9050611058565b5081600b0b60001461115757611157611734565b50600b0b15919050565b6000600d6111927f000000000000000000000000000000000000000000000000000000000000000060ff85166119d1565b815481106111a2576111a2611835565b6000918252602090912001546001600160a01b031692915050565b604051632ec8eec760e01b81526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690632ec8eec790602401608060405180830381865afa158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c919061184b565b5091949350505050565b600e54606090611286907f0000000000000000000000000000000000000000000000000000000000000000611822565b67ffffffffffffffff81111561129e5761129e6119e5565b6040519080825280602002602001820160405280156112c7578160200160208202803683370190505b50905060005b7f000000000000000000000000000000000000000000000000000000000000000081101561136057600d818154811061130857611308611835565b9060005260206000200160009054906101000a90046001600160a01b031682828151811061133857611338611835565b6001600160a01b0390921660209283029190910190910152611359816118a9565b90506112cd565b5060005b600e548110156113f957600e818154811061138157611381611835565b6000918252602090912001546001600160a01b0316826113c17f000000000000000000000000000000000000000000000000000000000000000084611822565b815181106113d1576113d1611835565b6001600160a01b03909216602092830291909101909101526113f2816118a9565b9050611364565b5090565b600080600d61142f7f000000000000000000000000000000000000000000000000000000000000000060ff87166119d1565b8154811061143f5761143f611835565b6000918252602090912001546001600160a01b03169150600d7f000000000000000000000000000000000000000000000000000000000000000061148460018261174a565b6114919060ff87166119d1565b6114be7f000000000000000000000000000000000000000000000000000000000000000060ff89166119d1565b6114c89190611822565b6114d291906119d1565b815481106114e2576114e2611835565b60009182526020909120015491946001600160a01b03909216935090915050565b803560ff8116811461151457600080fd5b919050565b6000806040838503121561152c57600080fd5b61153583611503565b9150602083013567ffffffffffffffff8116811461155257600080fd5b809150509250929050565b803563ffffffff8116811461151457600080fd5b60008060006060848603121561158657600080fd5b61158f84611503565b925061159d6020850161155d565b9150604084013590509250925092565b6000806000606084860312156115c257600080fd5b6115cb84611503565b92506115d960208501611503565b915060408401358060070b81146115ef57600080fd5b809150509250925092565b6001600160801b038116811461160f57600080fd5b50565b6000806000806080858703121561162857600080fd5b61163185611503565b935061163f60208601611503565b925061164d6040860161155d565b9150606085013561165d816115fa565b939692955090935050565b6000806040838503121561167b57600080fd5b61168483611503565b915061169260208401611503565b90509250929050565b6000806000606084860312156116b057600080fd5b6116b984611503565b92506116c760208501611503565b91506116d56040850161155d565b90509250925092565b6000602082840312156116f057600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103600083128015838313168383128216171561172d5761172d6116f7565b5092915050565b634e487b7160e01b600052600160045260246000fd5b8181038181111561175d5761175d6116f7565b92915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff8084168061179057611790611763565b92169190910692915050565b8051801515811461151457600080fd5b600080600080608085870312156117c257600080fd5b6117cb8561179c565b935060208501516117db816115fa565b60408601519093506117ec816115fa565b606086015190925061165d816115fa565b6000806040838503121561181057600080fd5b825191506020830151611552816115fa565b8082018082111561175d5761175d6116f7565b634e487b7160e01b600052603260045260246000fd5b6000806000806080858703121561186157600080fd5b505082516020840151604085015160609095015191969095509092509050565b80820182811260008312801582168215821617156118a1576118a16116f7565b505092915050565b6000600182016118bb576118bb6116f7565b5060010190565b63ffffffff9390931683526001600160a01b039190911660208301526001600160801b0316604082015260600190565b6001600160a01b039485168152928416602084015263ffffffff919091166040830152909116606082015260800190565b6000806000806080858703121561193957600080fd5b6119428561179c565b93506119506020860161179c565b92506040850151611960816115fa565b6060959095015193969295505050565b60006020828403121561198257600080fd5b815180600b0b811461199357600080fd5b9392505050565b600b81810b9083900b016b7fffffffffffffffffffffff81136b7fffffffffffffffffffffff198212171561175d5761175d6116f7565b6000826119e0576119e0611763565b500690565b634e487b7160e01b600052604160045260246000fdfea2646970667358221220fc95c9431a251d3ffc7110af17f5231bf132539672c968f8448f9c77094a1d1764736f6c63430008130033
## SuperTokenHotFuzz
	uses: ['SuperfluidCFAv1DeployerLibrary', 'TokenDeployerLibrary', 'SuperfluidNFTLogicDeployerLibrary', 'SuperTokenDeployerLibrary', 'SuperfluidHostDeployerLibrary', 'SuperfluidIDAv1DeployerLibrary', 'ProxyDeployerLibrary', 'CFAv1ForwarderDeployerLibrary', 'IDAv1ForwarderDeployerLibrary', 'SuperfluidLoaderDeployerLibrary', 'SuperfluidPeripheryDeployerLibrary', 'SuperfluidGovDeployerLibrary']
	runtime bytecode: 608060405234801561001057600080fd5b50600436106100575760003560e01c806314e0cdda1461005c5780633179f0e614610071578063386577631461008d57806341df636d146100a0578063de65ac6b146100a8575b600080fd5b61006f61006a366004610b26565b6100b0565b005b6100796102f7565b604051901515815260200160405180910390f35b61006f61009b366004610b26565b610416565b610079610637565b610079610770565b60008167ffffffffffffffff16116100c757600080fd5b60006100d28361088a565b905060006100df826108e6565b90508267ffffffffffffffff168112156100f857600080fd5b6040516370a0823160e01b81526001600160a01b0383811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610163573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101879190610b72565b604051634091c42f60e01b815267ffffffffffffffff861660048201529091506001600160a01b03841690634091c42f90602401600060405180830381600087803b1580156101d557600080fd5b505af11580156101e9573d6000803e3d6000fd5b5050505060006101f8846108e6565b6040516370a0823160e01b81526001600160a01b0386811660048301529192506000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102889190610b72565b90506102948382610ba1565b8667ffffffffffffffff16146102ac576102ac610bc8565b6102b68285610ba1565b6102c08483610ba1565b146102cd576102cd610bc8565b8567ffffffffffffffff16600f60008282546102e99190610bde565b909155505050505050505050565b6000600f547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561035a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061037e9190610b72565b1461038b5761038b610bc8565b600f547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104109190610b72565b14905090565b60008167ffffffffffffffff161161042d57600080fd5b60006104388361088a565b90506000610445826108e6565b6040516370a0823160e01b81526001600160a01b0384811660048301529192506000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156104b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d59190610b72565b6040516308ffe02760e01b815267ffffffffffffffff861660048201529091506001600160a01b038416906308ffe02790602401600060405180830381600087803b15801561052357600080fd5b505af1158015610537573d6000803e3d6000fd5b505050506000610546846108e6565b6040516370a0823160e01b81526001600160a01b0386811660048301529192506000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156105b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d69190610b72565b90506105e28184610ba1565b8667ffffffffffffffff16146105fa576105fa610bc8565b6106048483610ba1565b61060e8285610ba1565b1461061b5761061b610bc8565b8567ffffffffffffffff16600f60008282546102e99190610bf7565b6000808061064361097f565b905060005b81518110156107545760008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632ec8eec786868151811061069757610697610c0a565b60200260200101516040518263ffffffff1660e01b81526004016106ca91906001600160a01b0391909116815260200190565b608060405180830381865afa1580156106e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070b9190610c20565b5092509250925080821161072057600061072a565b61072a8183610ba1565b6107349084610c56565b61073e9087610c56565b95505050508061074d90610c7e565b9050610648565b5081600f541461076657610766610bc8565b50600f5414919050565b6000808061077c61097f565b905060005b815181101561086c5760025482516001600160a01b039091169063e8e7e2d1907f0000000000000000000000000000000000000000000000000000000000000000908590859081106107d5576107d5610c0a565b60200260200101516040518363ffffffff1660e01b815260040161080f9291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa15801561082c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108509190610c97565b61085a9084610cc1565b925061086581610c7e565b9050610781565b5081600b0b60001461088057610880610bc8565b50600b0b15919050565b6000600d6108bb7f000000000000000000000000000000000000000000000000000000000000000060ff8516610cf8565b815481106108cb576108cb610c0a565b6000918252602090912001546001600160a01b031692915050565b604051632ec8eec760e01b81526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690632ec8eec790602401608060405180830381865afa158015610951573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109759190610c20565b5091949350505050565b600e546060906109af907f0000000000000000000000000000000000000000000000000000000000000000610bf7565b67ffffffffffffffff8111156109c7576109c7610d1a565b6040519080825280602002602001820160405280156109f0578160200160208202803683370190505b50905060005b7f0000000000000000000000000000000000000000000000000000000000000000811015610a8957600d8181548110610a3157610a31610c0a565b9060005260206000200160009054906101000a90046001600160a01b0316828281518110610a6157610a61610c0a565b6001600160a01b0390921660209283029190910190910152610a8281610c7e565b90506109f6565b5060005b600e54811015610b2257600e8181548110610aaa57610aaa610c0a565b6000918252602090912001546001600160a01b031682610aea7f000000000000000000000000000000000000000000000000000000000000000084610bf7565b81518110610afa57610afa610c0a565b6001600160a01b0390921660209283029190910190910152610b1b81610c7e565b9050610a8d565b5090565b60008060408385031215610b3957600080fd5b823560ff81168114610b4a57600080fd5b9150602083013567ffffffffffffffff81168114610b6757600080fd5b809150509250929050565b600060208284031215610b8457600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181036000831280158383131683831282161715610bc157610bc1610b8b565b5092915050565b634e487b7160e01b600052600160045260246000fd5b81810381811115610bf157610bf1610b8b565b92915050565b80820180821115610bf157610bf1610b8b565b634e487b7160e01b600052603260045260246000fd5b60008060008060808587031215610c3657600080fd5b505082516020840151604085015160609095015191969095509092509050565b8082018281126000831280158216821582161715610c7657610c76610b8b565b505092915050565b600060018201610c9057610c90610b8b565b5060010190565b600060208284031215610ca957600080fd5b815180600b0b8114610cba57600080fd5b9392505050565b600b81810b9083900b016b7fffffffffffffffffffffff81136b7fffffffffffffffffffffff1982121715610bf157610bf1610b8b565b600082610d1557634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052604160045260246000fdfea2646970667358221220ba3d1078a7de7b98442a31f38dbdc103845b0f510f05f5b0b767ef98fd036eaa64736f6c63430008130033

@hellwolf
Copy link

hellwolf commented Jul 24, 2023

I extracted these from the above output (I used --print-libraries of crytic-compile)

$ grep -Eo '__\$[a-z0-9]+' ~/tmp/unlinked-library.txt | sort -n | uniq
__$0ca4325a4497c5d952bddb238e8b4ce961
__$100e900eead8761f703396da9adb9d02fb
__$19e05bb61541bb47e59f1d01c8fc474939
__$29bfd6d2f1b844495450d685faea9e543e
__$427843469579e60d1d63eed3ffc26a7f39
__$4ee71b956ec4d3c70a32eaf0cf2f7fe5ff
__$5b3c2c3af32bb84e8dfcf888ba6e793ada
__$89775cdd39a3bf6782bb7d0b41e5f2a8cf
__$8c2e45707028db74379ce75cf7ce73f00c
__$8feb492d5ab16bc1ab1a47e3c40c7b6b72
__$a87cd658f18cfcfcaadd744da84b7b2d3a
__$a8dc14dd180b6fc11141960b4b3fcd72ee
__$c019f7d2e8192ab61753db9130e1c2a9cc

@ggrieco-tob
Copy link
Member Author

It seems like an issue in crytic-compile, right? There should be no unlinked libraries, assuming you list them all.

@hellwolf
Copy link

I don't know what's the expected behavior from crytic-compile though. I can do a small repo real quick

@hellwolf
Copy link

$ mkdir crytic-compile-with-libs/
$ cd crytic-compile-with-libs/
$ forge init
$ vim src/SomeLib.sol
$ cat src/SomeLib.sol
library SomeLib {
    function foo() external returns (bool) { return false; }
}
$ vim src/Counter.sol
$ cat src/Counter.sol 
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import "./SomeLib.sol";

contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
        if (SomeLib.foo()) {
            number = newNumber;
        }
    }

    function increment() public {
        number++;
    }
}
$ crytic-compile . --compile-libraries "(SomeLib, 0xf1)"  --print-libraries
INFO:CryticCompile:'forge clean' running (wd: /home/hellwolf/tmp/crytic-compile-with-libs)
INFO:CryticCompile:'forge build --build-info' running (wd: /home/hellwolf/tmp/crytic-compile-with-libs)
Compilation unit: 91e453ad661aa51dd4a4f01677e87634 solc 0.8.19)
{'SomeLib': 241}
## Counter
	uses: ['SomeLib']
	runtime bytecode: 608060405234801561001057600080fd5b50600436106100415760003560e01c80633fb5c1cb146100465780638381f58a1461005b578063d09de08a14610076575b600080fd5b61005961005436600461010f565b61007e565b005b61006460005481565b60405190815260200160405180910390f35b6100596100f9565b7300000000000000000000000000000000000000f163c29855786040518163ffffffff1660e01b8152600401602060405180830381865af41580156100c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100eb9190610128565b156100f65760008190555b50565b60008054908061010883610151565b9190505550565b60006020828403121561012157600080fd5b5035919050565b60006020828403121561013a57600080fd5b8151801515811461014a57600080fd5b9392505050565b60006001820161017157634e487b7160e01b600052601160045260246000fd5b506001019056fea264697066735822122002cfce28c7e87c52c07dc48b66d8a765e1dfeae896eecceceb3b70b02c6dcd1064736f6c63430008130033
## CounterTest
	uses: ['SomeLib']
	runtime bytecode: 608060405234801561001057600080fd5b50600436106100ea5760003560e01c806385226c811161008c578063b913a5ca11610066578063b913a5ca1461019f578063ba414fa6146101a7578063e20c9f71146101bf578063fa7626d4146101c757600080fd5b806385226c811461017a578063916a17c61461018f578063b5508aa91461019757600080fd5b80633f7286f4116100c85780633f7286f41461011f57806361bc221a1461012757806366d9a9a01461015257806370f985be1461016757600080fd5b80630a9254e4146100ef5780631ed7831c146100f95780633e5e3c2314610117575b600080fd5b6100f76101d4565b005b61010161026d565b60405161010e9190610c9f565b60405180910390f35b6101016102cf565b61010161032f565b601b5461013a906001600160a01b031681565b6040516001600160a01b03909116815260200161010e565b61015a61038f565b60405161010e9190610cec565b6100f7610175366004610d9f565b61047e565b61018261055f565b60405161010e9190610ddc565b61015a61062f565b610182610715565b6100f76107e5565b6101af6108d0565b604051901515815260200161010e565b6101016109fb565b6000546101af9060ff1681565b6040516101e090610c92565b604051809103906000f0801580156101fc573d6000803e3d6000fd5b50601b80546001600160a01b0319166001600160a01b03929092169182179055604051633fb5c1cb60e01b815260006004820152633fb5c1cb90602401600060405180830381600087803b15801561025357600080fd5b505af1158015610267573d6000803e3d6000fd5b50505050565b6060600d8054806020026020016040519081016040528092919081815260200182805480156102c557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116102a7575b5050505050905090565b6060600f8054806020026020016040519081016040528092919081815260200182805480156102c5576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116102a7575050505050905090565b6060600e8054806020026020016040519081016040528092919081815260200182805480156102c5576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116102a7575050505050905090565b60606012805480602002602001604051908101604052809291908181526020016000905b828210156104755760008481526020908190206040805180820182526002860290920180546001600160a01b0316835260018101805483518187028101870190945280845293949193858301939283018282801561045d57602002820191906000526020600020906000905b82829054906101000a900460e01b6001600160e01b0319168152602001906004019060208260030104928301926001038202915080841161041f5790505b505050505081525050815260200190600101906103b3565b50505050905090565b601b54604051633fb5c1cb60e01b8152600481018390526001600160a01b0390911690633fb5c1cb90602401600060405180830381600087803b1580156104c457600080fd5b505af11580156104d8573d6000803e3d6000fd5b5050505061055c601b60009054906101000a90046001600160a01b03166001600160a01b0316638381f58a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610532573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105569190610e56565b82610a5b565b50565b60606011805480602002602001604051908101604052809291908181526020016000905b828210156104755783829060005260206000200180546105a290610e6f565b80601f01602080910402602001604051908101604052809291908181526020018280546105ce90610e6f565b801561061b5780601f106105f05761010080835404028352916020019161061b565b820191906000526020600020905b8154815290600101906020018083116105fe57829003601f168201915b505050505081526020019060010190610583565b60606013805480602002602001604051908101604052809291908181526020016000905b828210156104755760008481526020908190206040805180820182526002860290920180546001600160a01b031683526001810180548351818702810187019094528084529394919385830193928301828280156106fd57602002820191906000526020600020906000905b82829054906101000a900460e01b6001600160e01b031916815260200190600401906020826003010492830192600103820291508084116106bf5790505b50505050508152505081526020019060010190610653565b60606010805480602002602001604051908101604052809291908181526020016000905b8282101561047557838290600052602060002001805461075890610e6f565b80601f016020809104026020016040519081016040528092919081815260200182805461078490610e6f565b80156107d15780601f106107a6576101008083540402835291602001916107d1565b820191906000526020600020905b8154815290600101906020018083116107b457829003601f168201915b505050505081526020019060010190610739565b601b60009054906101000a90046001600160a01b03166001600160a01b031663d09de08a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561083557600080fd5b505af1158015610849573d6000803e3d6000fd5b505050506108ce601b60009054906101000a90046001600160a01b03166001600160a01b0316638381f58a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c79190610e56565b6001610a5b565b565b60008054610100900460ff16156108f05750600054610100900460ff1690565b6000737109709ecfa91a80626ff3989d68f67f5b1dd12d3b156109f65760408051737109709ecfa91a80626ff3989d68f67f5b1dd12d602082018190526519985a5b195960d21b8284015282518083038401815260608301909352600092909161097e917f667f9d70ca411d70ead50d8d5c22070dafc36ad75f3dcf5e7237b22ade9aecc491608001610ea9565b60408051601f198184030181529082905261099891610eda565b6000604051808303816000865af19150503d80600081146109d5576040519150601f19603f3d011682016040523d82523d6000602084013e6109da565b606091505b50915050808060200190518101906109f29190610ef6565b9150505b919050565b6060600c8054806020026020016040519081016040528092919081815260200182805480156102c5576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116102a7575050505050905090565b808214610b82577f41304facd9323d75b11bcdd609cb38effffdb05710f7caf0e9b16c6d9d709f50604051610acc9060208082526022908201527f4572726f723a2061203d3d2062206e6f7420736174697366696564205b75696e604082015261745d60f01b606082015260800190565b60405180910390a160408051818152600a81830152690808080808081319599d60b21b60608201526020810184905290517fb2de2fbe801a0df6c0cbddfd448ba3c41d48a040ca35c56c8196ef0fcae721a89181900360800190a160408051818152600a81830152690808080808149a59da1d60b21b60608201526020810183905290517fb2de2fbe801a0df6c0cbddfd448ba3c41d48a040ca35c56c8196ef0fcae721a89181900360800190a1610b82610b86565b5050565b737109709ecfa91a80626ff3989d68f67f5b1dd12d3b15610c815760408051737109709ecfa91a80626ff3989d68f67f5b1dd12d602082018190526519985a5b195960d21b9282019290925260016060820152600091907f70ca10bbd0dbfd9020a9f4b13402c16cb120705e0d1c0aeab10fa353ae586fc49060800160408051601f1981840301815290829052610c209291602001610ea9565b60408051601f1981840301815290829052610c3a91610eda565b6000604051808303816000865af19150503d8060008114610c77576040519150601f19603f3d011682016040523d82523d6000602084013e610c7c565b606091505b505050505b6000805461ff001916610100179055565b6101ce80610f2083390190565b6020808252825182820181905260009190848201906040850190845b81811015610ce05783516001600160a01b031683529284019291840191600101610cbb565b50909695505050505050565b60006020808301818452808551808352604092508286019150828160051b8701018488016000805b84811015610d9057898403603f19018652825180516001600160a01b03168552880151888501889052805188860181905290890190839060608701905b80831015610d7b5783516001600160e01b0319168252928b019260019290920191908b0190610d51565b50978a01979550505091870191600101610d14565b50919998505050505050505050565b600060208284031215610db157600080fd5b5035919050565b60005b83811015610dd3578181015183820152602001610dbb565b50506000910152565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015610e4957878503603f1901845281518051808752610e2a818989018a8501610db8565b601f01601f191695909501860194509285019290850190600101610e03565b5092979650505050505050565b600060208284031215610e6857600080fd5b5051919050565b600181811c90821680610e8357607f821691505b602082108103610ea357634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160e01b0319831681528151600090610ecc816004850160208701610db8565b919091016004019392505050565b60008251610eec818460208701610db8565b9190910192915050565b600060208284031215610f0857600080fd5b81518015158114610f1857600080fd5b939250505056fe608060405234801561001057600080fd5b506101ae806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80633fb5c1cb146100465780638381f58a1461005b578063d09de08a14610076575b600080fd5b61005961005436600461010f565b61007e565b005b61006460005481565b60405190815260200160405180910390f35b6100596100f9565b7300000000000000000000000000000000000000f163c29855786040518163ffffffff1660e01b8152600401602060405180830381865af41580156100c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100eb9190610128565b156100f65760008190555b50565b60008054908061010883610151565b9190505550565b60006020828403121561012157600080fd5b5035919050565b60006020828403121561013a57600080fd5b8151801515811461014a57600080fd5b9392505050565b60006001820161017157634e487b7160e01b600052601160045260246000fd5b506001019056fea264697066735822122002cfce28c7e87c52c07dc48b66d8a765e1dfeae896eecceceb3b70b02c6dcd1064736f6c63430008130033a2646970667358221220c25ceb4553cc9e6499e308d43fe88d34ebd5d645b8faae5bb1c849c05c2c0c4664736f6c63430008130033

@hellwolf
Copy link

Indeed, for a small example --compile-libraries seems have worked.

@hellwolf
Copy link

Did I hit some limitation?

@hellwolf
Copy link

hellwolf commented Jul 24, 2023

Feel free to try to reproduce here, I am calling a day.

https://github.com/superfluid-finance/protocol-monorepo/tree/gda-slither

$ forge --version
forge 0.2.0 (d369d24 2023-07-02T00:04:36.063287050Z)
$ crytic-compile --version
0.3.3
$ # some fixes
$ ll lib packages
lrwxrwxrwx 1 hellwolf hellwolf  9 Jul 24 12:58 lib -> ../../lib/
lrwxrwxrwx 1 hellwolf hellwolf 14 Jul 24 12:58 packages -> ../../packages/
$ ll node_modules/@openzeppelin
lrwxrwxrwx 1 hellwolf hellwolf 35 Jul 24 22:10 'node_modules/@openzeppelin' -> '../../../node_modules/@openzeppelin'/
$ cd packages/ethereum-contracts
$ crytic-compile --compile-force-framework=foundry --foundry-out-directory=build/foundry/out --compile-libraries "(SlotsBitmapLibrary,0xf01),(SuperfluidLoaderLibrary,0xf02),(SuperfluidPoolDeployerLibrary,0xf03),(CFAv1ForwarderDeployerLibrary,0xf11),(GDAv1ForwarderDeployerLibrary,0xf12),(IDAv1ForwarderDeployerLibrary,0xf13),(ProxyDeployerLibrary,0xf14),(SuperfluidCFAv1DeployerLibrary,0xf15),(SuperfluidFlowNFTLogicDeployerLibrary,0xf16),(SuperfluidGDAv1DeployerLibrary,0xf17),(SuperfluidGovDeployerLibrary,0xf18),(SuperfluidHostDeployerLibrary,0xf19),(SuperfluidIDAv1DeployerLibrary,0xf1a),(SuperfluidLoaderDeployerLibrary,0xf1b),(SuperfluidPeripheryDeployerLibrary,0xf1c),(SuperfluidPoolLogicDeployerLibrary,0xf1d),(SuperfluidPoolNFTLogicDeployerLibrary,0xf1e),(SuperTokenDeployerLibrary,0xf1f),(TokenDeployerLibrary,0xf20)" . --print-libraries | grep -Eo '__\$[a-z0-9]+' | sort | uniq
INFO:CryticCompile:'forge clean' running (wd: /home/hellwolf/Projects/superfluid/protocol-monorepo_dev/packages/ethereum-contracts)
INFO:CryticCompile:'forge build --build-info' running (wd: /home/hellwolf/Projects/superfluid/protocol-monorepo_dev/packages/ethereum-contracts)
__$0ca4325a4497c5d952bddb238e8b4ce961
__$100e900eead8761f703396da9adb9d02fb
__$19e05bb61541bb47e59f1d01c8fc474939
__$427843469579e60d1d63eed3ffc26a7f39
__$4ee71b956ec4d3c70a32eaf0cf2f7fe5ff
__$5b3c2c3af32bb84e8dfcf888ba6e793ada
__$89775cdd39a3bf6782bb7d0b41e5f2a8cf
__$8c2e45707028db74379ce75cf7ce73f00c
__$8feb492d5ab16bc1ab1a47e3c40c7b6b72
__$90e65ccb0938bf1e34b7be8102067e9391
__$a87cd658f18cfcfcaadd744da84b7b2d3a
__$a8dc14dd180b6fc11141960b4b3fcd72ee
__$b0b3ccb998a7235857b503897f9871f8cb
__$c019f7d2e8192ab61753db9130e1c2a9cc
__$c9fcb39e1bd49df1cf846adede239d21ac
__$cb4f1a538a90ca943edd90a0a3c479880e
__$e829b68835a801fe0af30787ae718d5081
__$ecd852aa7cc122211744529383fc11049f

@hellwolf
Copy link

Should I create a bug report to crytic-compile?

@ggrieco-tob
Copy link
Member Author

Yes, please, create a crytic-compile report and link it here.

@hellwolf
Copy link

@0xalpharush
Copy link

@hellwolf The issue is that the addresses provided e.g. 0xf01 are not matched by the regex. It expects hexadecimal values less than or equal to 255 i.e. 0x00 - 0xff. I'm not sure the reason for this restriction and perhaps it can be lifted cc @montyly. Unfortunately, the error message was not shown correctly, and I'll need to submit a fix for that.

@hellwolf
Copy link

@hellwolf The issue is that the addresses provided e.g. 0xf01 are not matched by the regex. It expects hexadecimal values less than or equal to 255 i.e. 0x00 - 0xff. I'm not sure the reason for this restriction and perhaps it can be lifted cc @montyly. Unfortunately, the error message was not shown correctly, and I'll need to submit a fix for that.

Thanks for the fast response.

And I see. I haven't done deeper investigation, but I haven't found any sign that there is any "canonical" way of defining library holes. You may say defacto standard is from foundry for now, but truffle do differ; I haven't tried hardhat neither. I would be in favor of not "pretending" there is a "canonical" format in absence of any evident of that.

@ggrieco-tob
Copy link
Member Author

@hellwolf Is the workaround of using values smaller than 0xff working for you?

@hellwolf
Copy link

hellwolf commented Sep 1, 2023

@ggrieco-tob I am not sure if it would still be a problem any more since crytic/crytic-compile#477 had been merged.

@ggrieco-tob
Copy link
Member Author

We have some documentation for a workaround, let's close it

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants