diff --git a/build.rs b/build.rs index 8bfdc6e8..5c3ae138 100644 --- a/build.rs +++ b/build.rs @@ -3,10 +3,8 @@ use std::io::{self, Write}; use std::path::Path; const TEMPLATES_DIR: &str = "src/new/templates"; -const CHAIN_KINOSTATE_DIR: &str = "src/chain/kinostate"; const TARGET_DIR: &str = "target"; const NEW_INCLUDES: &str = "new_includes.rs"; -const CHAIN_INCLUDES: &str = "chain_includes.rs"; /// create target/new_includes.rs to build templates into binary fn make_new_includes() -> anyhow::Result<()> { @@ -85,49 +83,6 @@ fn visit_dirs(dir: &Path, output_buffer: &mut Vec) -> io::Result<()> { Ok(()) } -fn make_chain_includes() -> anyhow::Result<()> { - let mut output_buffer = Vec::new(); - writeln!( - &mut output_buffer, - "const FOUNDRY_COMMIT_TO_CONTENT: &[(&str, &str)] = &[" - )?; - - for entry in fs::read_dir(CHAIN_KINOSTATE_DIR)? { - let entry = entry?; - let path = entry.path(); - let commit = path - .file_stem() - .and_then(|c| c.to_str()) - .ok_or_else(|| anyhow::anyhow!("couldn't get commit from {path:?}"))?; - writeln!( - output_buffer, - " (\"{}\", include_str!(\"{}\")),", - commit, - Path::new("..").join(&path).display(), - )?; - println!("cargo::rerun-if-changed={}", path.display()); - } - - writeln!(&mut output_buffer, "];")?; - - let target_dir = Path::new(TARGET_DIR); - let chain_output_path = target_dir.join(CHAIN_INCLUDES); - // create *_includes.rs if it does not exist - if !target_dir.exists() { - fs::create_dir_all(target_dir)?; - } - if !chain_output_path.exists() { - fs::write(&chain_output_path, &output_buffer)?; - } else { - let existing_file = fs::read(&chain_output_path)?; - if output_buffer != existing_file { - fs::write(&chain_output_path, &output_buffer)?; - } - } - - Ok(()) -} - fn add_commit_hash(repo: &git2::Repository) -> anyhow::Result<()> { let sha = repo .head()? @@ -152,7 +107,6 @@ fn add_branch_name(repo: &git2::Repository) -> anyhow::Result<()> { fn main() -> anyhow::Result<()> { make_new_includes()?; - make_chain_includes()?; // write version info into binary let repo = git2::Repository::open(".")?; diff --git a/src/chain/bytecode/deploykinoaccountminter.txt b/src/chain/bytecode/deploykinoaccountminter.txt new file mode 100644 index 00000000..58d1cf18 --- /dev/null +++ b/src/chain/bytecode/deploykinoaccountminter.txt @@ -0,0 +1 @@ +0x000000000000000000000000000000000000000000000000000000000000123460e06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610042575f5ffd5b50604051613ab3380380613ab3833981810160405281019061006491906101cc565b808073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250507fff62b5f493ba6ce7c217bb31befa418a559dcb03d1d0c0eec2771445154d69a86040518060400160405280601181526020017f4549503731324b696e6f4163636f756e74000000000000000000000000000000815250805190602001206040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525080519060200120463060405160200161014a959493929190610236565b6040516020818303038152906040528051906020012060a081815250505050610287565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61019b82610172565b9050919050565b6101ab81610191565b81146101b5575f5ffd5b50565b5f815190506101c6816101a2565b92915050565b5f602082840312156101e1576101e061016e565b5b5f6101ee848285016101b8565b91505092915050565b5f819050919050565b610209816101f7565b82525050565b5f819050919050565b6102218161020f565b82525050565b61023081610191565b82525050565b5f60a0820190506102495f830188610200565b6102566020830187610200565b6102636040830186610200565b6102706060830185610218565b61027d6080830184610227565b9695505050505050565b60805160a05160c0516137ed6102c65f395f8181610cab015261112d01525f610b7e01525f8181611484015281816114d9015261185501526137ed5ff3fe608060405260043610610142575f3560e01c80635b64a054116100b5578063bc197c811161006e578063bc197c811461048f578063c19d93fb146104cb578063ca3b98bb146104f5578063d087d28814610525578063f23a6e611461054f578063fc0c546a1461058b57610149565b80635b64a054146103835780636d70f7ae146103bf5780637f587930146103fb5780638129fc1c14610425578063ad3cb1cc1461043b578063b0d691fe1461046557610149565b80631626ba7e116101075780631626ba7e1461025957806319822f7c146102955780634f1ef286146102d157806351945447146102ed578063523e32601461031d57806352d1902d1461035957610149565b806223de291461014d57806301ffc9a714610175578063094cefed146101b1578063144fb5a8146101e1578063150b7a021461021d57610149565b3661014957005b5f5ffd5b348015610158575f5ffd5b50610173600480360381019061016e919061231d565b6105b7565b005b348015610180575f5ffd5b5061019b6004803603810190610196919061243c565b6105c1565b6040516101a89190612481565b60405180910390f35b6101cb60048036038101906101c6919061249a565b61063a565b6040516101d8919061254c565b60405180910390f35b3480156101ec575f5ffd5b5061020760048036038101906102029190612587565b610655565b604051610214919061254c565b60405180910390f35b348015610228575f5ffd5b50610243600480360381019061023e919061263f565b6107be565b60405161025091906126d2565b60405180910390f35b348015610264575f5ffd5b5061027f600480360381019061027a9190612856565b610854565b60405161028c91906126d2565b60405180910390f35b3480156102a0575f5ffd5b506102bb60048036038101906102b691906128cf565b6109a7565b6040516102c8919061294a565b60405180910390f35b6102eb60048036038101906102e69190612963565b6109d9565b005b610307600480360381019061030291906129f3565b6109f8565b6040516103149190612ad7565b60405180910390f35b348015610328575f5ffd5b50610343600480360381019061033e9190612af7565b610aa8565b60405161035091906126d2565b60405180910390f35b348015610364575f5ffd5b5061036d610ad1565b60405161037a9190612b63565b60405180910390f35b34801561038e575f5ffd5b506103a960048036038101906103a49190612b7c565b610b02565b6040516103b69190612b63565b60405180910390f35b3480156103ca575f5ffd5b506103e560048036038101906103e09190612c33565b610bb1565b6040516103f29190612481565b60405180910390f35b348015610406575f5ffd5b5061040f610ca8565b60405161041c9190612cb9565b60405180910390f35b348015610430575f5ffd5b50610439610ccf565b005b348015610446575f5ffd5b5061044f610e4e565b60405161045c9190612d24565b60405180910390f35b348015610470575f5ffd5b50610479610e87565b6040516104869190612d64565b60405180910390f35b34801561049a575f5ffd5b506104b560048036038101906104b09190612dd2565b610ea2565b6040516104c291906126d2565b60405180910390f35b3480156104d6575f5ffd5b506104df610eb9565b6040516104ec919061294a565b60405180910390f35b61050f600480360381019061050a9190612ea9565b610f40565b60405161051c9190612ad7565b60405180910390f35b348015610530575f5ffd5b50610539610fff565b604051610546919061294a565b60405180910390f35b34801561055a575f5ffd5b5061057560048036038101906105709190612f3f565b611086565b60405161058291906126d2565b60405180910390f35b348015610596575f5ffd5b5061059f61109b565b6040516105ae93929190612fd5565b60405180910390f35b5050505050505050565b5f6105cb826110b1565b8061063357507fb8167f3d000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b5f61064987878787878761112a565b90509695505050505050565b5f5f6106788989898989898960600160208101906106739190612c33565b610b02565b90505f610684826111da565b90505f6106b7855f01602081019061069c919061300a565b866020013587604001358561120d909392919063ffffffff16565b90508460600160208101906106cc9190612c33565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461074f57808560600160208101906107129190612c33565b6040517f42d750dc000000000000000000000000000000000000000000000000000000008152600401610746929190613035565b60405180910390fd5b5f5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81548092919061079b90613089565b91905055506107ae8b8b8b8b8b8b61112a565b9350505050979650505050505050565b5f5f5f6107c961109b565b92509250508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561080857508086145b1561083f576040517fb79e3f3f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63150b7a0260e01b9250505095945050505050565b5f5f5f5f6108618561123b565b8094508195508293505050505f8160ff1603610968575f835f1c90506060602084880101905061089082610bb1565b1580156108c957503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156108e25763ffffffff60e01b955050505050506109a1565b8173ffffffffffffffffffffffffffffffffffffffff16631626ba7e89836040518363ffffffff1660e01b815260040161091d9291906130d0565b602060405180830381865afa158015610938573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095c9190613112565b955050505050506109a1565b61097c6109778783868661120d565b610bb1565b1561099357631626ba7e60e01b93505050506109a1565b63ffffffff60e01b93505050505b92915050565b5f6109b061125c565b6109ba84846112d3565b90506109c9846020013561139c565b6109d2826113eb565b9392505050565b6109e1611482565b6109ea82611568565b6109f482826115eb565b5050565b6060610a0333610bb1565b158015610a435750610a13610e87565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610a7a576040517f8f0052a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610a8987878787875a611709565b809350819250505080610a9e57815160208301fd5b5095945050505050565b5f610ab284610bb1565b610abf575f60e01b610ac8565b63523e326060e01b5b90509392505050565b5f610ada611853565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f5f88305f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20548a8a8a8a8a8a604051602001610b61999897969594939291906131d0565b604051602081830303815290604052805190602001209050610ba37f0000000000000000000000000000000000000000000000000000000000000000826118da565b915050979650505050505050565b5f5f5f610bbc61109b565b92509250508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610c11919061294a565b602060405180830381865afa158015610c2c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c509190613260565b73ffffffffffffffffffffffffffffffffffffffff16148015610c9f57505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b92505050919050565b5f7f0000000000000000000000000000000000000000000000000000000000000000905090565b5f610cd861191a565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f5f8267ffffffffffffffff16148015610d205750825b90505f60018367ffffffffffffffff16148015610d5357505f3073ffffffffffffffffffffffffffffffffffffffff163b145b905081158015610d61575080155b15610d98576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315610de5576001855f0160086101000a81548160ff0219169083151502179055505b610ded611941565b8315610e47575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d26001604051610e3e91906132d7565b60405180910390a15b5050505050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b5f735ff137d4b0fdcd49dca30c7cf57e578a026d2789905090565b5f63bc197c8160e01b905098975050505050505050565b5f610ec2610e87565b73ffffffffffffffffffffffffffffffffffffffff166335567e1a305f6040518363ffffffff1660e01b8152600401610efc92919061334c565b602060405180830381865afa158015610f17573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f3b9190613387565b905090565b6060610f4b33610bb1565b158015610f8b5750610f5b610e87565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610fc2576040517f8f0052a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610fdf88888888885f8914610fd85788610fda565b5a5b611709565b809350819250505080610ff457815160208301fd5b509695505050505050565b5f611008610e87565b73ffffffffffffffffffffffffffffffffffffffff166335567e1a305f6040518363ffffffff1660e01b815260040161104292919061334c565b602060405180830381865afa15801561105d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110819190613387565b905090565b5f63f23a6e6160e01b90509695505050505050565b5f5f5f6110a661194b565b925092509250909192565b5f6110bb82611962565b8061112357507f6faff5f1000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663094cefed8888888888886040518763ffffffff1660e01b815260040161118e969594939291906133de565b6020604051808303815f875af11580156111aa573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ce9190613260565b90509695505050505050565b5f7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f5281601c52603c5f209050919050565b5f5f5f5f61121d88888888611bd3565b92509250925061122d8282611cba565b829350505050949350505050565b5f5f5f602084015191506040840151905060608401515f1a92509193909250565b611264610e87565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c89061347d565b60405180910390fd5b565b5f5f6112de836111da565b9050631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916611363828680610100019061131c91906134a7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050610854565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611391576001915050611396565b5f9150505b92915050565b67ffffffffffffffff801681106113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df90613553565b60405180910390fd5b50565b5f811461147f575f3373ffffffffffffffffffffffffffffffffffffffff16827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060405161143990613594565b5f60405180830381858888f193505050503d805f8114611474576040519150601f19603f3d011682016040523d82523d5f602084013e611479565b606091505b50509050505b50565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148061152f57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611516611e1c565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611566576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61157133610bb1565b1580156115b15750611581610e87565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156115e8576040517f8f0052a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561165357506040513d601f19601f8201168201806040525081019061165091906135bc565b60015b61169457816040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815260040161168b919061254c565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b81146116fa57806040517faa1d49a40000000000000000000000000000000000000000000000000000000081526004016116f19190612b63565b60405180910390fd5b6117048383611e6f565b505050565b5f60605f8460ff160361178d578773ffffffffffffffffffffffffffffffffffffffff168388888860405161173f9291906135e7565b5f60405180830381858888f193505050503d805f811461177a576040519150601f19603f3d011682016040523d82523d5f602084013e61177f565b606091505b508092508193505050611848565b60018460ff160361180c578773ffffffffffffffffffffffffffffffffffffffff168387876040516117c09291906135e7565b5f604051808303818686f4925050503d805f81146117f9576040519150601f19603f3d011682016040523d82523d5f602084013e6117fe565b606091505b508092508193505050611847565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183e90613649565b60405180910390fd5b5b965096945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16146118d8576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b611949611ee1565b565b5f5f5f61195730611f21565b925092509250909192565b5f7f3ce4a3e9000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a2c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a9457507f19822f7c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611afc57507f1626ba7e000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b6457507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611bcc57507f51945447000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b5f5f5f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115611c0f575f600385925092509250611cb0565b5f6001888888886040515f8152602001604052604051611c329493929190613676565b6020604051602081039080840390855afa158015611c52573d5f5f3e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ca3575f60015f5f1b93509350935050611cb0565b805f5f5f1b935093509350505b9450945094915050565b5f6003811115611ccd57611ccc6136b9565b5b826003811115611ce057611cdf6136b9565b5b0315611e185760016003811115611cfa57611cf96136b9565b5b826003811115611d0d57611d0c6136b9565b5b03611d44576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026003811115611d5857611d576136b9565b5b826003811115611d6b57611d6a6136b9565b5b03611daf57805f1c6040517ffce698f7000000000000000000000000000000000000000000000000000000008152600401611da6919061294a565b60405180910390fd5b600380811115611dc257611dc16136b9565b5b826003811115611dd557611dd46136b9565b5b03611e1757806040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600401611e0e9190612b63565b60405180910390fd5b5b5050565b5f611e487f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b611fa1565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e7882611faa565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f81511115611ed457611ece8282612073565b50611edd565b611edc6120f3565b5b5050565b611ee961212f565b611f1f576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f5f5f5f606067ffffffffffffffff811115611f4057611f3f612732565b5b6040519080825280601f01601f191660200182016040528015611f725781602001600182028036833780820191505090505b5090506060604d60208301873c80806020019051810190611f939190613721565b935093509350509193909250565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b0361200557806040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401611ffc919061254c565b60405180910390fd5b806120317f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b611fa1565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f5f8473ffffffffffffffffffffffffffffffffffffffff168460405161209c91906137a1565b5f60405180830381855af49150503d805f81146120d4576040519150601f19603f3d011682016040523d82523d5f602084013e6120d9565b606091505b50915091506120e985838361214d565b9250505092915050565b5f34111561212d576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f61213861191a565b5f0160089054906101000a900460ff16905090565b6060826121625761215d826121da565b6121d2565b5f825114801561218857505f8473ffffffffffffffffffffffffffffffffffffffff163b145b156121ca57836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016121c1919061254c565b60405180910390fd5b8190506121d3565b5b9392505050565b5f815111156121ec5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6122588261222f565b9050919050565b6122688161224e565b8114612272575f5ffd5b50565b5f813590506122838161225f565b92915050565b5f819050919050565b61229b81612289565b81146122a5575f5ffd5b50565b5f813590506122b681612292565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126122dd576122dc6122bc565b5b8235905067ffffffffffffffff8111156122fa576122f96122c0565b5b602083019150836001820283011115612316576123156122c4565b5b9250929050565b5f5f5f5f5f5f5f5f60c0898b03121561233957612338612227565b5b5f6123468b828c01612275565b98505060206123578b828c01612275565b97505060406123688b828c01612275565b96505060606123798b828c016122a8565b955050608089013567ffffffffffffffff81111561239a5761239961222b565b5b6123a68b828c016122c8565b945094505060a089013567ffffffffffffffff8111156123c9576123c861222b565b5b6123d58b828c016122c8565b92509250509295985092959890939650565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61241b816123e7565b8114612425575f5ffd5b50565b5f8135905061243681612412565b92915050565b5f6020828403121561245157612450612227565b5b5f61245e84828501612428565b91505092915050565b5f8115159050919050565b61247b81612467565b82525050565b5f6020820190506124945f830184612472565b92915050565b5f5f5f5f5f5f608087890312156124b4576124b3612227565b5b5f6124c189828a01612275565b965050602087013567ffffffffffffffff8111156124e2576124e161222b565b5b6124ee89828a016122c8565b9550955050604087013567ffffffffffffffff8111156125115761251061222b565b5b61251d89828a016122c8565b9350935050606061253089828a01612275565b9150509295509295509295565b6125468161224e565b82525050565b5f60208201905061255f5f83018461253d565b92915050565b5f5ffd5b5f6080828403121561257e5761257d612565565b5b81905092915050565b5f5f5f5f5f5f5f610100888a0312156125a3576125a2612227565b5b5f6125b08a828b01612275565b975050602088013567ffffffffffffffff8111156125d1576125d061222b565b5b6125dd8a828b016122c8565b9650965050604088013567ffffffffffffffff811115612600576125ff61222b565b5b61260c8a828b016122c8565b9450945050606061261f8a828b01612275565b92505060806126308a828b01612569565b91505092959891949750929550565b5f5f5f5f5f6080868803121561265857612657612227565b5b5f61266588828901612275565b955050602061267688828901612275565b9450506040612687888289016122a8565b935050606086013567ffffffffffffffff8111156126a8576126a761222b565b5b6126b4888289016122c8565b92509250509295509295909350565b6126cc816123e7565b82525050565b5f6020820190506126e55f8301846126c3565b92915050565b5f819050919050565b6126fd816126eb565b8114612707575f5ffd5b50565b5f81359050612718816126f4565b92915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61276882612722565b810181811067ffffffffffffffff8211171561278757612786612732565b5b80604052505050565b5f61279961221e565b90506127a5828261275f565b919050565b5f67ffffffffffffffff8211156127c4576127c3612732565b5b6127cd82612722565b9050602081019050919050565b828183375f83830152505050565b5f6127fa6127f5846127aa565b612790565b9050828152602081018484840111156128165761281561271e565b5b6128218482856127da565b509392505050565b5f82601f83011261283d5761283c6122bc565b5b813561284d8482602086016127e8565b91505092915050565b5f5f6040838503121561286c5761286b612227565b5b5f6128798582860161270a565b925050602083013567ffffffffffffffff81111561289a5761289961222b565b5b6128a685828601612829565b9150509250929050565b5f61012082840312156128c6576128c5612565565b5b81905092915050565b5f5f5f606084860312156128e6576128e5612227565b5b5f84013567ffffffffffffffff8111156129035761290261222b565b5b61290f868287016128b0565b93505060206129208682870161270a565b9250506040612931868287016122a8565b9150509250925092565b61294481612289565b82525050565b5f60208201905061295d5f83018461293b565b92915050565b5f5f6040838503121561297957612978612227565b5b5f61298685828601612275565b925050602083013567ffffffffffffffff8111156129a7576129a661222b565b5b6129b385828601612829565b9150509250929050565b5f60ff82169050919050565b6129d2816129bd565b81146129dc575f5ffd5b50565b5f813590506129ed816129c9565b92915050565b5f5f5f5f5f60808688031215612a0c57612a0b612227565b5b5f612a1988828901612275565b9550506020612a2a888289016122a8565b945050604086013567ffffffffffffffff811115612a4b57612a4a61222b565b5b612a57888289016122c8565b93509350506060612a6a888289016129df565b9150509295509295909350565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f612aa982612a77565b612ab38185612a81565b9350612ac3818560208601612a91565b612acc81612722565b840191505092915050565b5f6020820190508181035f830152612aef8184612a9f565b905092915050565b5f5f5f60408486031215612b0e57612b0d612227565b5b5f612b1b86828701612275565b935050602084013567ffffffffffffffff811115612b3c57612b3b61222b565b5b612b48868287016122c8565b92509250509250925092565b612b5d816126eb565b82525050565b5f602082019050612b765f830184612b54565b92915050565b5f5f5f5f5f5f5f60a0888a031215612b9757612b96612227565b5b5f612ba48a828b01612275565b975050602088013567ffffffffffffffff811115612bc557612bc461222b565b5b612bd18a828b016122c8565b9650965050604088013567ffffffffffffffff811115612bf457612bf361222b565b5b612c008a828b016122c8565b94509450506060612c138a828b01612275565b9250506080612c248a828b01612275565b91505092959891949750929550565b5f60208284031215612c4857612c47612227565b5b5f612c5584828501612275565b91505092915050565b5f819050919050565b5f612c81612c7c612c778461222f565b612c5e565b61222f565b9050919050565b5f612c9282612c67565b9050919050565b5f612ca382612c88565b9050919050565b612cb381612c99565b82525050565b5f602082019050612ccc5f830184612caa565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f612cf682612cd2565b612d008185612cdc565b9350612d10818560208601612a91565b612d1981612722565b840191505092915050565b5f6020820190508181035f830152612d3c8184612cec565b905092915050565b5f612d4e82612c88565b9050919050565b612d5e81612d44565b82525050565b5f602082019050612d775f830184612d55565b92915050565b5f5f83601f840112612d9257612d916122bc565b5b8235905067ffffffffffffffff811115612daf57612dae6122c0565b5b602083019150836020820283011115612dcb57612dca6122c4565b5b9250929050565b5f5f5f5f5f5f5f5f60a0898b031215612dee57612ded612227565b5b5f612dfb8b828c01612275565b9850506020612e0c8b828c01612275565b975050604089013567ffffffffffffffff811115612e2d57612e2c61222b565b5b612e398b828c01612d7d565b9650965050606089013567ffffffffffffffff811115612e5c57612e5b61222b565b5b612e688b828c01612d7d565b9450945050608089013567ffffffffffffffff811115612e8b57612e8a61222b565b5b612e978b828c016122c8565b92509250509295985092959890939650565b5f5f5f5f5f5f60a08789031215612ec357612ec2612227565b5b5f612ed089828a01612275565b9650506020612ee189828a016122a8565b955050604087013567ffffffffffffffff811115612f0257612f0161222b565b5b612f0e89828a016122c8565b94509450506060612f2189828a016129df565b9250506080612f3289828a016122a8565b9150509295509295509295565b5f5f5f5f5f5f60a08789031215612f5957612f58612227565b5b5f612f6689828a01612275565b9650506020612f7789828a01612275565b9550506040612f8889828a016122a8565b9450506060612f9989828a016122a8565b935050608087013567ffffffffffffffff811115612fba57612fb961222b565b5b612fc689828a016122c8565b92509250509295509295509295565b5f606082019050612fe85f83018661293b565b612ff5602083018561253d565b613002604083018461293b565b949350505050565b5f6020828403121561301f5761301e612227565b5b5f61302c848285016129df565b91505092915050565b5f6040820190506130485f83018561253d565b613055602083018461253d565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61309382612289565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036130c5576130c461305c565b5b600182019050919050565b5f6040820190506130e35f830185612b54565b81810360208301526130f58184612a9f565b90509392505050565b5f8151905061310c81612412565b92915050565b5f6020828403121561312757613126612227565b5b5f613134848285016130fe565b91505092915050565b5f8160601b9050919050565b5f6131538261313d565b9050919050565b5f61316482613149565b9050919050565b61317c6131778261224e565b61315a565b82525050565b5f819050919050565b61319c61319782612289565b613182565b82525050565b5f81905092915050565b5f6131b783856131a2565b93506131c48385846127da565b82840190509392505050565b5f6131db828c61316b565b6014820191506131eb828b61316b565b6014820191506131fb828a61318b565b60208201915061320c82888a6131ac565b91506132198286886131ac565b9150613225828561316b565b601482019150613235828461316b565b6014820191508190509a9950505050505050505050565b5f8151905061325a8161225f565b92915050565b5f6020828403121561327557613274612227565b5b5f6132828482850161324c565b91505092915050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f6132c16132bc6132b78461328b565b612c5e565b613294565b9050919050565b6132d1816132a7565b82525050565b5f6020820190506132ea5f8301846132c8565b92915050565b5f819050919050565b5f77ffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61333661333161332c846132f0565b612c5e565b6132f9565b9050919050565b6133468161331c565b82525050565b5f60408201905061335f5f83018561253d565b61336c602083018461333d565b9392505050565b5f8151905061338181612292565b92915050565b5f6020828403121561339c5761339b612227565b5b5f6133a984828501613373565b91505092915050565b5f6133bd8385612a81565b93506133ca8385846127da565b6133d383612722565b840190509392505050565b5f6080820190506133f15f83018961253d565b81810360208301526134048187896133b2565b905081810360408301526134198185876133b2565b9050613428606083018461253d565b979650505050505050565b7f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000005f82015250565b5f613467601c83612cdc565b915061347282613433565b602082019050919050565b5f6020820190508181035f8301526134948161345b565b9050919050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f833560016020038436030381126134c3576134c261349b565b5b80840192508235915067ffffffffffffffff8211156134e5576134e461349f565b5b602083019250600182023603831315613501576135006134a3565b5b509250929050565b7f496e76616c6964206e6f6e6365000000000000000000000000000000000000005f82015250565b5f61353d600d83612cdc565b915061354882613509565b602082019050919050565b5f6020820190508181035f83015261356a81613531565b9050919050565b50565b5f61357f5f836131a2565b915061358a82613571565b5f82019050919050565b5f61359e82613574565b9150819050919050565b5f815190506135b6816126f4565b92915050565b5f602082840312156135d1576135d0612227565b5b5f6135de848285016135a8565b91505092915050565b5f6135f38284866131ac565b91508190509392505050565b7f496e76616c6964206f7065726174696f6e0000000000000000000000000000005f82015250565b5f613633601183612cdc565b915061363e826135ff565b602082019050919050565b5f6020820190508181035f83015261366081613627565b9050919050565b613670816129bd565b82525050565b5f6080820190506136895f830187612b54565b6136966020830186613667565b6136a36040830185612b54565b6136b06060830184612b54565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f6136f08261222f565b9050919050565b613700816136e6565b811461370a575f5ffd5b50565b5f8151905061371b816136f7565b92915050565b5f5f5f6060848603121561373857613737612227565b5b5f61374586828701613373565b93505060206137568682870161370d565b925050604061376786828701613373565b9150509250925092565b5f61377b82612a77565b61378581856131a2565b9350613795818560208601612a91565b80840191505092915050565b5f6137ac8284613771565b91508190509291505056fea2646970667358221220453e7fd118456a40a19c236f2510e0c678fe5c5af89632bd4eeffbe55a55bdd864736f6c634300081b0033000000000000000000000000000000000033e5ccbc52ec7bda87db768f9aa93f \ No newline at end of file diff --git a/src/chain/bytecode/erc1967proxy.txt b/src/chain/bytecode/erc1967proxy.txt new file mode 100644 index 00000000..e99b743f --- /dev/null +++ b/src/chain/bytecode/erc1967proxy.txt @@ -0,0 +1 @@ +0x6080604052600a600c565b005b60186014601a565b6026565b565b5f60216044565b905090565b365f5f375f5f365f845af43d5f5f3e805f81146040573d5ff35b3d5ffd5b5f606e7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b6095565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f81905091905056fea2646970667358221220007164f6221bb880865e4c02f3e712035e61170dee11d10e7bc3f3b8047b844c64736f6c634300081b0033 \ No newline at end of file diff --git a/src/chain/bytecode/erc6551_registry.txt b/src/chain/bytecode/erc6551_registry.txt new file mode 100644 index 00000000..895e75dc --- /dev/null +++ b/src/chain/bytecode/erc6551_registry.txt @@ -0,0 +1 @@ +0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063246a00211461003b5780638a54c52f1461006a575b600080fd5b61004e6100493660046101b7565b61007d565b6040516001600160a01b03909116815260200160405180910390f35b61004e6100783660046101b7565b6100e1565b600060806024608c376e5af43d82803e903d91602b57fd5bf3606c5285605d52733d60ad80600a3d3981f3363d3d373d3d3d363d7360495260ff60005360b76055206035523060601b60015284601552605560002060601b60601c60005260206000f35b600060806024608c376e5af43d82803e903d91602b57fd5bf3606c5285605d52733d60ad80600a3d3981f3363d3d373d3d3d363d7360495260ff60005360b76055206035523060601b600152846015526055600020803b61018b578560b760556000f580610157576320188a596000526004601cfd5b80606c52508284887f79f19b3655ee38b1ce526556b7731a20c8f218fbda4a3990b6cc4172fdf887226060606ca46020606cf35b8060601b60601c60005260206000f35b80356001600160a01b03811681146101b257600080fd5b919050565b600080600080600060a086880312156101cf57600080fd5b6101d88661019b565b945060208601359350604086013592506101f46060870161019b565b94979396509194608001359291505056fea2646970667358221220ea2fe53af507453c64dd7c1db05549fa47a298dfb825d6d11e1689856135f16764736f6c63430008110033 \ No newline at end of file diff --git a/src/chain/bytecode/kimap.txt b/src/chain/bytecode/kimap.txt new file mode 100644 index 00000000..d3b36ae0 --- /dev/null +++ b/src/chain/bytecode/kimap.txt @@ -0,0 +1 @@ +0x6080604052600436106101ed575f3560e01c80636352211e1161010c578063a22cb4651161009f578063c87b56dd1161006e578063c87b56dd14610757578063d547741f14610793578063e852398b146107bb578063e985e9c5146107f7578063edc1608414610833576101ed565b8063a22cb465146106b5578063ad3cb1cc146106dd578063b88d4fde14610707578063c4d66de81461072f576101ed565b80638eaa6ac0116100db5780638eaa6ac0146105e757806391d148541461062557806395d89b4114610661578063a217fddf1461068b576101ed565b80636352211e1461050b57806370a082311461054757806374e08829146105835780637788b5a8146105ab576101ed565b806323b872dd1161018457806336568abe1161015357806336568abe1461047557806342842e0e1461049d5780634f1ef286146104c557806352d1902d146104e1576101ed565b806323b872dd146103ad578063248a9ca3146103d557806327244d1e146104115780632f2ff15d1461044d576101ed565b8063095ea7b3116101c0578063095ea7b3146102cf5780630ae186a8146102f7578063150b7a02146103355780632124b69214610371576101ed565b806301ffc9a7146101f157806306fdde031461022d578063081812fc14610257578063094cefed14610293575b5f5ffd5b3480156101fc575f5ffd5b5061021760048036038101906102129190613bff565b61085d565b6040516102249190613c44565b60405180910390f35b348015610238575f5ffd5b5061024161086e565b60405161024e9190613ccd565b60405180910390f35b348015610262575f5ffd5b5061027d60048036038101906102789190613d20565b61090b565b60405161028a9190613d8a565b60405180910390f35b34801561029e575f5ffd5b506102b960048036038101906102b49190613e2e565b610926565b6040516102c69190613d8a565b60405180910390f35b3480156102da575f5ffd5b506102f560048036038101906102f09190613ed1565b610ae4565b005b348015610302575f5ffd5b5061031d60048036038101906103189190613f42565b610afa565b60405161032c93929190613fbf565b60405180910390f35b348015610340575f5ffd5b5061035b60048036038101906103569190614123565b610be3565b60405161036891906141b2565b60405180910390f35b34801561037c575f5ffd5b50610397600480360381019061039291906141cb565b610bf6565b6040516103a49190614237565b60405180910390f35b3480156103b8575f5ffd5b506103d360048036038101906103ce9190614250565b610c26565b005b3480156103e0575f5ffd5b506103fb60048036038101906103f69190613f42565b610d25565b6040516104089190614237565b60405180910390f35b34801561041c575f5ffd5b5061043760048036038101906104329190613f42565b610d4f565b6040516104449190613d8a565b60405180910390f35b348015610458575f5ffd5b50610473600480360381019061046e91906142a0565b610d89565b005b348015610480575f5ffd5b5061049b600480360381019061049691906142a0565b610dab565b005b3480156104a8575f5ffd5b506104c360048036038101906104be9190614250565b610e26565b005b6104df60048036038101906104da91906142de565b610e45565b005b3480156104ec575f5ffd5b506104f5610e64565b6040516105029190614237565b60405180910390f35b348015610516575f5ffd5b50610531600480360381019061052c9190613d20565b610e95565b60405161053e9190613d8a565b60405180910390f35b348015610552575f5ffd5b5061056d60048036038101906105689190614338565b610ea6565b60405161057a9190614372565b60405180910390f35b34801561058e575f5ffd5b506105a960048036038101906105a49190614338565b610f6a565b005b3480156105b6575f5ffd5b506105d160048036038101906105cc919061438b565b6110a5565b6040516105de9190614237565b60405180910390f35b3480156105f2575f5ffd5b5061060d60048036038101906106089190613f42565b61120d565b60405161061c93929190613fbf565b60405180910390f35b348015610630575f5ffd5b5061064b600480360381019061064691906142a0565b6113d4565b6040516106589190613c44565b60405180910390f35b34801561066c575f5ffd5b50610675611445565b6040516106829190613ccd565b60405180910390f35b348015610696575f5ffd5b5061069f6114e3565b6040516106ac9190614237565b60405180910390f35b3480156106c0575f5ffd5b506106db60048036038101906106d69190614433565b6114e9565b005b3480156106e8575f5ffd5b506106f16114ff565b6040516106fe9190613ccd565b60405180910390f35b348015610712575f5ffd5b5061072d60048036038101906107289190614123565b611538565b005b34801561073a575f5ffd5b5061075560048036038101906107509190614338565b61155d565b005b348015610762575f5ffd5b5061077d60048036038101906107789190613d20565b6117f9565b60405161078a9190613ccd565b60405180910390f35b34801561079e575f5ffd5b506107b960048036038101906107b491906142a0565b61185f565b005b3480156107c6575f5ffd5b506107e160048036038101906107dc919061438b565b611881565b6040516107ee9190614237565b60405180910390f35b348015610802575f5ffd5b5061081d60048036038101906108189190614471565b611a7d565b60405161082a9190613c44565b60405180910390f35b34801561083e575f5ffd5b50610847611b19565b604051610854919061450a565b60405180910390f35b5f61086782611b2d565b9050919050565b60605f610879611c0e565b9050805f01805461088990614550565b80601f01602080910402602001604051908101604052809291908181526020018280546108b590614550565b80156109005780601f106108d757610100808354040283529160200191610900565b820191905f5260205f20905b8154815290600101906020018083116108e357829003601f168201915b505050505091505090565b5f61091582611c35565b5061091f82611cbb565b9050919050565b5f85858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050610975815f611d02565b5f61097e611ee1565b90505f61098c828a8a610bf6565b90505f5f90505f73ffffffffffffffffffffffffffffffffffffffff165f5f8581526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a31575f5f8481526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169550600190505b8989604051610a419291906145ae565b604051809103902082847fb59dae5eda69178326b6517bb1aa33e208bf2ac347e30d3a5daf0ecb6249f7b18d8d604051610a7c9291906145f2565b60405180910390a4610ad48b8388848c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050611f94565b9450505050509695505050505050565b610af68282610af1612342565b612349565b5050565b5f602052805f5260405f205f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806002018054610b6290614550565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8e90614550565b8015610bd95780601f10610bb057610100808354040283529160200191610bd9565b820191905f5260205f20905b815481529060010190602001808311610bbc57829003601f168201915b5050505050905083565b5f63150b7a0260e01b9050949350505050565b5f604051602083018101604052828482378281206040518681528160208201526040812093505050509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c96575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610c8d9190613d8a565b60405180910390fd5b5f610ca98383610ca4612342565b61235b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d1f578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401610d1693929190614614565b60405180910390fd5b50505050565b5f5f610d2f612578565b9050805f015f8481526020019081526020015f2060010154915050919050565b5f5f5f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610d9282610d25565b610d9b8161259f565b610da583836125b3565b50505050565b610db3612342565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e17576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e2182826126ab565b505050565b610e4083838360405180602001604052805f815250611538565b505050565b610e4d6127a3565b610e5682612889565b610e608282612899565b5050565b5f610e6d6129b7565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b5f610e9f82611c35565b9050919050565b5f5f610eb0611c0e565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f22575f6040517f89c62b64000000000000000000000000000000000000000000000000000000008152600401610f199190613d8a565b60405180910390fd5b806003015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054915050919050565b5f610f73611ee1565b90505f73ffffffffffffffffffffffffffffffffffffffff165f5f8381526020019081526020015f206001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461100c576040517ff3dda33300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f5f8381526020019081526020015f206001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16817fde0ec2494e561683ac09b109d8c4c4a08b4ddbd4fcd23b609fe107e63176ef5a60405160405180910390a35050565b5f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050607e60f81b815f8151811061110257611101614649565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611166576040517fa3b9ac9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611171816001611d02565b5f61117a611ee1565b9050611187818888610bf6565b925084845f5f8681526020019081526020015f2060020191826111ab929190614817565b5086866040516111bc9291906145ae565b604051809103902083827fe40d9f1ec78dfc3c5a94c3edae28058ba092a8f65ce8a199731840a3d20f82f48a8a8a8a6040516111fb94939291906148e4565b60405180910390a45050949350505050565b5f5f60605f5f5f8681526020019081526020015f206040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820180546112e690614550565b80601f016020809104026020016040519081016040528092919081815260200182805461131290614550565b801561135d5780601f106113345761010080835404028352916020019161135d565b820191905f5260205f20905b81548152906001019060200180831161134057829003601f168201915b50505050508152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff16036113b1575f5f8260400151935093509350506113cd565b805f01516113c0865f1c610e95565b8260400151935093509350505b9193909250565b5f5f6113de612578565b9050805f015f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1691505092915050565b60605f611450611c0e565b905080600101805461146190614550565b80601f016020809104026020016040519081016040528092919081815260200182805461148d90614550565b80156114d85780601f106114af576101008083540402835291602001916114d8565b820191905f5260205f20905b8154815290600101906020018083116114bb57829003601f168201915b505050505091505090565b5f5f1b81565b6114fb6114f4612342565b8383612a3e565b5050565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b611543848484610c26565b61155761154e612342565b85858585612bb5565b50505050565b5f611566612d61565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f5f8267ffffffffffffffff161480156115ae5750825b90505f60018367ffffffffffffffff161480156115e157505f3073ffffffffffffffffffffffffffffffffffffffff163b145b9050811580156115ef575080155b15611626576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315611673576001855f0160086101000a81548160ff0219169083151502179055505b6116e76040518060400160405280600581526020017f4b696d61700000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4b494d4150000000000000000000000000000000000000000000000000000000815250612d88565b6116ef612d9e565b5f6040516116fc90613b7f565b604051809103905ff080158015611715573d5f5f3e3d5ffd5b5090505f611736885f5f1b845f60405180602001604052805f815250611f94565b90506117445f5f1b336126ab565b506117515f5f1b896125b3565b508073ffffffffffffffffffffffffffffffffffffffff167fa7dcba07b3032d87953767c0eed546a5eb7e52648856b776ba4ad8a1ff1bf3c060405160405180910390a2505083156117f1575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d260016040516117e89190614969565b60405180910390a15b505050505050565b606061180482611c35565b505f61180e612da8565b90505f81511161182c5760405180602001604052805f815250611857565b8061183684612dbe565b6040516020016118479291906149bc565b6040516020818303038152906040525b915050919050565b61186882610d25565b6118718161259f565b61187b83836126ab565b50505050565b5f84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050602160f81b815f815181106118de576118dd614649565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611942576040517f6ae27d4f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61194d816001611d02565b5f611956611ee1565b9050611963818888610bf6565b92505f5f5f8581526020019081526020015f20600201805461198490614550565b9050146119bd576040517fa542ed9c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f85859050036119f9576040517f01b3720500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84845f5f8681526020019081526020015f206002019182611a1b929190614817565b508686604051611a2c9291906145ae565b604051809103902083827f6df41fff09a97e34e341514998993ce9f4542c3fa8358931a96c9fff178c3adb8a8a8a8a604051611a6b94939291906148e4565b60405180910390a45050949350505050565b5f5f611a87611c0e565b9050806005015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1691505092915050565b6f6551c19487814612e58fe0681377575881565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611bf757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c075750611c0682612e88565b5b9050919050565b5f7f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079300905090565b5f5f611c4083612f01565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611cb257826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401611ca99190614372565b60405180910390fd5b80915050919050565b5f5f611cc5611c0e565b9050806004015f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b5f82519050818103611d40576040517f280dacb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408110611d7a576040517f7d45f78600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8290505b81811015611edb575f848281518110611d9b57611d9a614649565b5b602001015160f81c60f81b9050603060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610158015611e045750603960f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b80611e675750606160f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610158015611e665750607a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b5b80611e975750602d60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b611ecd576040517fe87f7f4400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b508080600101915050611d7f565b50505050565b5f5f611eec33612f48565b925050505f815f1b90503373ffffffffffffffffffffffffffffffffffffffff165f5f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f8c576040517f3813fcca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b809250505090565b5f5f73ffffffffffffffffffffffffffffffffffffffff165f5f8781526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461202b576040517fd202940c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6f6551c19487814612e58fe0681377575873ffffffffffffffffffffffffffffffffffffffff16638a54c52f863060405161206590613b8c565b61206f9190613d8a565b8190604051809103905ff590508015801561208c573d5f5f3e3d5ffd5b508746308a5f1c6040518663ffffffff1660e01b81526004016120b39594939291906149df565b6020604051808303815f875af11580156120cf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120f39190614a44565b905060405180606001604052808273ffffffffffffffffffffffffffffffffffffffff16815260200184612127575f612129565b855b73ffffffffffffffffffffffffffffffffffffffff16815260200160405180602001604052805f8152508152505f5f8781526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020190816122059190614a6f565b5090505061221530865f1c612fc8565b5f8173ffffffffffffffffffffffffffffffffffffffff1663d1f5789460e01b8685604051602401612248929190614b3e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516122b29190614b9c565b5f604051808303815f865af19150503d805f81146122eb576040519150601f19603f3d011682016040523d82523d5f602084013e6122f0565b606091505b505090508061232b576040517f5a714b1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123383088885f1c6130bb565b5095945050505050565b5f33905090565b61235683838360016130da565b505050565b5f5f612365611c0e565b90505f61237185612f01565b90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146123b2576123b18185876132a7565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461243f576123f15f865f5f6130da565b6001826003015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146124c0576001826003015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b85826002015f8781526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480925050509392505050565b5f7f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800905090565b6125b0816125ab612342565b61336a565b50565b5f5f6125bd612578565b90506125c984846113d4565b6126a0576001815f015f8681526020019081526020015f205f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061263c612342565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506126a5565b5f9150505b92915050565b5f5f6126b5612578565b90506126c184846113d4565b15612798575f815f015f8681526020019081526020015f205f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550612734612342565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16857ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a4600191505061279d565b5f9150505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148061285057507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166128376133bb565b73ffffffffffffffffffffffffffffffffffffffff1614155b15612887576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f5f1b6128958161259f565b5050565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561290157506040513d601f19601f820116820180604052508101906128fe9190614bc6565b60015b61294257816040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016129399190613d8a565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b81146129a857806040517faa1d49a400000000000000000000000000000000000000000000000000000000815260040161299f9190614237565b60405180910390fd5b6129b2838361340e565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614612a3c576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f612a47611c0e565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ab957826040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401612ab09190613d8a565b60405180910390fd5b81816005015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3184604051612ba79190613c44565b60405180910390a350505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1115612d5a578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02868685856040518563ffffffff1660e01b8152600401612c139493929190614bf1565b6020604051808303815f875af1925050508015612c4e57506040513d601f19601f82011682018060405250810190612c4b9190614c4f565b60015b612ccf573d805f8114612c7c576040519150601f19603f3d011682016040523d82523d5f602084013e612c81565b606091505b505f815103612cc757836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612cbe9190613d8a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612d5857836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612d4f9190613d8a565b60405180910390fd5b505b5050505050565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b612d90613480565b612d9a82826134c0565b5050565b612da6613480565b565b606060405180602001604052805f815250905090565b60605f6001612dcc846134fb565b0190505f8167ffffffffffffffff811115612dea57612de9613fff565b5b6040519080825280601f01601f191660200182016040528015612e1c5781602001600182028036833780820191505090505b5090505f82602001820190505b600115612e7d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612e7257612e71614c7a565b5b0494505f8503612e29575b819350505050919050565b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612efa5750612ef98261364c565b5b9050919050565b5f5f612f0b611c0e565b9050806002015f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b5f5f5f5f606067ffffffffffffffff811115612f6757612f66613fff565b5b6040519080825280601f01601f191660200182016040528015612f995781602001600182028036833780820191505090505b5090506060604d60208301873c80806020019051810190612fba9190614cf6565b935093509350509193909250565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613038575f6040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161302f9190613d8a565b60405180910390fd5b5f61304483835f61235b565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146130b6575f6040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016130ad9190613d8a565b60405180910390fd5b505050565b6130d583838360405180602001604052805f8152506136b5565b505050565b5f6130e3611c0e565b9050818061311d57505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561324f575f61312c85611c35565b90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561319657508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156131a957506131a78185611a7d565b155b156131eb57836040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016131e29190613d8a565b60405180910390fd5b821561324d57848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b84816004015f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b6132b28383836136da565b613365575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361332657806040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161331d9190614372565b60405180910390fd5b81816040517f177e802f00000000000000000000000000000000000000000000000000000000815260040161335c929190614d46565b60405180910390fd5b505050565b61337482826113d4565b6133b75780826040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526004016133ae929190614d6d565b60405180910390fd5b5050565b5f6133e77f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61379a565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b613417826137a3565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156134735761346d828261386c565b5061347c565b61347b6138ec565b5b5050565b613488613928565b6134be576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6134c8613480565b5f6134d1611c0e565b905082815f0190816134e39190614dec565b50818160010190816134f59190614dec565b50505050565b5f5f5f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613557577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161354d5761354c614c7a565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613594576d04ee2d6d415b85acef8100000000838161358a57613589614c7a565b5b0492506020810190505b662386f26fc1000083106135c357662386f26fc1000083816135b9576135b8614c7a565b5b0492506010810190505b6305f5e10083106135ec576305f5e10083816135e2576135e1614c7a565b5b0492506008810190505b612710831061361157612710838161360757613606614c7a565b5b0492506004810190505b60648310613634576064838161362a57613629614c7a565b5b0492506002810190505b600a8310613643576001810190505b80915050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6136c0848484613946565b6136d46136cb612342565b85858585612bb5565b50505050565b5f5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561379157508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061375257506137518484611a7d565b5b8061379057508273ffffffffffffffffffffffffffffffffffffffff1661377883611cbb565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b036137fe57806040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016137f59190613d8a565b60405180910390fd5b8061382a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61379a565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f5f8473ffffffffffffffffffffffffffffffffffffffff16846040516138959190614b9c565b5f60405180830381855af49150503d805f81146138cd576040519150601f19603f3d011682016040523d82523d5f602084013e6138d2565b606091505b50915091506138e2858383613aae565b9250505092915050565b5f341115613926576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f613931612d61565b5f0160089054906101000a900460ff16905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036139b6575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016139ad9190613d8a565b60405180910390fd5b5f6139c283835f61235b565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613a3457816040517f7e273289000000000000000000000000000000000000000000000000000000008152600401613a2b9190614372565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613aa8578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401613a9f93929190614614565b60405180910390fd5b50505050565b606082613ac357613abe82613b3b565b613b33565b5f8251148015613ae957505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15613b2b57836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401613b229190613d8a565b60405180910390fd5b819050613b34565b5b9392505050565b5f81511115613b4d5780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61237d80614ebc83390190565b6108f38061723983390190565b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613bde81613baa565b8114613be8575f5ffd5b50565b5f81359050613bf981613bd5565b92915050565b5f60208284031215613c1457613c13613ba2565b5b5f613c2184828501613beb565b91505092915050565b5f8115159050919050565b613c3e81613c2a565b82525050565b5f602082019050613c575f830184613c35565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f613c9f82613c5d565b613ca98185613c67565b9350613cb9818560208601613c77565b613cc281613c85565b840191505092915050565b5f6020820190508181035f830152613ce58184613c95565b905092915050565b5f819050919050565b613cff81613ced565b8114613d09575f5ffd5b50565b5f81359050613d1a81613cf6565b92915050565b5f60208284031215613d3557613d34613ba2565b5b5f613d4284828501613d0c565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613d7482613d4b565b9050919050565b613d8481613d6a565b82525050565b5f602082019050613d9d5f830184613d7b565b92915050565b613dac81613d6a565b8114613db6575f5ffd5b50565b5f81359050613dc781613da3565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f840112613dee57613ded613dcd565b5b8235905067ffffffffffffffff811115613e0b57613e0a613dd1565b5b602083019150836001820283011115613e2757613e26613dd5565b5b9250929050565b5f5f5f5f5f5f60808789031215613e4857613e47613ba2565b5b5f613e5589828a01613db9565b965050602087013567ffffffffffffffff811115613e7657613e75613ba6565b5b613e8289828a01613dd9565b9550955050604087013567ffffffffffffffff811115613ea557613ea4613ba6565b5b613eb189828a01613dd9565b93509350506060613ec489828a01613db9565b9150509295509295509295565b5f5f60408385031215613ee757613ee6613ba2565b5b5f613ef485828601613db9565b9250506020613f0585828601613d0c565b9150509250929050565b5f819050919050565b613f2181613f0f565b8114613f2b575f5ffd5b50565b5f81359050613f3c81613f18565b92915050565b5f60208284031215613f5757613f56613ba2565b5b5f613f6484828501613f2e565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f613f9182613f6d565b613f9b8185613f77565b9350613fab818560208601613c77565b613fb481613c85565b840191505092915050565b5f606082019050613fd25f830186613d7b565b613fdf6020830185613d7b565b8181036040830152613ff18184613f87565b9050949350505050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61403582613c85565b810181811067ffffffffffffffff8211171561405457614053613fff565b5b80604052505050565b5f614066613b99565b9050614072828261402c565b919050565b5f67ffffffffffffffff82111561409157614090613fff565b5b61409a82613c85565b9050602081019050919050565b828183375f83830152505050565b5f6140c76140c284614077565b61405d565b9050828152602081018484840111156140e3576140e2613ffb565b5b6140ee8482856140a7565b509392505050565b5f82601f83011261410a57614109613dcd565b5b813561411a8482602086016140b5565b91505092915050565b5f5f5f5f6080858703121561413b5761413a613ba2565b5b5f61414887828801613db9565b945050602061415987828801613db9565b935050604061416a87828801613d0c565b925050606085013567ffffffffffffffff81111561418b5761418a613ba6565b5b614197878288016140f6565b91505092959194509250565b6141ac81613baa565b82525050565b5f6020820190506141c55f8301846141a3565b92915050565b5f5f5f604084860312156141e2576141e1613ba2565b5b5f6141ef86828701613f2e565b935050602084013567ffffffffffffffff8111156142105761420f613ba6565b5b61421c86828701613dd9565b92509250509250925092565b61423181613f0f565b82525050565b5f60208201905061424a5f830184614228565b92915050565b5f5f5f6060848603121561426757614266613ba2565b5b5f61427486828701613db9565b935050602061428586828701613db9565b925050604061429686828701613d0c565b9150509250925092565b5f5f604083850312156142b6576142b5613ba2565b5b5f6142c385828601613f2e565b92505060206142d485828601613db9565b9150509250929050565b5f5f604083850312156142f4576142f3613ba2565b5b5f61430185828601613db9565b925050602083013567ffffffffffffffff81111561432257614321613ba6565b5b61432e858286016140f6565b9150509250929050565b5f6020828403121561434d5761434c613ba2565b5b5f61435a84828501613db9565b91505092915050565b61436c81613ced565b82525050565b5f6020820190506143855f830184614363565b92915050565b5f5f5f5f604085870312156143a3576143a2613ba2565b5b5f85013567ffffffffffffffff8111156143c0576143bf613ba6565b5b6143cc87828801613dd9565b9450945050602085013567ffffffffffffffff8111156143ef576143ee613ba6565b5b6143fb87828801613dd9565b925092505092959194509250565b61441281613c2a565b811461441c575f5ffd5b50565b5f8135905061442d81614409565b92915050565b5f5f6040838503121561444957614448613ba2565b5b5f61445685828601613db9565b92505060206144678582860161441f565b9150509250929050565b5f5f6040838503121561448757614486613ba2565b5b5f61449485828601613db9565b92505060206144a585828601613db9565b9150509250929050565b5f819050919050565b5f6144d26144cd6144c884613d4b565b6144af565b613d4b565b9050919050565b5f6144e3826144b8565b9050919050565b5f6144f4826144d9565b9050919050565b614504816144ea565b82525050565b5f60208201905061451d5f8301846144fb565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061456757607f821691505b60208210810361457a57614579614523565b5b50919050565b5f81905092915050565b5f6145958385614580565b93506145a28385846140a7565b82840190509392505050565b5f6145ba82848661458a565b91508190509392505050565b5f6145d18385613f77565b93506145de8385846140a7565b6145e783613c85565b840190509392505050565b5f6020820190508181035f83015261460b8184866145c6565b90509392505050565b5f6060820190506146275f830186613d7b565b6146346020830185614363565b6146416040830184613d7b565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026146dc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826146a1565b6146e686836146a1565b95508019841693508086168417925050509392505050565b5f61471861471361470e84613ced565b6144af565b613ced565b9050919050565b5f819050919050565b614731836146fe565b61474561473d8261471f565b8484546146ad565b825550505050565b5f5f905090565b61475c61474d565b614767818484614728565b505050565b5b8181101561478a5761477f5f82614754565b60018101905061476d565b5050565b601f8211156147cf576147a081614680565b6147a984614692565b810160208510156147b8578190505b6147cc6147c485614692565b83018261476c565b50505b505050565b5f82821c905092915050565b5f6147ef5f19846008026147d4565b1980831691505092915050565b5f61480783836147e0565b9150826002028217905092915050565b6148218383614676565b67ffffffffffffffff81111561483a57614839613fff565b5b6148448254614550565b61484f82828561478e565b5f601f83116001811461487c575f841561486a578287013590505b61487485826147fc565b8655506148db565b601f19841661488a86614680565b5f5b828110156148b15784890135825560018201915060208501945060208101905061488c565b868310156148ce57848901356148ca601f8916826147e0565b8355505b6001600288020188555050505b50505050505050565b5f6040820190508181035f8301526148fd8186886145c6565b905081810360208301526149128184866145c6565b905095945050505050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f61495361494e6149498461491d565b6144af565b614926565b9050919050565b61496381614939565b82525050565b5f60208201905061497c5f83018461495a565b92915050565b5f81905092915050565b5f61499682613c5d565b6149a08185614982565b93506149b0818560208601613c77565b80840191505092915050565b5f6149c7828561498c565b91506149d3828461498c565b91508190509392505050565b5f60a0820190506149f25f830188613d7b565b6149ff6020830187614228565b614a0c6040830186614363565b614a196060830185613d7b565b614a266080830184614363565b9695505050505050565b5f81519050614a3e81613da3565b92915050565b5f60208284031215614a5957614a58613ba2565b5b5f614a6684828501614a30565b91505092915050565b614a7882613f6d565b67ffffffffffffffff811115614a9157614a90613fff565b5b614a9b8254614550565b614aa682828561478e565b5f60209050601f831160018114614ad7575f8415614ac5578287015190505b614acf85826147fc565b865550614b36565b601f198416614ae586614680565b5f5b82811015614b0c57848901518255600182019150602085019450602081019050614ae7565b86831015614b295784890151614b25601f8916826147e0565b8355505b6001600288020188555050505b505050505050565b5f604082019050614b515f830185613d7b565b8181036020830152614b638184613f87565b90509392505050565b5f614b7682613f6d565b614b808185614580565b9350614b90818560208601613c77565b80840191505092915050565b5f614ba78284614b6c565b915081905092915050565b5f81519050614bc081613f18565b92915050565b5f60208284031215614bdb57614bda613ba2565b5b5f614be884828501614bb2565b91505092915050565b5f608082019050614c045f830187613d7b565b614c116020830186613d7b565b614c1e6040830185614363565b8181036060830152614c308184613f87565b905095945050505050565b5f81519050614c4981613bd5565b92915050565b5f60208284031215614c6457614c63613ba2565b5b5f614c7184828501614c3b565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f81519050614cb581613cf6565b92915050565b5f614cc582613d4b565b9050919050565b614cd581614cbb565b8114614cdf575f5ffd5b50565b5f81519050614cf081614ccc565b92915050565b5f5f5f60608486031215614d0d57614d0c613ba2565b5b5f614d1a86828701614ca7565b9350506020614d2b86828701614ce2565b9250506040614d3c86828701614ca7565b9150509250925092565b5f604082019050614d595f830185613d7b565b614d666020830184614363565b9392505050565b5f604082019050614d805f830185613d7b565b614d8d6020830184614228565b9392505050565b5f819050815f5260205f209050919050565b601f821115614de757614db881614d94565b614dc184614692565b81016020851015614dd0578190505b614de4614ddc85614692565b83018261476c565b50505b505050565b614df582613c5d565b67ffffffffffffffff811115614e0e57614e0d613fff565b5b614e188254614550565b614e23828285614da6565b5f60209050601f831160018114614e54575f8415614e42578287015190505b614e4c85826147fc565b865550614eb3565b601f198416614e6286614d94565b5f5b82811015614e8957848901518255600182019150602085019450602081019050614e64565b86831015614ea65784890151614ea2601f8916826147e0565b8355505b6001600288020188555050505b50505050505056fe6080604052348015600e575f5ffd5b506123618061001c5f395ff3fe6080604052600436106100ea575f3560e01c80636d70f7ae11610089578063ca3b98bb11610058578063ca3b98bb14610345578063d087d28814610375578063f23a6e611461039f578063fc0c546a146103db576100f1565b80636d70f7ae14610279578063b0d691fe146102b5578063bc197c81146102df578063c19d93fb1461031b576100f1565b80631626ba7e116100c55780631626ba7e1461019557806319822f7c146101d1578063519454471461020d578063523e32601461023d576100f1565b806223de29146100f557806301ffc9a71461011d578063150b7a0214610159576100f1565b366100f157005b5f5ffd5b348015610100575f5ffd5b5061011b600480360381019061011691906114e1565b610407565b005b348015610128575f5ffd5b50610143600480360381019061013e9190611600565b610411565b6040516101509190611645565b60405180910390f35b348015610164575f5ffd5b5061017f600480360381019061017a919061165e565b61048a565b60405161018c91906116f1565b60405180910390f35b3480156101a0575f5ffd5b506101bb60048036038101906101b69190611875565b610520565b6040516101c891906116f1565b60405180910390f35b3480156101dc575f5ffd5b506101f760048036038101906101f291906118f2565b610673565b604051610204919061196d565b60405180910390f35b610227600480360381019061022291906119bc565b6106a5565b6040516102349190611aa0565b60405180910390f35b348015610248575f5ffd5b50610263600480360381019061025e9190611ac0565b610755565b60405161027091906116f1565b60405180910390f35b348015610284575f5ffd5b5061029f600480360381019061029a9190611b1d565b61077e565b6040516102ac9190611645565b60405180910390f35b3480156102c0575f5ffd5b506102c9610875565b6040516102d69190611ba3565b60405180910390f35b3480156102ea575f5ffd5b5061030560048036038101906103009190611c11565b610890565b60405161031291906116f1565b60405180910390f35b348015610326575f5ffd5b5061032f6108a7565b60405161033c919061196d565b60405180910390f35b61035f600480360381019061035a9190611ce8565b61092e565b60405161036c9190611aa0565b60405180910390f35b348015610380575f5ffd5b506103896109ed565b604051610396919061196d565b60405180910390f35b3480156103aa575f5ffd5b506103c560048036038101906103c09190611d7e565b610a74565b6040516103d291906116f1565b60405180910390f35b3480156103e6575f5ffd5b506103ef610a89565b6040516103fe93929190611e23565b60405180910390f35b5050505050505050565b5f61041b82610a9f565b8061048357507f6faff5f1000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b5f5f5f610495610a89565b92509250508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480156104d457508086145b1561050b576040517fb79e3f3f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63150b7a0260e01b9250505095945050505050565b5f5f5f5f61052d85610d10565b8094508195508293505050505f8160ff1603610634575f835f1c90506060602084880101905061055c8261077e565b15801561059557503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156105ae5763ffffffff60e01b9550505050505061066d565b8173ffffffffffffffffffffffffffffffffffffffff16631626ba7e89836040518363ffffffff1660e01b81526004016105e9929190611e67565b602060405180830381865afa158015610604573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106289190611ea9565b9550505050505061066d565b61064861064387838686610d31565b61077e565b1561065f57631626ba7e60e01b935050505061066d565b63ffffffff60e01b93505050505b92915050565b5f61067c610d5f565b6106868484610dd6565b90506106958460200135610e9f565b61069e82610eee565b9392505050565b60606106b03361077e565b1580156106f057506106c0610875565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610727576040517f8f0052a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61073687878787875a610f85565b80935081925050508061074b57815160208301fd5b5095945050505050565b5f61075f8461077e565b61076c575f60e01b610775565b63523e326060e01b5b90509392505050565b5f5f5f610789610a89565b92509250508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016107de919061196d565b602060405180830381865afa1580156107f9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061081d9190611ee8565b73ffffffffffffffffffffffffffffffffffffffff1614801561086c57505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b92505050919050565b5f735ff137d4b0fdcd49dca30c7cf57e578a026d2789905090565b5f63bc197c8160e01b905098975050505050505050565b5f6108b0610875565b73ffffffffffffffffffffffffffffffffffffffff166335567e1a305f6040518363ffffffff1660e01b81526004016108ea929190611f6f565b602060405180830381865afa158015610905573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109299190611faa565b905090565b60606109393361077e565b1580156109795750610949610875565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156109b0576040517f8f0052a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6109cd88888888885f89146109c657886109c8565b5a5b610f85565b8093508192505050806109e257815160208301fd5b509695505050505050565b5f6109f6610875565b73ffffffffffffffffffffffffffffffffffffffff166335567e1a305f6040518363ffffffff1660e01b8152600401610a30929190611f6f565b602060405180830381865afa158015610a4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a6f9190611faa565b905090565b5f63f23a6e6160e01b90509695505050505050565b5f5f5f610a946110cf565b925092509250909192565b5f7f3ce4a3e9000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b6957507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bd157507f19822f7c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c3957507f1626ba7e000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ca157507f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d0957507f51945447000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b5f5f5f602084015191506040840151905060608401515f1a92509193909250565b5f5f5f5f610d41888888886110e6565b925092509250610d5182826111cd565b829350505050949350505050565b610d67610875565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb9061202f565b60405180910390fd5b565b5f5f610de18361132f565b9050631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916610e668286806101000190610e1f9190612059565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050610520565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610e94576001915050610e99565b5f9150505b92915050565b67ffffffffffffffff80168110610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290612105565b60405180910390fd5b50565b5f8114610f82575f3373ffffffffffffffffffffffffffffffffffffffff16827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90604051610f3c90612150565b5f60405180830381858888f193505050503d805f8114610f77576040519150601f19603f3d011682016040523d82523d5f602084013e610f7c565b606091505b50509050505b50565b5f60605f8460ff1603611009578773ffffffffffffffffffffffffffffffffffffffff1683888888604051610fbb929190612188565b5f60405180830381858888f193505050503d805f8114610ff6576040519150601f19603f3d011682016040523d82523d5f602084013e610ffb565b606091505b5080925081935050506110c4565b60018460ff1603611088578773ffffffffffffffffffffffffffffffffffffffff1683878760405161103c929190612188565b5f604051808303818686f4925050503d805f8114611075576040519150601f19603f3d011682016040523d82523d5f602084013e61107a565b606091505b5080925081935050506110c3565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ba906121ea565b60405180910390fd5b5b965096945050505050565b5f5f5f6110db30611362565b925092509250909192565b5f5f5f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115611122575f6003859250925092506111c3565b5f6001888888886040515f81526020016040526040516111459493929190612217565b6020604051602081039080840390855afa158015611165573d5f5f3e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111b6575f60015f5f1b935093509350506111c3565b805f5f5f1b935093509350505b9450945094915050565b5f60038111156111e0576111df61225a565b5b8260038111156111f3576111f261225a565b5b031561132b576001600381111561120d5761120c61225a565b5b8260038111156112205761121f61225a565b5b03611257576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600381111561126b5761126a61225a565b5b82600381111561127e5761127d61225a565b5b036112c257805f1c6040517ffce698f70000000000000000000000000000000000000000000000000000000081526004016112b9919061196d565b60405180910390fd5b6003808111156112d5576112d461225a565b5b8260038111156112e8576112e761225a565b5b0361132a57806040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004016113219190612287565b60405180910390fd5b5b5050565b5f7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f5281601c52603c5f209050919050565b5f5f5f5f606067ffffffffffffffff81111561138157611380611751565b5b6040519080825280601f01601f1916602001820160405280156113b35781602001600182028036833780820191505090505b5090506060604d60208301873c808060200190518101906113d491906122db565b935093509350509193909250565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61141c826113f3565b9050919050565b61142c81611412565b8114611436575f5ffd5b50565b5f8135905061144781611423565b92915050565b5f819050919050565b61145f8161144d565b8114611469575f5ffd5b50565b5f8135905061147a81611456565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126114a1576114a0611480565b5b8235905067ffffffffffffffff8111156114be576114bd611484565b5b6020830191508360018202830111156114da576114d9611488565b5b9250929050565b5f5f5f5f5f5f5f5f60c0898b0312156114fd576114fc6113eb565b5b5f61150a8b828c01611439565b985050602061151b8b828c01611439565b975050604061152c8b828c01611439565b965050606061153d8b828c0161146c565b955050608089013567ffffffffffffffff81111561155e5761155d6113ef565b5b61156a8b828c0161148c565b945094505060a089013567ffffffffffffffff81111561158d5761158c6113ef565b5b6115998b828c0161148c565b92509250509295985092959890939650565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6115df816115ab565b81146115e9575f5ffd5b50565b5f813590506115fa816115d6565b92915050565b5f60208284031215611615576116146113eb565b5b5f611622848285016115ec565b91505092915050565b5f8115159050919050565b61163f8161162b565b82525050565b5f6020820190506116585f830184611636565b92915050565b5f5f5f5f5f60808688031215611677576116766113eb565b5b5f61168488828901611439565b955050602061169588828901611439565b94505060406116a68882890161146c565b935050606086013567ffffffffffffffff8111156116c7576116c66113ef565b5b6116d38882890161148c565b92509250509295509295909350565b6116eb816115ab565b82525050565b5f6020820190506117045f8301846116e2565b92915050565b5f819050919050565b61171c8161170a565b8114611726575f5ffd5b50565b5f8135905061173781611713565b92915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61178782611741565b810181811067ffffffffffffffff821117156117a6576117a5611751565b5b80604052505050565b5f6117b86113e2565b90506117c4828261177e565b919050565b5f67ffffffffffffffff8211156117e3576117e2611751565b5b6117ec82611741565b9050602081019050919050565b828183375f83830152505050565b5f611819611814846117c9565b6117af565b9050828152602081018484840111156118355761183461173d565b5b6118408482856117f9565b509392505050565b5f82601f83011261185c5761185b611480565b5b813561186c848260208601611807565b91505092915050565b5f5f6040838503121561188b5761188a6113eb565b5b5f61189885828601611729565b925050602083013567ffffffffffffffff8111156118b9576118b86113ef565b5b6118c585828601611848565b9150509250929050565b5f5ffd5b5f61012082840312156118e9576118e86118cf565b5b81905092915050565b5f5f5f60608486031215611909576119086113eb565b5b5f84013567ffffffffffffffff811115611926576119256113ef565b5b611932868287016118d3565b935050602061194386828701611729565b92505060406119548682870161146c565b9150509250925092565b6119678161144d565b82525050565b5f6020820190506119805f83018461195e565b92915050565b5f60ff82169050919050565b61199b81611986565b81146119a5575f5ffd5b50565b5f813590506119b681611992565b92915050565b5f5f5f5f5f608086880312156119d5576119d46113eb565b5b5f6119e288828901611439565b95505060206119f38882890161146c565b945050604086013567ffffffffffffffff811115611a1457611a136113ef565b5b611a208882890161148c565b93509350506060611a33888289016119a8565b9150509295509295909350565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f611a7282611a40565b611a7c8185611a4a565b9350611a8c818560208601611a5a565b611a9581611741565b840191505092915050565b5f6020820190508181035f830152611ab88184611a68565b905092915050565b5f5f5f60408486031215611ad757611ad66113eb565b5b5f611ae486828701611439565b935050602084013567ffffffffffffffff811115611b0557611b046113ef565b5b611b118682870161148c565b92509250509250925092565b5f60208284031215611b3257611b316113eb565b5b5f611b3f84828501611439565b91505092915050565b5f819050919050565b5f611b6b611b66611b61846113f3565b611b48565b6113f3565b9050919050565b5f611b7c82611b51565b9050919050565b5f611b8d82611b72565b9050919050565b611b9d81611b83565b82525050565b5f602082019050611bb65f830184611b94565b92915050565b5f5f83601f840112611bd157611bd0611480565b5b8235905067ffffffffffffffff811115611bee57611bed611484565b5b602083019150836020820283011115611c0a57611c09611488565b5b9250929050565b5f5f5f5f5f5f5f5f60a0898b031215611c2d57611c2c6113eb565b5b5f611c3a8b828c01611439565b9850506020611c4b8b828c01611439565b975050604089013567ffffffffffffffff811115611c6c57611c6b6113ef565b5b611c788b828c01611bbc565b9650965050606089013567ffffffffffffffff811115611c9b57611c9a6113ef565b5b611ca78b828c01611bbc565b9450945050608089013567ffffffffffffffff811115611cca57611cc96113ef565b5b611cd68b828c0161148c565b92509250509295985092959890939650565b5f5f5f5f5f5f60a08789031215611d0257611d016113eb565b5b5f611d0f89828a01611439565b9650506020611d2089828a0161146c565b955050604087013567ffffffffffffffff811115611d4157611d406113ef565b5b611d4d89828a0161148c565b94509450506060611d6089828a016119a8565b9250506080611d7189828a0161146c565b9150509295509295509295565b5f5f5f5f5f5f60a08789031215611d9857611d976113eb565b5b5f611da589828a01611439565b9650506020611db689828a01611439565b9550506040611dc789828a0161146c565b9450506060611dd889828a0161146c565b935050608087013567ffffffffffffffff811115611df957611df86113ef565b5b611e0589828a0161148c565b92509250509295509295509295565b611e1d81611412565b82525050565b5f606082019050611e365f83018661195e565b611e436020830185611e14565b611e50604083018461195e565b949350505050565b611e618161170a565b82525050565b5f604082019050611e7a5f830185611e58565b8181036020830152611e8c8184611a68565b90509392505050565b5f81519050611ea3816115d6565b92915050565b5f60208284031215611ebe57611ebd6113eb565b5b5f611ecb84828501611e95565b91505092915050565b5f81519050611ee281611423565b92915050565b5f60208284031215611efd57611efc6113eb565b5b5f611f0a84828501611ed4565b91505092915050565b5f819050919050565b5f77ffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f59611f54611f4f84611f13565b611b48565b611f1c565b9050919050565b611f6981611f3f565b82525050565b5f604082019050611f825f830185611e14565b611f8f6020830184611f60565b9392505050565b5f81519050611fa481611456565b92915050565b5f60208284031215611fbf57611fbe6113eb565b5b5f611fcc84828501611f96565b91505092915050565b5f82825260208201905092915050565b7f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000005f82015250565b5f612019601c83611fd5565b915061202482611fe5565b602082019050919050565b5f6020820190508181035f8301526120468161200d565b9050919050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f833560016020038436030381126120755761207461204d565b5b80840192508235915067ffffffffffffffff82111561209757612096612051565b5b6020830192506001820236038313156120b3576120b2612055565b5b509250929050565b7f496e76616c6964206e6f6e6365000000000000000000000000000000000000005f82015250565b5f6120ef600d83611fd5565b91506120fa826120bb565b602082019050919050565b5f6020820190508181035f83015261211c816120e3565b9050919050565b5f81905092915050565b50565b5f61213b5f83612123565b91506121468261212d565b5f82019050919050565b5f61215a82612130565b9150819050919050565b5f61216f8385612123565b935061217c8385846117f9565b82840190509392505050565b5f612194828486612164565b91508190509392505050565b7f496e76616c6964206f7065726174696f6e0000000000000000000000000000005f82015250565b5f6121d4601183611fd5565b91506121df826121a0565b602082019050919050565b5f6020820190508181035f830152612201816121c8565b9050919050565b61221181611986565b82525050565b5f60808201905061222a5f830187611e58565b6122376020830186612208565b6122446040830185611e58565b6122516060830184611e58565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60208201905061229a5f830184611e58565b92915050565b5f6122aa826113f3565b9050919050565b6122ba816122a0565b81146122c4575f5ffd5b50565b5f815190506122d5816122b1565b92915050565b5f5f5f606084860312156122f2576122f16113eb565b5b5f6122ff86828701611f96565b9350506020612310868287016122c7565b925050604061232186828701611f96565b915050925092509256fea2646970667358221220c04c05de9bedcad6da8650fa55a877481e93162d6e552cc764943a3a2ca940d364736f6c634300081b003360a060405234801561000f575f5ffd5b506040516108f33803806108f3833981810160405281019061003191906100e1565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505f5f5f6101000a81548160ff0219169083151502179055505061010c565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100b082610087565b9050919050565b6100c0816100a6565b81146100ca575f5ffd5b50565b5f815190506100db816100b7565b92915050565b5f602082840312156100f6576100f5610083565b5b5f610103848285016100cd565b91505092915050565b6080516107d06101235f395f606201526107d05ff3fe608060405260043610610021575f3560e01c8063d1f578941461003257610028565b3661002857005b61003061004e565b005b61004c600480360381019061004791906106b0565b610060565b005b61005e6100596101b8565b6101c6565b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610111575f5f9054906101000a900460ff16156100d3576100ce61004e565b610110565b336040517f76d17eff0000000000000000000000000000000000000000000000000000000081526004016101079190610719565b60405180910390fd5b5b5f5f9054906101000a900460ff1615610156576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff166101756101b8565b73ffffffffffffffffffffffffffffffffffffffff16036101b45760015f5f6101000a81548160ff0219169083151502179055506101b382826101e5565b5b5050565b5f6101c1610257565b905090565b365f5f375f5f365f845af43d5f5f3e805f81146101e1573d5ff35b3d5ffd5b6101ee826102aa565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f8151111561024a576102448282610373565b50610253565b6102526103f3565b5b5050565b5f6102837f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61042f565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f8173ffffffffffffffffffffffffffffffffffffffff163b0361030557806040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016102fc9190610719565b60405180910390fd5b806103317f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61042f565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f5f8473ffffffffffffffffffffffffffffffffffffffff168460405161039c9190610784565b5f60405180830381855af49150503d805f81146103d4576040519150601f19603f3d011682016040523d82523d5f602084013e6103d9565b606091505b50915091506103e9858383610438565b9250505092915050565b5f34111561042d576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f819050919050565b60608261044d57610448826104c5565b6104bd565b5f825114801561047357505f8473ffffffffffffffffffffffffffffffffffffffff163b145b156104b557836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016104ac9190610719565b60405180910390fd5b8190506104be565b5b9392505050565b5f815111156104d75780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6105438261051a565b9050919050565b61055381610539565b811461055d575f5ffd5b50565b5f8135905061056e8161054a565b92915050565b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6105c28261057c565b810181811067ffffffffffffffff821117156105e1576105e061058c565b5b80604052505050565b5f6105f3610509565b90506105ff82826105b9565b919050565b5f67ffffffffffffffff82111561061e5761061d61058c565b5b6106278261057c565b9050602081019050919050565b828183375f83830152505050565b5f61065461064f84610604565b6105ea565b9050828152602081018484840111156106705761066f610578565b5b61067b848285610634565b509392505050565b5f82601f83011261069757610696610574565b5b81356106a7848260208601610642565b91505092915050565b5f5f604083850312156106c6576106c5610512565b5b5f6106d385828601610560565b925050602083013567ffffffffffffffff8111156106f4576106f3610516565b5b61070085828601610683565b9150509250929050565b61071381610539565b82525050565b5f60208201905061072c5f83018461070a565b92915050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f61075e82610732565b610768818561073c565b9350610778818560208601610746565b80840191505092915050565b5f61078f8284610754565b91508190509291505056fea26469706673582212203742684bc6ee36df2efeb754359dc28a63684db1551eb939e678435820ea577764736f6c634300081b0033a26469706673582212209815f18cdec5f2507ad20a897ac88ee9a17fd5a9bb966a5c6cfe79d8fd198c3164736f6c634300081b0033 \ No newline at end of file diff --git a/src/chain/bytecode/kinoaccount.txt b/src/chain/bytecode/kinoaccount.txt new file mode 100644 index 00000000..8913f502 --- /dev/null +++ b/src/chain/bytecode/kinoaccount.txt @@ -0,0 +1 @@ +0x6080604052600436106100e6575f3560e01c80636d70f7ae11610087578063ca3b98bb11610057578063ca3b98bb1461029d578063d087d28814610289578063f23a6e61146102b0578063fc0c546a146102dc575f5ffd5b80636d70f7ae1461020e578063b0d691fe1461022d578063bc197c811461025b578063c19d93fb14610289575f5ffd5b80631626ba7e116100c25780631626ba7e1461018357806319822f7c146101a257806351945447146101cf578063523e3260146101ef575f5ffd5b806223de29146100f157806301ffc9a714610117578063150b7a021461014b575f5ffd5b366100ed57005b5f5ffd5b3480156100fc575f5ffd5b5061011561010b366004610d14565b5050505050505050565b005b348015610122575f5ffd5b50610136610131366004610dd6565b610313565b60405190151581526020015b60405180910390f35b348015610156575f5ffd5b5061016a610165366004610df1565b61033e565b6040516001600160e01b03199091168152602001610142565b34801561018e575f5ffd5b5061016a61019d366004610e72565b610398565b3480156101ad575f5ffd5b506101c16101bc366004610f2c565b6104bd565b604051908152602001610142565b6101e26101dd366004610f8f565b6104ef565b6040516101429190611028565b3480156101fa575f5ffd5b5061016a61020936600461103a565b610563565b348015610219575f5ffd5b5061013661022836600461108a565b610588565b348015610238575f5ffd5b50604051735ff137d4b0fdcd49dca30c7cf57e578a026d27898152602001610142565b348015610266575f5ffd5b5061016a6102753660046110e5565b63bc197c8160e01b98975050505050505050565b348015610294575f5ffd5b506101c1610626565b6101e26102ab366004611185565b6106af565b3480156102bb575f5ffd5b5061016a6102ca3660046111fa565b63f23a6e6160e01b9695505050505050565b3480156102e7575f5ffd5b506102f0610730565b604080519384526001600160a01b03909216602084015290820152606001610142565b5f61031d82610746565b8061033857506001600160e01b03198216636faff5f160e01b145b92915050565b5f5f5f610349610730565b909350915050336001600160a01b03831614801561036657508086145b156103845760405163b79e3f3f60e01b815260040160405180910390fd5b50630a85bd0160e11b979650505050505050565b5f5f5f5f6103b885602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f0361048357828583016020016103d982610588565b1580156103ef57506001600160a01b0382163014155b1561040a57506001600160e01b031994506103389350505050565b604051630b135d3f60e11b81526001600160a01b03831690631626ba7e90610438908b908590600401611270565b602060405180830381865afa158015610453573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104779190611288565b95505050505050610338565b610492610228878386866107e7565b156104aa5750630b135d3f60e11b9250610338915050565b506001600160e01b031995945050505050565b5f6104c6610813565b6104d0848461087d565b90506104df8460200135610920565b6104e882610969565b9392505050565b60606104fa33610588565b15801561051b575033735ff137d4b0fdcd49dca30c7cf57e578a026d278914155b1561053957604051634780295360e11b815260040160405180910390fd5b5f61054887878787875a6109be565b925090508061055957815160208301fd5b5095945050505050565b5f61056d84610588565b610577575f610580565b630291f19360e51b5b949350505050565b5f5f5f610593610730565b6040516331a9108f60e11b81526004810182905291945092506001600160a01b038087169250841690636352211e90602401602060405180830381865afa1580156105e0573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060491906112a3565b6001600160a01b031614801561058057505050506001600160a01b0316151590565b5f735ff137d4b0fdcd49dca30c7cf57e578a026d2789604051631aab3f0d60e11b81523060048201525f60248201526001600160a01b0391909116906335567e1a90604401602060405180830381865afa158015610686573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106aa91906112be565b905090565b60606106ba33610588565b1580156106db575033735ff137d4b0fdcd49dca30c7cf57e578a026d278914155b156106f957604051634780295360e11b815260040160405180910390fd5b5f6107148888888888881561070e57886109be565b5a6109be565b925090508061072557815160208301fd5b509695505050505050565b5f5f5f61073b610ad8565b925092509250909192565b5f6001600160e01b03198216633ce4a3e960e01b148061077657506001600160e01b031982166301ffc9a760e01b145b8061079157506001600160e01b031982166306608bdf60e21b145b806107ac57506001600160e01b03198216630b135d3f60e11b145b806107c757506001600160e01b03198216630271189760e51b145b8061033857506001600160e01b03198216635194544760e01b1492915050565b5f5f5f5f6107f788888888610ae4565b9250925092506108078282610bac565b50909695505050505050565b33735ff137d4b0fdcd49dca30c7cf57e578a026d27891461087b5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064015b60405180910390fd5b565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c8120630b135d3f60e11b6108fe826108c56101008801886112d5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061039892505050565b6001600160e01b03191614610917576001915050610338565b505f9392505050565b6001600160401b0381106109665760405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964206e6f6e636560981b6044820152606401610872565b50565b8015610966576040515f9033905f1990849084818181858888f193505050503d805f81146109b2576040519150601f19603f3d011682016040523d82523d5f602084013e6109b7565b606091505b5050505050565b5f60608360ff165f03610a3257876001600160a01b0316838888886040516109e7929190611317565b5f60405180830381858888f193505050503d805f8114610a22576040519150601f19603f3d011682016040523d82523d5f602084013e610a27565b606091505b509092509050610acd565b8360ff16600103610a9157876001600160a01b0316838787604051610a58929190611317565b5f604051808303818686f4925050503d805f8114610a22576040519150601f19603f3d011682016040523d82523d5f602084013e610a27565b60405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21037b832b930ba34b7b760791b6044820152606401610872565b965096945050505050565b5f5f5f61073b30610c68565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610b1d57505f91506003905082610ba2565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610b6e573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116610b9957505f925060019150829050610ba2565b92505f91508190505b9450945094915050565b5f826003811115610bbf57610bbf611326565b03610bc8575050565b6001826003811115610bdc57610bdc611326565b03610bfa5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610c0e57610c0e611326565b03610c2f5760405163fce698f760e01b815260048101829052602401610872565b6003826003811115610c4357610c43611326565b03610c64576040516335e2f38360e21b815260048101829052602401610872565b5050565b604080516060808252608082019092525f91829182918291906020820181803683370190505090506060604d60208301873c80806020019051810190610cae919061133a565b935093509350509193909250565b6001600160a01b0381168114610966575f5ffd5b5f5f83601f840112610ce0575f5ffd5b5081356001600160401b03811115610cf6575f5ffd5b602083019150836020828501011115610d0d575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60c0898b031215610d2b575f5ffd5b8835610d3681610cbc565b97506020890135610d4681610cbc565b96506040890135610d5681610cbc565b95506060890135945060808901356001600160401b03811115610d77575f5ffd5b610d838b828c01610cd0565b90955093505060a08901356001600160401b03811115610da1575f5ffd5b610dad8b828c01610cd0565b999c989b5096995094979396929594505050565b6001600160e01b031981168114610966575f5ffd5b5f60208284031215610de6575f5ffd5b81356104e881610dc1565b5f5f5f5f5f60808688031215610e05575f5ffd5b8535610e1081610cbc565b94506020860135610e2081610cbc565b93506040860135925060608601356001600160401b03811115610e41575f5ffd5b610e4d88828901610cd0565b969995985093965092949392505050565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215610e83575f5ffd5b8235915060208301356001600160401b03811115610e9f575f5ffd5b8301601f81018513610eaf575f5ffd5b80356001600160401b03811115610ec857610ec8610e5e565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610ef657610ef6610e5e565b604052818152828201602001871015610f0d575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f5f60608486031215610f3e575f5ffd5b83356001600160401b03811115610f53575f5ffd5b84016101208187031215610f65575f5ffd5b95602085013595506040909401359392505050565b803560ff81168114610f8a575f5ffd5b919050565b5f5f5f5f5f60808688031215610fa3575f5ffd5b8535610fae81610cbc565b94506020860135935060408601356001600160401b03811115610fcf575f5ffd5b610fdb88828901610cd0565b9094509250610fee905060608701610f7a565b90509295509295909350565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6104e86020830184610ffa565b5f5f5f6040848603121561104c575f5ffd5b833561105781610cbc565b925060208401356001600160401b03811115611071575f5ffd5b61107d86828701610cd0565b9497909650939450505050565b5f6020828403121561109a575f5ffd5b81356104e881610cbc565b5f5f83601f8401126110b5575f5ffd5b5081356001600160401b038111156110cb575f5ffd5b6020830191508360208260051b8501011115610d0d575f5ffd5b5f5f5f5f5f5f5f5f60a0898b0312156110fc575f5ffd5b883561110781610cbc565b9750602089013561111781610cbc565b965060408901356001600160401b03811115611131575f5ffd5b61113d8b828c016110a5565b90975095505060608901356001600160401b0381111561115b575f5ffd5b6111678b828c016110a5565b90955093505060808901356001600160401b03811115610da1575f5ffd5b5f5f5f5f5f5f60a0878903121561119a575f5ffd5b86356111a581610cbc565b95506020870135945060408701356001600160401b038111156111c6575f5ffd5b6111d289828a01610cd0565b90955093506111e5905060608801610f7a565b95989497509295919493608090920135925050565b5f5f5f5f5f5f60a0878903121561120f575f5ffd5b863561121a81610cbc565b9550602087013561122a81610cbc565b9450604087013593506060870135925060808701356001600160401b03811115611252575f5ffd5b61125e89828a01610cd0565b979a9699509497509295939492505050565b828152604060208201525f6105806040830184610ffa565b5f60208284031215611298575f5ffd5b81516104e881610dc1565b5f602082840312156112b3575f5ffd5b81516104e881610cbc565b5f602082840312156112ce575f5ffd5b5051919050565b5f5f8335601e198436030181126112ea575f5ffd5b8301803591506001600160401b03821115611303575f5ffd5b602001915036819003821315610d0d575f5ffd5b818382375f9101908152919050565b634e487b7160e01b5f52602160045260245ffd5b5f5f5f6060848603121561134c575f5ffd5b8351602085015190935061135f81610cbc565b604094909401519295939450919291505056fea264697066735822122002390aa2047f18c7e70d9db3c183206222fedbd9e850724681683c6be808325964736f6c634300081b0033 \ No newline at end of file diff --git a/src/chain/bytecode/multicall.txt b/src/chain/bytecode/multicall.txt new file mode 100644 index 00000000..879bc493 --- /dev/null +++ b/src/chain/bytecode/multicall.txt @@ -0,0 +1 @@ +0x6080604052600436106100f35760003560e01c80634d2301cc1161008a578063a8b0574e11610059578063a8b0574e1461025a578063bce38bd714610275578063c3077fa914610288578063ee82ac5e1461029b57600080fd5b80634d2301cc146101ec57806372425d9d1461022157806382ad56cb1461023457806386d516e81461024757600080fd5b80633408e470116100c65780633408e47014610191578063399542e9146101a45780633e64a696146101c657806342cbb15c146101d957600080fd5b80630f28c97d146100f8578063174dea711461011a578063252dba421461013a57806327e86d6e1461015b575b600080fd5b34801561010457600080fd5b50425b6040519081526020015b60405180910390f35b61012d610128366004610a85565b6102ba565b6040516101119190610bbe565b61014d610148366004610a85565b6104ef565b604051610111929190610bd8565b34801561016757600080fd5b50437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0140610107565b34801561019d57600080fd5b5046610107565b6101b76101b2366004610c60565b610690565b60405161011193929190610cba565b3480156101d257600080fd5b5048610107565b3480156101e557600080fd5b5043610107565b3480156101f857600080fd5b50610107610207366004610ce2565b73ffffffffffffffffffffffffffffffffffffffff163190565b34801561022d57600080fd5b5044610107565b61012d610242366004610a85565b6106ab565b34801561025357600080fd5b5045610107565b34801561026657600080fd5b50604051418152602001610111565b61012d610283366004610c60565b61085a565b6101b7610296366004610a85565b610a1a565b3480156102a757600080fd5b506101076102b6366004610d18565b4090565b60606000828067ffffffffffffffff8111156102d8576102d8610d31565b60405190808252806020026020018201604052801561031e57816020015b6040805180820190915260008152606060208201528152602001906001900390816102f65790505b5092503660005b8281101561047757600085828151811061034157610341610d60565b6020026020010151905087878381811061035d5761035d610d60565b905060200281019061036f9190610d8f565b6040810135958601959093506103886020850185610ce2565b73ffffffffffffffffffffffffffffffffffffffff16816103ac6060870187610dcd565b6040516103ba929190610e32565b60006040518083038185875af1925050503d80600081146103f7576040519150601f19603f3d011682016040523d82523d6000602084013e6103fc565b606091505b50602080850191909152901515808452908501351761046d577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260846000fd5b5050600101610325565b508234146104e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d756c746963616c6c333a2076616c7565206d69736d6174636800000000000060448201526064015b60405180910390fd5b50505092915050565b436060828067ffffffffffffffff81111561050c5761050c610d31565b60405190808252806020026020018201604052801561053f57816020015b606081526020019060019003908161052a5790505b5091503660005b8281101561068657600087878381811061056257610562610d60565b90506020028101906105749190610e42565b92506105836020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166105a66020850185610dcd565b6040516105b4929190610e32565b6000604051808303816000865af19150503d80600081146105f1576040519150601f19603f3d011682016040523d82523d6000602084013e6105f6565b606091505b5086848151811061060957610609610d60565b602090810291909101015290508061067d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b50600101610546565b5050509250929050565b43804060606106a086868661085a565b905093509350939050565b6060818067ffffffffffffffff8111156106c7576106c7610d31565b60405190808252806020026020018201604052801561070d57816020015b6040805180820190915260008152606060208201528152602001906001900390816106e55790505b5091503660005b828110156104e657600084828151811061073057610730610d60565b6020026020010151905086868381811061074c5761074c610d60565b905060200281019061075e9190610e76565b925061076d6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff166107906040850185610dcd565b60405161079e929190610e32565b6000604051808303816000865af19150503d80600081146107db576040519150601f19603f3d011682016040523d82523d6000602084013e6107e0565b606091505b506020808401919091529015158083529084013517610851577f08c379a000000000000000000000000000000000000000000000000000000000600052602060045260176024527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060445260646000fd5b50600101610714565b6060818067ffffffffffffffff81111561087657610876610d31565b6040519080825280602002602001820160405280156108bc57816020015b6040805180820190915260008152606060208201528152602001906001900390816108945790505b5091503660005b82811015610a105760008482815181106108df576108df610d60565b602002602001015190508686838181106108fb576108fb610d60565b905060200281019061090d9190610e42565b925061091c6020840184610ce2565b73ffffffffffffffffffffffffffffffffffffffff1661093f6020850185610dcd565b60405161094d929190610e32565b6000604051808303816000865af19150503d806000811461098a576040519150601f19603f3d011682016040523d82523d6000602084013e61098f565b606091505b506020830152151581528715610a07578051610a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d756c746963616c6c333a2063616c6c206661696c656400000000000000000060448201526064016104dd565b506001016108c3565b5050509392505050565b6000806060610a2b60018686610690565b919790965090945092505050565b60008083601f840112610a4b57600080fd5b50813567ffffffffffffffff811115610a6357600080fd5b6020830191508360208260051b8501011115610a7e57600080fd5b9250929050565b60008060208385031215610a9857600080fd5b823567ffffffffffffffff811115610aaf57600080fd5b610abb85828601610a39565b90969095509350505050565b6000815180845260005b81811015610aed57602081850181015186830182015201610ad1565b81811115610aff576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b84811015610bb1578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001895281518051151584528401516040858501819052610b9d81860183610ac7565b9a86019a9450505090830190600101610b4f565b5090979650505050505050565b602081526000610bd16020830184610b32565b9392505050565b600060408201848352602060408185015281855180845260608601915060608160051b870101935082870160005b82811015610c52577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0888703018452610c40868351610ac7565b95509284019290840190600101610c06565b509398975050505050505050565b600080600060408486031215610c7557600080fd5b83358015158114610c8557600080fd5b9250602084013567ffffffffffffffff811115610ca157600080fd5b610cad86828701610a39565b9497909650939450505050565b838152826020820152606060408201526000610cd96060830184610b32565b95945050505050565b600060208284031215610cf457600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610bd157600080fd5b600060208284031215610d2a57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112610dc357600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610e0257600080fd5b83018035915067ffffffffffffffff821115610e1d57600080fd5b602001915036819003821315610a7e57600080fd5b8183823760009101908152919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112610dc357600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112610dc357600080fdfea2646970667358221220bb2b5c71a328032f97c676ae39a1ec2148d3e5d6f73d95e9b17910152d61f16264736f6c634300080c0033 \ No newline at end of file diff --git a/src/chain/mod.rs b/src/chain/mod.rs index 03e05553..3347609a 100644 --- a/src/chain/mod.rs +++ b/src/chain/mod.rs @@ -1,12 +1,9 @@ -use std::collections::HashMap; -use std::path::PathBuf; use std::process::{Child, Command, Stdio}; use color_eyre::{ eyre::{eyre, Result}, Section, }; -use fs_err as fs; use reqwest::Client; use tokio::time::{sleep, Duration}; use tracing::{info, instrument}; @@ -16,75 +13,222 @@ use crate::run_tests::types::BroadcastRecvBool; use crate::setup::{check_foundry_deps, get_deps}; use crate::KIT_CACHE; -include!("../../target/chain_includes.rs"); +const OWNER_ADDRESS: &str = "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"; // first account on anvil +const DOT_OS_TBA: &str = "0xbE46837617f8304Aa5E6d0aE62B74340251f48Bf"; // dot OS TBA const DEFAULT_MAX_ATTEMPTS: u16 = 16; -pub const FAKENODE_TO_FOUNDRY: &[(&str, &str)] = &[("<0.9.8", "008922d51"), (">=0.9.8", "c3069a5")]; -pub const FOUNDRY_COMMIT_TO_DATE: &[(&str, &str)] = &[ - ("008922d51", "2024-04-23T00:23:10.634984900Z"), - ("c3069a5", "2024-11-05T00:22:10.561306811Z"), +const PREDEPLOY_CONTRACTS: &[(&str, &str)] = &[ + ( + "0x000000006551c19487814612e58FE06813775758", // ERC6551Registry + include_str!("./bytecode/erc6551_registry.txt"), + ), + ( + "0xcA11bde05977b3631167028862bE2a173976CA11", // Multicall3 + include_str!("./bytecode/multicall.txt"), + ), + ( + "0x000000000012d439e33aAD99149d52A5c6f980Dc", // KinoAccount + include_str!("./bytecode/kinoaccount.txt"), + ), + // public minter should be at: 0xa470f15b504f025ce24ed3dbb417b367d3def72f + ( + "0x000000000033e5CCbC52Ec7BDa87dB768f9aA93F", // Kimap proxy + include_str!("./bytecode/erc1967proxy.txt"), + ), + ( + "0x969cAbCE3625224BA3d340ea4dC2f929301188Ad", // Kimap impl + include_str!("./bytecode/kimap.txt"), + ), +]; + +const STORAGE_SLOTS: &[(&str, &str, &str)] = &[ + // Implementation slot + ( + "0x000000000033e5CCbC52Ec7BDa87dB768f9aA93F", // Kimap proxy + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc", // implementation slot + "0x000000000000000000000000969cAbCE3625224BA3d340ea4dC2f929301188Ad", // implementation address + ), + // KIMAP immutable (set to proxy's own address) + ( + "0x000000000033e5CCbC52Ec7BDa87dB768f9aA93F", // Kimap proxy + "0x0000000000000000000000000000000000000000000000000000000000000000", // storage slot + "0x000000000000000000000000000000000033e5ccbc52ec7bda87db768f9aa93f", // kimap proxy address + ), +]; + +const TRANSACTIONS: &[(&str, &str)] = &[ + // initialize Kimap + // cast calldata "initialize(address)" 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 + ( + "0x000000000033e5CCbC52Ec7BDa87dB768f9aA93F", + "0xc4d66de8000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + ), + // CREATE2 deploy KinoAccountMinter (deployed at 0xa470f15b504f025ce24ed3dbb417b367d3def72f) + ( + "0x4e59b44847b379578588920cA78FbF26c0B4956C", + include_str!("./bytecode/deploykinoaccountminter.txt"), + ), + // mint .os + // cast calldata "execute(address,uint256,bytes,uint8)" 0x000000000033e5CCbC52Ec7BDa87dB768f9aA93F 0 $(cast calldata "mint(address,bytes,bytes,address)" 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 $(cast --from-ascii "os") $(cast calldata "initialize()") 0xa470f15b504f025ce24ed3dbb417b367d3def72f) 0 + ( + "0x4bb0778bb92564bf8e82d0b3271b7512443fb060", // zeroth TBA + "0x51945447000000000000000000000000000000000033e5ccbc52ec7bda87db768f9aa93f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104094cefed000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000a470f15b504f025ce24ed3dbb417b367d3def72f00000000000000000000000000000000000000000000000000000000000000026f7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048129fc1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + ), + // mint .dev + // cast calldata "execute(address,uint256,bytes,uint8)" 0x000000000033e5CCbC52Ec7BDa87dB768f9aA93F 0 $(cast calldata "mint(address,bytes,bytes,address)" 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 $(cast --from-ascii "dev") $(cast calldata "initialize()") 0xa470f15b504f025ce24ed3dbb417b367d3def72f) 0 + ( + "0x4bb0778bb92564bf8e82d0b3271b7512443fb060", // zeroth TBA + "0x51945447000000000000000000000000000000000033e5ccbc52ec7bda87db768f9aa93f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104094cefed000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000a470f15b504f025ce24ed3dbb417b367d3def72f0000000000000000000000000000000000000000000000000000000000000003646576000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048129fc1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + ), ]; -pub const FOUNDRY_NEWEST_COMMIT: &str = "c3069a5"; + +#[instrument(level = "trace", skip_all)] +async fn initialize_contracts(port: u16) -> Result<()> { + let client = Client::new(); + let url = format!("http://localhost:{}", port); + + // impersonate owner account + let request_body = serde_json::json!({ + "jsonrpc": "2.0", + "method": "anvil_impersonateAccount", + "params": [OWNER_ADDRESS], + "id": 1 + }); + let _: serde_json::Value = client + .post(&url) + .json(&request_body) + .send() + .await? + .json() + .await?; + + // set storage slots + for (address, slot, value) in STORAGE_SLOTS { + let request_body: serde_json::Value = serde_json::json!({ + "jsonrpc": "2.0", + "method": "anvil_setStorageAt", + "params": [address, slot, value], + "id": 1 + }); + let _: serde_json::Value = client + .post(&url) + .json(&request_body) + .send() + .await? + .json() + .await?; + } + + // get current nonce + let request_body = serde_json::json!({ + "jsonrpc": "2.0", + "method": "eth_getTransactionCount", + "params": [OWNER_ADDRESS, "latest"], + "id": 1 + }); + let response: serde_json::Value = client + .post(&url) + .json(&request_body) + .send() + .await? + .json() + .await?; + + let nonce_hex = response["result"] + .as_str() + .ok_or_else(|| eyre!("Invalid nonce response"))? + .trim_start_matches("0x"); + + let mut nonce = u64::from_str_radix(nonce_hex, 16)?; + + // execute all transactions + for (to, data) in TRANSACTIONS { + let request_body = serde_json::json!({ + "jsonrpc": "2.0", + "method": "eth_sendTransaction", + "params": [{ + "from": OWNER_ADDRESS, + "to": to, + "data": data, + "nonce": format!("0x{:x}", nonce), + "gas": "0x500000", + }], + "id": 1 + }); + + let res: serde_json::Value = client + .post(&url) + .json(&request_body) + .send() + .await? + .json() + .await?; + + if let Some(error) = res.get("error") { + info!("Transaction failed: {:?}", error); + } + nonce += 1; + } + + // stop impersonating + let request_body = serde_json::json!({ + "jsonrpc": "2.0", + "method": "anvil_stopImpersonatingAccount", + "params": [OWNER_ADDRESS], + "id": 1 + }); + let _: serde_json::Value = client + .post(&url) + .json(&request_body) + .send() + .await? + .json() + .await?; + + Ok(()) +} + +#[instrument(level = "trace", skip_all)] +async fn check_dot_os_tba(port: u16) -> Result { + let client = Client::new(); + let url = format!("http://localhost:{}", port); + + let request_body = serde_json::json!({ + "jsonrpc": "2.0", + "method": "eth_getCode", + "params": [DOT_OS_TBA, "latest"], + "id": 1 + }); + + let response = client.post(&url).json(&request_body).send().await?; + let result: serde_json::Value = response.json().await?; + let code = result["result"].as_str().unwrap_or("0x"); + Ok(code != "0x") +} #[instrument(level = "trace", skip_all)] pub async fn start_chain( port: u16, mut recv_kill: BroadcastRecvBool, - fakenode_version: Option, + _fakenode_version: Option, verbose: bool, ) -> Result> { - let fakenode_to_foundry: HashMap = FAKENODE_TO_FOUNDRY - .iter() - .map(|ss| (ss.0.parse().unwrap(), ss.1.to_string())) - .collect(); - let foundry_commit_to_date: HashMap> = - FOUNDRY_COMMIT_TO_DATE - .iter() - .map(|ss| (ss.0.to_string(), ss.1.parse().unwrap())) - .collect(); - let foundry_commit_to_content: HashMap = FOUNDRY_COMMIT_TO_CONTENT - .iter() - .map(|ss| (ss.0.to_string(), ss.1.to_string())) - .collect(); - - let (newer_than, required_commit) = match fakenode_version { - None => (None, None), - Some(v) => { - let Some((_, commit)) = fakenode_to_foundry.iter().find(|(vr, _)| vr.matches(&v)) - else { - return Err(eyre!("")); - }; - ( - foundry_commit_to_date.get(commit).map(|d| d.clone()), - Some(commit.to_string()), - ) - } - }; - - let deps = check_foundry_deps(newer_than, required_commit.clone())?; + let deps = check_foundry_deps(None, None)?; get_deps(deps, &mut recv_kill, verbose).await?; - let required_commit = required_commit.unwrap_or_else(|| FOUNDRY_NEWEST_COMMIT.to_string()); - - let kinostate_path = PathBuf::from(KIT_CACHE).join(format!("kinostate-{required_commit}.json")); - let kinostate_content = foundry_commit_to_content - .get(&required_commit) - .expect(&format!( - "couldn't find kinostate content for foundry commit {required_commit}" - )); - fs::write(&kinostate_path, kinostate_content)?; - info!("Checking for Anvil on port {}...", port); if wait_for_anvil(port, 1, None).await.is_ok() { + if !check_dot_os_tba(port).await? { + predeploy_contracts(port).await?; + initialize_contracts(port).await?; + } return Ok(None); } let mut child = Command::new("anvil") .arg("--port") .arg(port.to_string()) - .arg("--load-state") - .arg(&kinostate_path) .current_dir(KIT_CACHE) .stdout(if verbose { Stdio::inherit() @@ -99,6 +243,18 @@ pub async fn start_chain( return Err(e); } + if !check_dot_os_tba(port).await? { + if let Err(e) = predeploy_contracts(port).await { + let _ = child.kill(); + return Err(e.wrap_err("Failed to pre-deploy contracts")); + } + + if let Err(e) = initialize_contracts(port).await { + let _ = child.kill(); + return Err(e.wrap_err("Failed to initialize contracts")); + } + } + Ok(Some(child)) } @@ -154,6 +310,43 @@ async fn wait_for_anvil( .with_suggestion(|| "Is port already occupied?")) } +#[instrument(level = "trace", skip_all)] +async fn predeploy_contracts(port: u16) -> Result<()> { + let client = Client::new(); + let url = format!("http://localhost:{}", port); + + for (address, bytecode) in PREDEPLOY_CONTRACTS { + let request_body = serde_json::json!({ + "jsonrpc": "2.0", + "method": "eth_getCode", + "params": [address, "latest"], + "id": 1 + }); + + let response = client.post(&url).json(&request_body).send().await?; + let result: serde_json::Value = response.json().await?; + let code = result["result"].as_str().unwrap_or("0x"); + + if code == "0x" { + let request_body = serde_json::json!({ + "jsonrpc": "2.0", + "method": "anvil_setCode", + "params": [address, bytecode.trim()], + "id": 1 + }); + let _: serde_json::Value = client + .post(&url) + .json(&request_body) + .send() + .await? + .json() + .await?; + } + } + + Ok(()) +} + /// kit chain, alias to anvil #[instrument(level = "trace", skip_all)] pub async fn execute(port: u16, version: &str, verbose: bool) -> Result<()> { diff --git a/src/setup/mod.rs b/src/setup/mod.rs index 39e79b12..7433ad15 100644 --- a/src/setup/mod.rs +++ b/src/setup/mod.rs @@ -373,20 +373,13 @@ pub fn check_js_deps() -> Result> { /// Check for Foundry deps, returning a Vec of Dependency if not found: can be automatically fetched? #[instrument(level = "trace", skip_all)] pub fn check_foundry_deps( - newer_than: Option>, - required_commit: Option, + _newer_than: Option>, + _required_commit: Option, ) -> Result> { if !is_command_installed("anvil")? { - return Ok(vec![Dependency::Foundry(required_commit)]); - } - let Some(newer_than) = newer_than else { - return Ok(vec![]); - }; - let (_, installed_datetime) = get_foundry_version()?; - let installed_datetime = installed_datetime.parse::>()?; - if installed_datetime < newer_than { - return Ok(vec![Dependency::Foundry(required_commit)]); + return Ok(vec![Dependency::Foundry(_required_commit)]); } + // let (_, installed_datetime) = get_foundry_version()?; Ok(vec![]) }