diff --git a/agent/flow-trace/03_E3_REQUEST_AND_COMMITTEE.md b/agent/flow-trace/03_E3_REQUEST_AND_COMMITTEE.md index 1ee51985ae..56be89b2f4 100644 --- a/agent/flow-trace/03_E3_REQUEST_AND_COMMITTEE.md +++ b/agent/flow-trace/03_E3_REQUEST_AND_COMMITTEE.md @@ -292,7 +292,7 @@ CiphernodeRegistrySolWriter receives CommitteeFinalizeRequested │ │ │ │ } │ │ │ │ │ └──────────────────────────────────────────┘ │ │ │ │ - │ │ 6. Emit CommitteeFinalized(e3Id, committee) │ + │ │ 6. Emit CommitteeFinalized(e3Id, committee, scores) │ │ │ } │ │ └─────────────────────────────────────────────────────────┘ ``` @@ -303,7 +303,7 @@ CiphernodeRegistrySolWriter receives CommitteeFinalizeRequested CiphernodeRegistrySolReader decodes CommitteeFinalized event │ ├─ Publishes EnclaveEvent::CommitteeFinalized { -│ e3_id, committee: [addr1, addr2, ..., addrN], chain_id +│ e3_id, committee: [addr1, addr2, ..., addrN], scores: [s1, s2, ..., sN], chain_id │ } │ ├─ Sortition actor: diff --git a/crates/events/src/enclave_event/committee_finalized.rs b/crates/events/src/enclave_event/committee_finalized.rs index 69bdb9cfa3..91b173613b 100644 --- a/crates/events/src/enclave_event/committee_finalized.rs +++ b/crates/events/src/enclave_event/committee_finalized.rs @@ -6,6 +6,7 @@ use crate::E3id; use actix::Message; +use alloy::primitives::U256; use serde::{Deserialize, Serialize}; use std::fmt::{self, Display}; @@ -14,9 +15,40 @@ use std::fmt::{self, Display}; pub struct CommitteeFinalized { pub e3_id: E3id, pub committee: Vec, + pub scores: Vec, pub chain_id: u64, } +impl CommitteeFinalized { + /// Sort committee members by ascending score so every node derives the same + /// deterministic ordering. The node with the lowest score ends up at index 0. + /// If scores are empty or unparseable, the order is left unchanged. + pub fn sort_by_score(&mut self) { + if self.scores.len() != self.committee.len() || self.scores.is_empty() { + return; + } + + // Build (index, parsed_score) pairs + let mut indices: Vec = (0..self.committee.len()).collect(); + let parsed: Vec> = + self.scores.iter().map(|s| s.parse::().ok()).collect(); + + // If any score fails to parse, leave order unchanged + if parsed.iter().any(|s| s.is_none()) { + return; + } + + indices.sort_by_key(|&i| parsed[i].unwrap()); + + let sorted_committee: Vec = + indices.iter().map(|&i| self.committee[i].clone()).collect(); + let sorted_scores: Vec = indices.iter().map(|&i| self.scores[i].clone()).collect(); + + self.committee = sorted_committee; + self.scores = sorted_scores; + } +} + impl Display for CommitteeFinalized { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{:?}", self) diff --git a/crates/evm/src/ciphernode_registry_sol.rs b/crates/evm/src/ciphernode_registry_sol.rs index 63b4fa435c..d9e06e27a9 100644 --- a/crates/evm/src/ciphernode_registry_sol.rs +++ b/crates/evm/src/ciphernode_registry_sol.rs @@ -117,7 +117,7 @@ struct CommitteeFinalizedWithChainId(pub ICiphernodeRegistry::CommitteeFinalized impl From for CommitteeFinalized { fn from(value: CommitteeFinalizedWithChainId) -> Self { - e3_events::CommitteeFinalized { + let mut result = e3_events::CommitteeFinalized { e3_id: E3id::new(value.0.e3Id.to_string(), value.1), committee: value .0 @@ -125,8 +125,11 @@ impl From for CommitteeFinalized { .iter() .map(|addr| addr.to_string()) .collect(), + scores: value.0.scores.iter().map(|s| s.to_string()).collect(), chain_id: value.1, - } + }; + result.sort_by_score(); + result } } diff --git a/crates/tests/tests/integration.rs b/crates/tests/tests/integration.rs index eb153f29ee..f746c899c3 100644 --- a/crates/tests/tests/integration.rs +++ b/crates/tests/tests/integration.rs @@ -401,6 +401,20 @@ pub fn save_snapshot(file_name: &str, bytes: &[u8]) { fs::write(format!("tests/{file_name}"), bytes).unwrap(); } +/// Compute placeholder scores for a committee. +/// Uses ticket_id=0 for each address with the given e3_id and seed. +fn compute_committee_scores(committee: &[String], e3_id: &E3id, seed: Seed) -> Vec { + use e3_sortition::hash_to_score; + committee + .iter() + .map(|addr| { + let address: Address = addr.parse().unwrap(); + let score = hash_to_score(address, 0, e3_id.clone(), seed); + U256::from_be_slice(&score.to_bytes_be()).to_string() + }) + .collect() +} + /// Determines the committee for a given E3 request using deterministic sortition. /// /// This function runs the same sortition algorithm that the ciphernodes use internally, @@ -415,7 +429,7 @@ pub fn save_snapshot(file_name: &str, bytes: &[u8]) { /// * `collector_addr` - Address of the collector node (for validation) /// /// # Returns -/// A tuple of (committee_addresses, buffer_addresses) +/// A tuple of (committee_addresses, committee_scores, buffer_addresses) fn determine_committee( e3_id: &E3id, seed: Seed, @@ -423,7 +437,7 @@ fn determine_committee( threshold_n: usize, registered_addrs: &[String], collector_addr: &str, -) -> Result<(Vec, Vec)> { +) -> Result<(Vec, Vec, Vec)> { let buffer = calculate_buffer_size(threshold_m, threshold_n); let total_selection_size = threshold_n + buffer; @@ -457,6 +471,12 @@ fn determine_committee( .map(|w| w.address.to_string()) .collect(); + let committee_scores: Vec = winners + .iter() + .take(threshold_n) + .map(|w| U256::from_be_slice(&w.score.to_bytes_be()).to_string()) + .collect(); + let buffer_nodes: Vec = winners .iter() .skip(threshold_n) @@ -476,7 +496,7 @@ fn determine_committee( } } - Ok((committee, buffer_nodes)) + Ok((committee, committee_scores, buffer_nodes)) } async fn setup_score_sortition_environment( @@ -736,7 +756,7 @@ async fn test_trbfv_actor() -> Result<()> { sleep(Duration::from_millis(500)).await; - let (committee, buffer_nodes) = determine_committee( + let (committee, committee_scores, buffer_nodes) = determine_committee( &e3_id, seed, threshold_m, @@ -756,6 +776,7 @@ async fn test_trbfv_actor() -> Result<()> { bus.publish_without_context(CommitteeFinalized { e3_id: e3_id.clone(), committee: committee.clone(), + scores: committee_scores, chain_id, })?; @@ -1252,6 +1273,7 @@ async fn test_stopped_keyshares_retain_state() -> Result<()> { bus.publish_without_context(CommitteeFinalized { e3_id: e3_id.clone(), committee: eth_addrs.clone(), + scores: compute_committee_scores(ð_addrs, &e3_id, seed.clone()), chain_id: 1, })?; @@ -1499,6 +1521,7 @@ async fn test_duplicate_e3_id_with_different_chain_id() -> Result<()> { bus.publish_without_context(CommitteeFinalized { e3_id: E3id::new("1234", 1), committee: eth_addrs.clone(), + scores: compute_committee_scores(ð_addrs, &E3id::new("1234", 1), seed.clone()), chain_id: 1, })?; @@ -1537,6 +1560,7 @@ async fn test_duplicate_e3_id_with_different_chain_id() -> Result<()> { bus.publish_without_context(CommitteeFinalized { e3_id: E3id::new("1234", 2), committee: eth_addrs.clone(), + scores: compute_committee_scores(ð_addrs, &E3id::new("1234", 2), seed.clone()), chain_id: 2, })?; diff --git a/packages/enclave-contracts/artifacts/contracts/Enclave.sol/Enclave.json b/packages/enclave-contracts/artifacts/contracts/Enclave.sol/Enclave.json index 9ea44ab9b2..c7b335ec71 100644 --- a/packages/enclave-contracts/artifacts/contracts/Enclave.sol/Enclave.json +++ b/packages/enclave-contracts/artifacts/contracts/Enclave.sol/Enclave.json @@ -2565,5 +2565,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/Enclave.sol", - "buildInfoId": "solc-0_8_28-74ea8e366bd07fddf0065d16be962bc1ae5e80d7" + "buildInfoId": "solc-0_8_28-d3db7173950582d145915864c28ba15e975a7c98" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json b/packages/enclave-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json index 35149dca85..5300c1d0ae 100644 --- a/packages/enclave-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json +++ b/packages/enclave-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json @@ -940,5 +940,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/IBondingRegistry.sol", - "buildInfoId": "solc-0_8_28-74ea8e366bd07fddf0065d16be962bc1ae5e80d7" + "buildInfoId": "solc-0_8_28-d3db7173950582d145915864c28ba15e975a7c98" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json b/packages/enclave-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json index bf4d0a6cda..7563739e37 100644 --- a/packages/enclave-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json +++ b/packages/enclave-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json @@ -246,6 +246,12 @@ "internalType": "address[]", "name": "committee", "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "scores", + "type": "uint256[]" } ], "name": "CommitteeFinalized", @@ -954,5 +960,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/ICiphernodeRegistry.sol", - "buildInfoId": "solc-0_8_28-74ea8e366bd07fddf0065d16be962bc1ae5e80d7" + "buildInfoId": "solc-0_8_28-d3db7173950582d145915864c28ba15e975a7c98" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json b/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json index 9f95a33a78..15f9047249 100644 --- a/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json +++ b/packages/enclave-contracts/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json @@ -2093,5 +2093,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/IEnclave.sol", - "buildInfoId": "solc-0_8_28-74ea8e366bd07fddf0065d16be962bc1ae5e80d7" + "buildInfoId": "solc-0_8_28-d3db7173950582d145915864c28ba15e975a7c98" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json b/packages/enclave-contracts/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json index 152cd54269..480e8ce6c7 100644 --- a/packages/enclave-contracts/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json +++ b/packages/enclave-contracts/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json @@ -954,5 +954,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/ISlashingManager.sol", - "buildInfoId": "solc-0_8_28-74ea8e366bd07fddf0065d16be962bc1ae5e80d7" + "buildInfoId": "solc-0_8_28-d3db7173950582d145915864c28ba15e975a7c98" } \ No newline at end of file diff --git a/packages/enclave-contracts/artifacts/contracts/registry/CiphernodeRegistryOwnable.sol/CiphernodeRegistryOwnable.json b/packages/enclave-contracts/artifacts/contracts/registry/CiphernodeRegistryOwnable.sol/CiphernodeRegistryOwnable.json index acd5887045..c9b682e2dc 100644 --- a/packages/enclave-contracts/artifacts/contracts/registry/CiphernodeRegistryOwnable.sol/CiphernodeRegistryOwnable.json +++ b/packages/enclave-contracts/artifacts/contracts/registry/CiphernodeRegistryOwnable.sol/CiphernodeRegistryOwnable.json @@ -296,6 +296,12 @@ "internalType": "address[]", "name": "committee", "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "scores", + "type": "uint256[]" } ], "name": "CommitteeFinalized", @@ -1253,30 +1259,30 @@ "type": "function" } ], - "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b613d3d806100d65f395ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80639f0f874a11610135578063e59e4695116100b4578063f26ef74e11610079578063f26ef74e14610571578063f2fde38b14610584578063f379b0df14610597578063f52fd803146105d1578063f6fc05d514610643575f5ffd5b8063e59e469514610516578063e6745e1314610529578063e82f3b701461053c578063ebf0c7171461054f578063f165053614610557575f5ffd5b8063c3a0ec30116100fa578063c3a0ec30146104ae578063ca2869a0146104bf578063cd6dc687146104de578063da881e5a146104f1578063dbb06c9314610504575f5ffd5b80639f0f874a1461044d578063a016493014610456578063a8a4d69b14610469578063bff232c11461047c578063c2b40ae41461048f575f5ffd5b8063715018a6116101c15780638d1ddfb1116101865780638d1ddfb1146103cd5780638da5cb5b146103e35780638e5ce3ad146103eb5780639015d371146103fe5780639a7a2ffc14610411575f5ffd5b8063715018a6146103465780637c92f5241461034e578063858142431461037b5780638a78bb151461039b5780638cb89ecb146103ae575f5ffd5b80632e7b716d116102075780632e7b716d146102d85780634d6861a6146102eb57806350e6d94c146102fe5780635d5047761461032057806370e36bbe14610333575f5ffd5b8063096b810a146102435780630f3e34121461025857806317d611201461026b5780632800d82914610294578063291a691b146102b5575b5f5ffd5b610256610251366004613195565b61064c565b005b6102566102663660046131b0565b610798565b61027e6102793660046131b0565b6107db565b60405161028b91906131c7565b60405180910390f35b6102a76102a23660046131b0565b61091d565b60405190815260200161028b565b6102c86102c3366004613212565b610969565b604051901515815260200161028b565b6102c86102e6366004613195565b610b43565b6102c86102f93660046131b0565b610bf6565b6102c861030c366004613195565b60066020525f908152604090205460ff1681565b6102c861032e36600461324b565b610c35565b610256610341366004613195565b610c79565b610256610cef565b61036161035c366004613279565b610d02565b6040805192835263ffffffff90911660208301520161028b565b60015461038e906001600160a01b031681565b60405161028b91906132ae565b6102566103a9366004613195565b610ea9565b6102a76103bc3660046131b0565b60096020525f908152604090205481565b600454600160281b900464ffffffffff166102a7565b61038e610fe7565b600b5461038e906001600160a01b031681565b6102c861040c366004613195565b611015565b61043761041f366004613195565b60076020525f908152604090205464ffffffffff1681565b60405164ffffffffff909116815260200161028b565b6102a760035481565b61027e6104643660046131b0565b611032565b6102c861047736600461324b565b6110c8565b61025661048a366004613195565b61110c565b6102a761049d3660046131b0565b60086020525f908152604090205481565b6001546001600160a01b031661038e565b6102a76104cd3660046131b0565b5f9081526008602052604090205490565b6102566104ec3660046132c2565b61115d565b6102c86104ff3660046131b0565b6112ba565b5f5461038e906001600160a01b031681565b610256610524366004613195565b6114ed565b6102566105373660046132ec565b611565565b6102a761054a3660046131b0565b611728565b6102a7611759565b61055f601481565b60405160ff909116815260200161028b565b61025661057f366004613350565b61176b565b610256610592366004613195565b611a65565b6004546105b39064ffffffffff80821691600160281b90041682565b6040805164ffffffffff93841681529290911660208301520161028b565b6106146105df3660046131b0565b5f908152600a6020819052604090912090810154600590910154909163ffffffff80831692600160201b900416908284101590565b60405161028b949392919093845263ffffffff9283166020850152911660408301521515606082015260800190565b6102a760025481565b610654610fe7565b6001600160a01b0316336001600160a01b0316148061067d57506001546001600160a01b031633145b61069a57604051632864c4e160e01b815260040160405180910390fd5b6106a381611015565b81906106cc576040516381e5828960e01b81526004016106c391906132ae565b60405180910390fd5b506001600160a01b0381165f9081526007602052604081205464ffffffffff16906106fa9060049083611a9f565b6001600160a01b0382165f908152600660205260408120805460ff1916905560028054916107278361346a565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f8c008e3835f6c79bfcdb89f0f6ca8705e0b01049ee84a90b0e4da1c7ba9405d5906060015b60405180910390a25050565b6107a0611d41565b60038190556040518181527fbe772dc189863d512fa01e489c8eac204975aef1a8662d8b5a333804b5207ab79060200160405180910390a150565b5f818152600a602081905260408220600681015491810154606093919291816001600160401b038111156108115761081161347f565b60405190808252806020026020018201604052801561083a578160200160208202803683370190505b5090505f805b84811015610911576001866009015f886006018481548110610864576108646134a7565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205460ff16600281111561089c5761089c613493565b03610909578560060181815481106108b6576108b66134a7565b905f5260205f20015f9054906101000a90046001600160a01b03168383815181106108e3576108e36134a7565b6001600160a01b039092166020928302919091019091015281610905816134bb565b9250505b600101610840565b50909695505050505050565b5f818152600a6020526040812081815460ff16600381111561094157610941613493565b0361095f57604051630d4c1d9760e41b815260040160405180910390fd5b6003015492915050565b5f80546001600160a01b031633146109945760405163e4c2a7eb60e01b815260040160405180910390fd5b5f848152600a6020526040812090815460ff1660038111156109b8576109b8613493565b146109d6576040516374ff462560e11b815260040160405180910390fd5b60015460408051630cc37d8f60e11b815290515f926001600160a01b031691631986fb1e9160048083019260209291908290030181865afa158015610a1d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4191906134d3565b905080610a5460408601602087016134fd565b63ffffffff161115610a6c60408601602087016134fd565b829091610a9a576040516344ec930f60e01b815263ffffffff909216600483015260248201526044016106c3565b5050815460ff1916600190811783558201859055436002830155600354610ac19042613516565b6003830155610ad5600583018560026130cc565b50610ade611759565b5f87815260086020526040908190209190915560028301546003840154915188927f381d281d32f95ef8fe4e5f3b263ea6a32d03d331e1a141ae1da996dc02a7a17092610b2f928a928a9291613529565b60405180910390a250600195945050505050565b5f610b4d82611015565b610b5857505f919050565b6001546001600160a01b0316610b81576040516350ca893360e01b815260040160405180910390fd5b600154604051639f8a13d760e01b81526001600160a01b0390911690639f8a13d790610bb19085906004016132ae565b602060405180830381865afa158015610bcc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf09190613588565b92915050565b5f818152600a602052604081206001815460ff166003811115610c1b57610c1b613493565b14610c2857505f92915050565b6003015442111592915050565b5f60015f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff166002811115610c7157610c71613493565b149392505050565b610c81611d41565b6001600160a01b038116610ca85760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b038316908117825560405190917f2c8267accd82e977550ed2349c73311183cd22e306347be4453c8d130995e3c991a250565b610cf7611d41565b610d005f611d73565b565b600b545f9081906001600160a01b03163314610d315760405163fcef374960e01b815260040160405180910390fd5b5f858152600a602052604090206002815460ff166003811115610d5657610d56613493565b14610d7457604051634f4b461f60e11b815260040160405180910390fd5b60058101546001600160a01b0386165f90815260098301602052604090205463ffffffff909116925060019060ff166002811115610db457610db4613493565b14610dc457600a01549150610ea1565b6001600160a01b0385165f9081526009820160205260408120805460ff19166002179055600a8201805491610df88361346a565b919050555080600a01549250846001600160a01b0316867f6c783b92374361b4d6efaf29673b89437ee969bb3c9d2d5d86b143ad5447b8498686604051610e49929190918252602082015260400190565b60405180910390a36040805184815263ffffffff84166020820181905285101591810182905287907f119cb11dd0a68c257d6dc9b06dcb37dd422ce276eb8bf3cd0b7079a116b8e2989060600160405180910390a250505b935093915050565b610eb1610fe7565b6001600160a01b0316336001600160a01b03161480610eda57506001546001600160a01b031633145b610ef757604051632864c4e160e01b815260040160405180910390fd5b610f0081611015565b610fe45760048054600160281b900464ffffffffff1690610f2a906001600160a01b038416611de3565b6001600160a01b0382165f908152600660209081526040808320805460ff1916600117905560079091528120805464ffffffffff841664ffffffffff199091161790556002805491610f7b836134bb565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f3318d261fe14a5761d2d1e21555652f623d2134c430a9883c9ad6e958bb0db539060600161078c565b50565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03165f9081526006602052604090205460ff1690565b5f818152600a60205260409020600481015460609190611065576040516322e679e360e11b815260040160405180910390fd5b806006018054806020026020016040519081016040528092919081815260200182805480156110bb57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161109d575b5050505050915050919050565b5f805f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff16600281111561110357611103613493565b14159392505050565b611114611d41565b6001600160a01b03811661113b5760405163d92e233d60e01b815260040160405180910390fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f611166611fb9565b805490915060ff600160401b82041615906001600160401b03165f8115801561118c5750825b90505f826001600160401b031660011480156111a75750303b155b9050811580156111b5575080155b156111d35760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111fd57845460ff60401b1916600160401b1785555b6001600160a01b0387166112245760405163d92e233d60e01b815260040160405180910390fd5b61122d33611fe1565b61123960046014611ff2565b61124286610798565b61124a610fe7565b6001600160a01b0316876001600160a01b03161461126b5761126b87611a65565b83156112b157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f818152600a6020526040812081815460ff1660038111156112de576112de613493565b036112fc57604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff16600381111561131457611314613493565b1461133257604051631860f69960e31b815260040160405180910390fd5b8060030154421161135657604051632f021e8d60e11b815260040160405180910390fd5b60058101546006820154600160201b90910463ffffffff1611158061143b578154600360ff199091161782556006820154600583015460408051928352600160201b90910463ffffffff16602083015285917fecc4a9fb7e28d074cba7f5b227e9b5827823c850a385539b9a2f98a08f8c203d910160405180910390a25f54604051635d968dc160e11b815260048101869052600260248201526001600160a01b039091169063bb2d1b82906044015f604051808303815f87803b15801561141c575f5ffd5b505af115801561142e573d5f5f3e3d5ffd5b505f979650505050505050565b815460ff191660021782556006820154600a8301555f54604051631f3ea75d60e21b8152600481018690526001600160a01b0390911690637cfa9d74906024015f604051808303815f87803b158015611492575f5ffd5b505af11580156114a4573d5f5f3e3d5ffd5b50505050837fed38c6266ebed7c01d311349a7fa67e0ef0f1d2f4760d60dbb34ca4799a2e132836006016040516114db91906135a1565b60405180910390a25060019392505050565b6114f5611d41565b6001600160a01b03811661151c5760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a7905f90a250565b5f828152600a6020526040812090815460ff16600381111561158957611589613493565b036115a757604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff1660038111156115bf576115bf613493565b146115dd57604051631860f69960e31b815260040160405180910390fd5b806003015442111561160257604051639a19114d60e01b815260040160405180910390fd5b335f90815260078201602052604090205460ff16156116345760405163257309f160e11b815260040160405180910390fd5b61163d33610b43565b61165a5760405163149fbcfd60e11b815260040160405180910390fd5b611665338385612071565b6001810154604080516bffffffffffffffffffffffff193360601b16602080830191909152603482018690526054820187905260748083019490945282518083039094018452609490910190915281519101205f90335f8181526007850160205260409020805460ff191660011790559091506116e490839083612242565b506040805184815260208101839052339186917f52999628fb1cb05707e842278833b22e511f11746202cecdf221968b0b89e8bd910160405180910390a350505050565b5f8181526009602052604090205480611754576040516322e679e360e11b815260040160405180910390fd5b919050565b5f61176660046014612443565b905090565b611773611d41565b5f898152600a602052604090206002815460ff16600381111561179857611798613493565b146117b657604051634f4b461f60e11b815260040160405180910390fd5b6004810154156117d95760405163632a22bb60e01b815260040160405180910390fd5b600681015488146118225760405162461bcd60e51b815260206004820152601360248201527209cdec8ca40c6deeadce840dad2e6dac2e8c6d606b1b60448201526064016106c3565b5f61182f858701876136e2565b9150505f8151116118795760405162461bcd60e51b815260206004820152601460248201527343353a206e6f207075626c696320696e7075747360601b60448201526064016106c3565b5f81600183516118899190613785565b81518110611899576118996134a7565b602002602001015190505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663406ed35c8e6040518263ffffffff1660e01b81526004016118e591815260200190565b5f60405180830381865afa1580156118ff573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611926919081019061386a565b610120810151604051637bf41d7760e11b81529192506001600160a01b03169063f7e83aee90611960908b908b908b908b90600401613a09565b602060405180830381865afa15801561197b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061199f91906134d3565b5060048085018390555f8e815260096020526040808220859055905490516340a3b76160e11b81529182018f9052602482018490526001600160a01b0316906381476ec2906044015f604051808303815f87803b1580156119fe575f5ffd5b505af1158015611a10573d5f5f3e3d5ffd5b505050508c7f49ac1dd411942113d1c5e6799c6379ce341afe85a4175fb562cf2a5fb886c27d8d8d8d8d8d8d604051611a4e96959493929190613a3a565b60405180910390a250505050505050505050505050565b611a6d611d41565b6001600160a01b038116611a96575f604051631e4fbdf760e01b81526004016106c391906132ae565b610fe481611d73565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611ade5760405162461bcd60e51b81526004016106c390613ab3565b825464ffffffffff600160281b90910481169082168111611b3c5760405162461bcd60e51b815260206004820152601860248201527713185e9e5253550e881b195859881b5d5cdd08195e1a5cdd60421b60448201526064016106c3565b825f5b81866001015f611b4f848861253c565b64ffffffffff1681526020019081526020015f20819055505f816001611b759190613afd565b60ff168464ffffffffff16901c64ffffffffff16905060018564ffffffffff16901c64ffffffffff168111611baa5750611d39565b600185165f03611c71575f611bc983611bc4886001613b16565b61253c565b60408051808201825286815264ffffffffff83165f90815260018c0160209081529083902054908201529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611c2a91600401613b33565b602060405180830381865af4158015611c45573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c6991906134d3565b935050611d25565b5f611c8183611bc4600189613b63565b60408051808201825264ffffffffff83165f90815260018c0160209081529083902054825281018790529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611ce291600401613b33565b602060405180830381865af4158015611cfd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d2191906134d3565b9350505b50647fffffffff600194851c169301611b3f565b505050505050565b33611d4a610fe7565b6001600160a01b031614610d00573360405163118cdaa760e01b81526004016106c391906132ae565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b8154600160281b900464ffffffffff167f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611e325760405162461bcd60e51b81526004016106c390613ab3565b825464ffffffffff90811690821610611e855760405162461bcd60e51b815260206004820152601560248201527413185e9e5253550e881d1c9959481a5cc8199d5b1b605a1b60448201526064016106c3565b611e90816001613b16565b835464ffffffffff91909116600160281b0269ffffffffff000000000019909116178355815f5b81856001015f611ec7848761253c565b64ffffffffff16815260208101919091526040015f20556001831615611fb2575f611ef782611bc4600187613b63565b60408051808201825264ffffffffff83165f90815260018a0160209081529083902054825281018690529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611f5891600401613b33565b602060405180830381865af4158015611f73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f9791906134d3565b647fffffffff600195861c1694909350919091019050611eb7565b5050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610bf0565b611fe9612559565b610fe48161257e565b602060ff821611156120405760405162461bcd60e51b81526020600482015260176024820152764c617a79494d543a205472656520746f6f206c6172676560481b60448201526064016106c3565b612051600160ff831681901b613785565b825469ffffffffffffffffffff191664ffffffffff919091161790915550565b5f82116120915760405163aeaddff160e01b815260040160405180910390fd5b6001546001600160a01b03166120ba576040516350ca893360e01b815260040160405180910390fd5b5f818152600a602052604081206001805460028301549293926001600160a01b039091169163bb03bd719188916120f091613785565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015612137573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061215b91906134d3565b90505f60015f9054906101000a90046001600160a01b03166001600160a01b0316631209b1f66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121d291906134d3565b90505f81116121f45760405163aeaddff160e01b815260040160405180910390fd5b5f6121ff8284613b80565b90505f81116122215760405163149fbcfd60e11b815260040160405180910390fd5b808611156112b15760405163aeaddff160e01b815260040160405180910390fd5b60058301546006840180545f92600160201b900463ffffffff16908111156122c057508054600180820183555f928352602080842090920180546001600160a01b0319166001600160a01b03881690811790915583526008870182526040808420869055600988019092529120805460ff191682179055905061243c565b5f5f90505f876008015f855f815481106122dc576122dc6134a7565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054905060015b8454811015612364575f896008015f878481548110612326576123266134a7565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205490508281111561235b578092508193505b50600101612305565b50808610612378575f94505050505061243c565b5f886009015f868581548110612390576123906134a7565b5f9182526020808320909101546001600160a01b031683528201929092526040019020805460ff191660018360028111156123cd576123cd613493565b0217905550868483815481106123e5576123e56134a7565b5f91825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918916815260088a018252604080822089905560098b0190925220805460ff191660019081179091559450505050505b9392505050565b5f5f8260ff16116124965760405162461bcd60e51b815260206004820152601a60248201527f4c617a79494d543a206465707468206d757374206265203e203000000000000060448201526064016106c3565b602060ff831611156124ba5760405162461bcd60e51b81526004016106c390613b9f565b8254600160281b900464ffffffffff16806124d960ff85166002613cf0565b64ffffffffff1610156125295760405162461bcd60e51b8152602060048201526018602482015277098c2f4f2929aa87440c2dac4d2ceeadeeae640c8cae0e8d60431b60448201526064016106c3565b612534848285612586565b949350505050565b5f8161254f60ff851663ffffffff613d09565b61243c9190613b16565b61256161264e565b610d0057604051631afcd79f60e31b815260040160405180910390fd5b611a6d612559565b5f602060ff831611156125ab5760405162461bcd60e51b81526004016106c390613b9f565b8264ffffffffff165f036125c9576125c282612667565b905061243c565b5f6125d5836001613afd565b60ff166001600160401b038111156125ef576125ef61347f565b604051908082528060200260200182016040528015612618578160200160208202803683370190505b50905061262785858584612d01565b808360ff168151811061263c5761263c6134a7565b60200260200101519150509392505050565b5f612657611fb9565b54600160401b900460ff16919050565b5f8160ff165f0361267957505f919050565b8160ff166001036126ab57507f2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864919050565b8160ff166002036126dd57507f1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1919050565b8160ff1660030361270f57507f18f43331537ee2af2e3d758d50f72106467c6eea50371dd528d57eb2b856d238919050565b8160ff1660040361274157507f07f9d837cb17b0d36320ffe93ba52345f1b728571a568265caac97559dbc952a919050565b8160ff1660050361277357507f2b94cf5e8746b3f5c9631f4c5df32907a699c58c94b2ad4d7b5cec1639183f55919050565b8160ff166006036127a557507f2dee93c5a666459646ea7d22cca9e1bcfed71e6951b953611d11dda32ea09d78919050565b8160ff166007036127d757507f078295e5a22b84e982cf601eb639597b8b0515a88cb5ac7fa8a4aabe3c87349d919050565b8160ff1660080361280957507f2fa5e5f18f6027a6501bec864564472a616b2e274a41211a444cbe3a99f3cc61919050565b8160ff1660090361283b57507f0e884376d0d8fd21ecb780389e941f66e45e7acce3e228ab3e2156a614fcd747919050565b8160ff16600a0361286d57507f1b7201da72494f1e28717ad1a52eb469f95892f957713533de6175e5da190af2919050565b8160ff16600b0361289f57507f1f8d8822725e36385200c0b201249819a6e6e1e4650808b5bebc6bface7d7636919050565b8160ff16600c036128d157507f2c5d82f66c914bafb9701589ba8cfcfb6162b0a12acf88a8d0879a0471b5f85a919050565b8160ff16600d0361290357507f14c54148a0940bb820957f5adf3fa1134ef5c4aaa113f4646458f270e0bfbfd0919050565b8160ff16600e0361293557507f190d33b12f986f961e10c0ee44d8b9af11be25588cad89d416118e4bf4ebe80c919050565b8160ff16600f0361296757507f22f98aa9ce704152ac17354914ad73ed1167ae6596af510aa5b3649325e06c92919050565b8160ff1660100361299957507f2a7c7c9b6ce5880b9f6f228d72bf6a575a526f29c66ecceef8b753d38bba7323919050565b8160ff166011036129cb57507f2e8186e558698ec1c67af9c14d463ffc470043c9c2988b954d75dd643f36b992919050565b8160ff166012036129fd57507f0f57c5571e9a4eab49e2c8cf050dae948aef6ead647392273546249d1c1ff10f919050565b8160ff16601303612a2f57507f1830ee67b5fb554ad5f63d4388800e1cfe78e310697d46e43c9ce36134f72cca919050565b8160ff16601403612a6157507f2134e76ac5d21aab186c2be1dd8f84ee880a1e46eaf712f9d371b6df22191f3e919050565b8160ff16601503612a9357507f19df90ec844ebc4ffeebd866f33859b0c051d8c958ee3aa88f8f8df3db91a5b1919050565b8160ff16601603612ac557507f18cca2a66b5c0787981e69aefd84852d74af0e93ef4912b4648c05f722efe52b919050565b8160ff16601703612af757507f2388909415230d1b4d1304d2d54f473a628338f2efad83fadf05644549d2538d919050565b8160ff16601803612b2957507f27171fb4a97b6cc0e9e8f543b5294de866a2af2c9c8d0b1d96e673e4529ed540919050565b8160ff16601903612b5b57507f2ff6650540f629fd5711a0bc74fc0d28dcb230b9392583e5f8d59696dde6ae21919050565b8160ff16601a03612b8d57507f120c58f143d491e95902f7f5277778a2e0ad5168f6add75669932630ce611518919050565b8160ff16601b03612bbf57507f1f21feb70d3f21b07bf853d5e5db03071ec495a0a565a21da2d665d279483795919050565b8160ff16601c03612bf157507f24be905fa71335e14c638cc0f66a8623a826e768068a9e968bb1a1dde18a72d2919050565b8160ff16601d03612c2357507f0f8666b62ed17491c50ceadead57d4cd597ef3821d65c328744c74e553dac26d919050565b8160ff16601e03612c5557507f0918d46bf52d98b034413f4a1a1c41594e7a7a3f6ae08cb43d1a2a230e1959ef919050565b8160ff16601f03612c8757507f1bbeb01b4c479ecde76917645e404dfa2e26f90d0afc5a65128513ad375c5ff2919050565b8160ff16602003612cb957507f2f68a1c58e257e42a17a6c61dff5551ed560b9922ab119d5ac8e184c9734ead9919050565b60405162461bcd60e51b815260206004820152601e60248201527f4c617a79494d543a2064656661756c745a65726f2062616420696e646578000060448201526064016106c3565b602060ff83161115612d255760405162461bcd60e51b81526004016106c390613b9f565b5f8364ffffffffff1611612d895760405162461bcd60e51b815260206004820152602560248201527f4c617a79494d543a206e756d626572206f66206c6561766573206d7573742062604482015264065203e20360dc1b60648201526084016106c3565b5f612d95600185613b63565b9050600181165f03612de857846001015f612db05f8461253c565b64ffffffffff1681526020019081526020015f2054825f81518110612dd757612dd76134a7565b602002602001018181525050612e10565b612df15f612667565b825f81518110612e0357612e036134a7565b6020026020010181815250505b5f5b8360ff168160ff161015611d3957600182165f03612f085773__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280868560ff1681518110612e6457612e646134a7565b60200260200101518152602001612e7a85612667565b8152506040518263ffffffff1660e01b8152600401612e999190613b33565b602060405180830381865af4158015612eb4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed891906134d3565b83612ee4836001613afd565b60ff1681518110612ef757612ef76134a7565b6020026020010181815250506130b9565b5f612f14826001613afd565b60ff168664ffffffffff16901c64ffffffffff16905060018364ffffffffff16901c64ffffffffff16811115612fb6575f876001015f612f6b856001612f5a9190613afd565b60018864ffffffffff16901c61253c565b64ffffffffff1681526020019081526020015f205490508085846001612f919190613afd565b60ff1681518110612fa457612fa46134a7565b602002602001018181525050506130b7565b5f876001015f612fcd85600188611bc49190613b63565b64ffffffffff1681526020019081526020015f2054905073__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280848152602001888760ff1681518110613024576130246134a7565b60200260200101518152506040518263ffffffff1660e01b815260040161304b9190613b33565b602060405180830381865af4158015613066573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061308a91906134d3565b85613096856001613afd565b60ff16815181106130a9576130a96134a7565b602002602001018181525050505b505b647fffffffff600192831c169101612e12565b60018301918390821561315d579160200282015f5b8382111561312b57833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026130e1565b801561315b5782816101000a81549063ffffffff021916905560040160208160030104928301926001030261312b565b505b5061316992915061316d565b5090565b5b80821115613169575f815560010161316e565b6001600160a01b0381168114610fe4575f5ffd5b5f602082840312156131a5575f5ffd5b813561243c81613181565b5f602082840312156131c0575f5ffd5b5035919050565b602080825282518282018190525f918401906040840190835b818110156132075783516001600160a01b03168352602093840193909201916001016131e0565b509095945050505050565b5f5f5f60808486031215613224575f5ffd5b83359250602084013591506080840185101561323e575f5ffd5b6040840190509250925092565b5f5f6040838503121561325c575f5ffd5b82359150602083013561326e81613181565b809150509250929050565b5f5f5f6060848603121561328b575f5ffd5b83359250602084013561329d81613181565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b5f5f604083850312156132d3575f5ffd5b82356132de81613181565b946020939093013593505050565b5f5f604083850312156132fd575f5ffd5b50508035926020909101359150565b5f5f83601f84011261331c575f5ffd5b5081356001600160401b03811115613332575f5ffd5b602083019150836020828501011115613349575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f5f60a08a8c031215613368575f5ffd5b8935985060208a01356001600160401b03811115613384575f5ffd5b8a01601f81018c13613394575f5ffd5b80356001600160401b038111156133a9575f5ffd5b8c60208260051b84010111156133bd575f5ffd5b6020919091019850965060408a01356001600160401b038111156133df575f5ffd5b6133eb8c828d0161330c565b90975095505060608a01356001600160401b03811115613409575f5ffd5b6134158c828d0161330c565b90955093505060808a01356001600160401b03811115613433575f5ffd5b61343f8c828d0161330c565b915080935050809150509295985092959850929598565b634e487b7160e01b5f52601160045260245ffd5b5f8161347857613478613456565b505f190190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f600182016134cc576134cc613456565b5060010190565b5f602082840312156134e3575f5ffd5b5051919050565b803563ffffffff81168114611754575f5ffd5b5f6020828403121561350d575f5ffd5b61243c826134ea565b80820180821115610bf057610bf0613456565b84815260a0810160208201855f5b60028110156135645763ffffffff61354e836134ea565b1683526020928301929190910190600101613537565b50505060608201939093526080015292915050565b80518015158114611754575f5ffd5b5f60208284031215613598575f5ffd5b61243c82613579565b602080825282548282018190525f848152918220906040840190835b818110156132075783546001600160a01b03168352600193840193602090930192016135bd565b6040516101e081016001600160401b03811182821017156136075761360761347f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156136355761363561347f565b604052919050565b5f6001600160401b038211156136555761365561347f565b50601f01601f191660200190565b5f82601f830112613672575f5ffd5b81356001600160401b0381111561368b5761368b61347f565b8060051b61369b6020820161360d565b918252602081850181019290810190868411156136b6575f5ffd5b6020860192505b838310156136d85782358252602092830192909101906136bd565b9695505050505050565b5f5f604083850312156136f3575f5ffd5b82356001600160401b03811115613708575f5ffd5b8301601f81018513613718575f5ffd5b803561372b6137268261363d565b61360d565b81815286602083850101111561373f575f5ffd5b816020840160208301375f6020838301015280945050505060208301356001600160401b0381111561376f575f5ffd5b61377b85828601613663565b9150509250929050565b81810381811115610bf057610bf0613456565b805160048110611754575f5ffd5b5f82601f8301126137b5575f5ffd5b604080519081016001600160401b03811182821017156137d7576137d761347f565b80604052508060408401858111156137ed575f5ffd5b845b818110156138075780518352602092830192016137ef565b509195945050505050565b805161175481613181565b5f82601f83011261382c575f5ffd5b815161383a6137268261363d565b81815284602083860101111561384e575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561387a575f5ffd5b81516001600160401b0381111561388f575f5ffd5b820161020081850312156138a1575f5ffd5b6138a96135e4565b815181526138b960208301613798565b6020820152604082810151908201526138d585606084016137a6565b606082015260a082015160808201526138f060c08301613812565b60a082015260e08201516001600160401b0381111561390d575f5ffd5b6139198682850161381d565b60c0830152506101008201516001600160401b03811115613938575f5ffd5b6139448682850161381d565b60e0830152506139576101208301613812565b61010082015261396a6101408301613812565b61012082015261016082810151610140830152610180830151908201526101a08201516001600160401b038111156139a0575f5ffd5b6139ac8682850161381d565b610180830152506139c06101c08301613812565b6101a08201526139d36101e08301613579565b6101c0820152949350505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f613a1c6040830186886139e1565b8281036020840152613a2f8185876139e1565b979650505050505050565b606080825281018690525f8760808301825b89811015613a7c578235613a5f81613181565b6001600160a01b0316825260209283019290910190600101613a4c565b508381036020850152613a9081888a6139e1565b9150508281036040840152613aa68185876139e1565b9998505050505050505050565b6020808252602a908201527f4c617a79494d543a206c656166206d757374206265203c20534e41524b5f53436040820152691053105497d19251531160b21b606082015260800190565b60ff8181168382160190811115610bf057610bf0613456565b64ffffffffff8181168382160190811115610bf057610bf0613456565b6040810181835f5b6002811015613b5a578151835260209283019290910190600101613b3b565b50505092915050565b64ffffffffff8281168282160390811115610bf057610bf0613456565b5f82613b9a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526023908201527f4c617a79494d543a206465707468206d757374206265203c3d204d41585f44456040820152620a0a8960eb1b606082015260800190565b6001815b6001841115610ea157808504811115613c0157613c01613456565b6001841615613c0f57908102905b60019390931c928002613be6565b5f82613c2b57506001610bf0565b81613c3757505f610bf0565b8160018114613c4d5760028114613c5757613c89565b6001915050610bf0565b60ff841115613c6857613c68613456565b6001841b915064ffffffffff821115613c8357613c83613456565b50610bf0565b5060208310610133831016604e8410600b8410161715613cc1575081810a64ffffffffff811115613cbc57613cbc613456565b610bf0565b613cd164ffffffffff8484613be2565b8064ffffffffff04821115613ce857613ce8613456565b029392505050565b5f61243c64ffffffffff841664ffffffffff8416613c1d565b64ffffffffff8181168382160290811690818114613d2957613d29613456565b509291505056fea164736f6c634300081c000a", - "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80639f0f874a11610135578063e59e4695116100b4578063f26ef74e11610079578063f26ef74e14610571578063f2fde38b14610584578063f379b0df14610597578063f52fd803146105d1578063f6fc05d514610643575f5ffd5b8063e59e469514610516578063e6745e1314610529578063e82f3b701461053c578063ebf0c7171461054f578063f165053614610557575f5ffd5b8063c3a0ec30116100fa578063c3a0ec30146104ae578063ca2869a0146104bf578063cd6dc687146104de578063da881e5a146104f1578063dbb06c9314610504575f5ffd5b80639f0f874a1461044d578063a016493014610456578063a8a4d69b14610469578063bff232c11461047c578063c2b40ae41461048f575f5ffd5b8063715018a6116101c15780638d1ddfb1116101865780638d1ddfb1146103cd5780638da5cb5b146103e35780638e5ce3ad146103eb5780639015d371146103fe5780639a7a2ffc14610411575f5ffd5b8063715018a6146103465780637c92f5241461034e578063858142431461037b5780638a78bb151461039b5780638cb89ecb146103ae575f5ffd5b80632e7b716d116102075780632e7b716d146102d85780634d6861a6146102eb57806350e6d94c146102fe5780635d5047761461032057806370e36bbe14610333575f5ffd5b8063096b810a146102435780630f3e34121461025857806317d611201461026b5780632800d82914610294578063291a691b146102b5575b5f5ffd5b610256610251366004613195565b61064c565b005b6102566102663660046131b0565b610798565b61027e6102793660046131b0565b6107db565b60405161028b91906131c7565b60405180910390f35b6102a76102a23660046131b0565b61091d565b60405190815260200161028b565b6102c86102c3366004613212565b610969565b604051901515815260200161028b565b6102c86102e6366004613195565b610b43565b6102c86102f93660046131b0565b610bf6565b6102c861030c366004613195565b60066020525f908152604090205460ff1681565b6102c861032e36600461324b565b610c35565b610256610341366004613195565b610c79565b610256610cef565b61036161035c366004613279565b610d02565b6040805192835263ffffffff90911660208301520161028b565b60015461038e906001600160a01b031681565b60405161028b91906132ae565b6102566103a9366004613195565b610ea9565b6102a76103bc3660046131b0565b60096020525f908152604090205481565b600454600160281b900464ffffffffff166102a7565b61038e610fe7565b600b5461038e906001600160a01b031681565b6102c861040c366004613195565b611015565b61043761041f366004613195565b60076020525f908152604090205464ffffffffff1681565b60405164ffffffffff909116815260200161028b565b6102a760035481565b61027e6104643660046131b0565b611032565b6102c861047736600461324b565b6110c8565b61025661048a366004613195565b61110c565b6102a761049d3660046131b0565b60086020525f908152604090205481565b6001546001600160a01b031661038e565b6102a76104cd3660046131b0565b5f9081526008602052604090205490565b6102566104ec3660046132c2565b61115d565b6102c86104ff3660046131b0565b6112ba565b5f5461038e906001600160a01b031681565b610256610524366004613195565b6114ed565b6102566105373660046132ec565b611565565b6102a761054a3660046131b0565b611728565b6102a7611759565b61055f601481565b60405160ff909116815260200161028b565b61025661057f366004613350565b61176b565b610256610592366004613195565b611a65565b6004546105b39064ffffffffff80821691600160281b90041682565b6040805164ffffffffff93841681529290911660208301520161028b565b6106146105df3660046131b0565b5f908152600a6020819052604090912090810154600590910154909163ffffffff80831692600160201b900416908284101590565b60405161028b949392919093845263ffffffff9283166020850152911660408301521515606082015260800190565b6102a760025481565b610654610fe7565b6001600160a01b0316336001600160a01b0316148061067d57506001546001600160a01b031633145b61069a57604051632864c4e160e01b815260040160405180910390fd5b6106a381611015565b81906106cc576040516381e5828960e01b81526004016106c391906132ae565b60405180910390fd5b506001600160a01b0381165f9081526007602052604081205464ffffffffff16906106fa9060049083611a9f565b6001600160a01b0382165f908152600660205260408120805460ff1916905560028054916107278361346a565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f8c008e3835f6c79bfcdb89f0f6ca8705e0b01049ee84a90b0e4da1c7ba9405d5906060015b60405180910390a25050565b6107a0611d41565b60038190556040518181527fbe772dc189863d512fa01e489c8eac204975aef1a8662d8b5a333804b5207ab79060200160405180910390a150565b5f818152600a602081905260408220600681015491810154606093919291816001600160401b038111156108115761081161347f565b60405190808252806020026020018201604052801561083a578160200160208202803683370190505b5090505f805b84811015610911576001866009015f886006018481548110610864576108646134a7565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205460ff16600281111561089c5761089c613493565b03610909578560060181815481106108b6576108b66134a7565b905f5260205f20015f9054906101000a90046001600160a01b03168383815181106108e3576108e36134a7565b6001600160a01b039092166020928302919091019091015281610905816134bb565b9250505b600101610840565b50909695505050505050565b5f818152600a6020526040812081815460ff16600381111561094157610941613493565b0361095f57604051630d4c1d9760e41b815260040160405180910390fd5b6003015492915050565b5f80546001600160a01b031633146109945760405163e4c2a7eb60e01b815260040160405180910390fd5b5f848152600a6020526040812090815460ff1660038111156109b8576109b8613493565b146109d6576040516374ff462560e11b815260040160405180910390fd5b60015460408051630cc37d8f60e11b815290515f926001600160a01b031691631986fb1e9160048083019260209291908290030181865afa158015610a1d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4191906134d3565b905080610a5460408601602087016134fd565b63ffffffff161115610a6c60408601602087016134fd565b829091610a9a576040516344ec930f60e01b815263ffffffff909216600483015260248201526044016106c3565b5050815460ff1916600190811783558201859055436002830155600354610ac19042613516565b6003830155610ad5600583018560026130cc565b50610ade611759565b5f87815260086020526040908190209190915560028301546003840154915188927f381d281d32f95ef8fe4e5f3b263ea6a32d03d331e1a141ae1da996dc02a7a17092610b2f928a928a9291613529565b60405180910390a250600195945050505050565b5f610b4d82611015565b610b5857505f919050565b6001546001600160a01b0316610b81576040516350ca893360e01b815260040160405180910390fd5b600154604051639f8a13d760e01b81526001600160a01b0390911690639f8a13d790610bb19085906004016132ae565b602060405180830381865afa158015610bcc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf09190613588565b92915050565b5f818152600a602052604081206001815460ff166003811115610c1b57610c1b613493565b14610c2857505f92915050565b6003015442111592915050565b5f60015f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff166002811115610c7157610c71613493565b149392505050565b610c81611d41565b6001600160a01b038116610ca85760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b038316908117825560405190917f2c8267accd82e977550ed2349c73311183cd22e306347be4453c8d130995e3c991a250565b610cf7611d41565b610d005f611d73565b565b600b545f9081906001600160a01b03163314610d315760405163fcef374960e01b815260040160405180910390fd5b5f858152600a602052604090206002815460ff166003811115610d5657610d56613493565b14610d7457604051634f4b461f60e11b815260040160405180910390fd5b60058101546001600160a01b0386165f90815260098301602052604090205463ffffffff909116925060019060ff166002811115610db457610db4613493565b14610dc457600a01549150610ea1565b6001600160a01b0385165f9081526009820160205260408120805460ff19166002179055600a8201805491610df88361346a565b919050555080600a01549250846001600160a01b0316867f6c783b92374361b4d6efaf29673b89437ee969bb3c9d2d5d86b143ad5447b8498686604051610e49929190918252602082015260400190565b60405180910390a36040805184815263ffffffff84166020820181905285101591810182905287907f119cb11dd0a68c257d6dc9b06dcb37dd422ce276eb8bf3cd0b7079a116b8e2989060600160405180910390a250505b935093915050565b610eb1610fe7565b6001600160a01b0316336001600160a01b03161480610eda57506001546001600160a01b031633145b610ef757604051632864c4e160e01b815260040160405180910390fd5b610f0081611015565b610fe45760048054600160281b900464ffffffffff1690610f2a906001600160a01b038416611de3565b6001600160a01b0382165f908152600660209081526040808320805460ff1916600117905560079091528120805464ffffffffff841664ffffffffff199091161790556002805491610f7b836134bb565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f3318d261fe14a5761d2d1e21555652f623d2134c430a9883c9ad6e958bb0db539060600161078c565b50565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03165f9081526006602052604090205460ff1690565b5f818152600a60205260409020600481015460609190611065576040516322e679e360e11b815260040160405180910390fd5b806006018054806020026020016040519081016040528092919081815260200182805480156110bb57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161109d575b5050505050915050919050565b5f805f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff16600281111561110357611103613493565b14159392505050565b611114611d41565b6001600160a01b03811661113b5760405163d92e233d60e01b815260040160405180910390fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f611166611fb9565b805490915060ff600160401b82041615906001600160401b03165f8115801561118c5750825b90505f826001600160401b031660011480156111a75750303b155b9050811580156111b5575080155b156111d35760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111fd57845460ff60401b1916600160401b1785555b6001600160a01b0387166112245760405163d92e233d60e01b815260040160405180910390fd5b61122d33611fe1565b61123960046014611ff2565b61124286610798565b61124a610fe7565b6001600160a01b0316876001600160a01b03161461126b5761126b87611a65565b83156112b157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f818152600a6020526040812081815460ff1660038111156112de576112de613493565b036112fc57604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff16600381111561131457611314613493565b1461133257604051631860f69960e31b815260040160405180910390fd5b8060030154421161135657604051632f021e8d60e11b815260040160405180910390fd5b60058101546006820154600160201b90910463ffffffff1611158061143b578154600360ff199091161782556006820154600583015460408051928352600160201b90910463ffffffff16602083015285917fecc4a9fb7e28d074cba7f5b227e9b5827823c850a385539b9a2f98a08f8c203d910160405180910390a25f54604051635d968dc160e11b815260048101869052600260248201526001600160a01b039091169063bb2d1b82906044015f604051808303815f87803b15801561141c575f5ffd5b505af115801561142e573d5f5f3e3d5ffd5b505f979650505050505050565b815460ff191660021782556006820154600a8301555f54604051631f3ea75d60e21b8152600481018690526001600160a01b0390911690637cfa9d74906024015f604051808303815f87803b158015611492575f5ffd5b505af11580156114a4573d5f5f3e3d5ffd5b50505050837fed38c6266ebed7c01d311349a7fa67e0ef0f1d2f4760d60dbb34ca4799a2e132836006016040516114db91906135a1565b60405180910390a25060019392505050565b6114f5611d41565b6001600160a01b03811661151c5760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a7905f90a250565b5f828152600a6020526040812090815460ff16600381111561158957611589613493565b036115a757604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff1660038111156115bf576115bf613493565b146115dd57604051631860f69960e31b815260040160405180910390fd5b806003015442111561160257604051639a19114d60e01b815260040160405180910390fd5b335f90815260078201602052604090205460ff16156116345760405163257309f160e11b815260040160405180910390fd5b61163d33610b43565b61165a5760405163149fbcfd60e11b815260040160405180910390fd5b611665338385612071565b6001810154604080516bffffffffffffffffffffffff193360601b16602080830191909152603482018690526054820187905260748083019490945282518083039094018452609490910190915281519101205f90335f8181526007850160205260409020805460ff191660011790559091506116e490839083612242565b506040805184815260208101839052339186917f52999628fb1cb05707e842278833b22e511f11746202cecdf221968b0b89e8bd910160405180910390a350505050565b5f8181526009602052604090205480611754576040516322e679e360e11b815260040160405180910390fd5b919050565b5f61176660046014612443565b905090565b611773611d41565b5f898152600a602052604090206002815460ff16600381111561179857611798613493565b146117b657604051634f4b461f60e11b815260040160405180910390fd5b6004810154156117d95760405163632a22bb60e01b815260040160405180910390fd5b600681015488146118225760405162461bcd60e51b815260206004820152601360248201527209cdec8ca40c6deeadce840dad2e6dac2e8c6d606b1b60448201526064016106c3565b5f61182f858701876136e2565b9150505f8151116118795760405162461bcd60e51b815260206004820152601460248201527343353a206e6f207075626c696320696e7075747360601b60448201526064016106c3565b5f81600183516118899190613785565b81518110611899576118996134a7565b602002602001015190505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663406ed35c8e6040518263ffffffff1660e01b81526004016118e591815260200190565b5f60405180830381865afa1580156118ff573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611926919081019061386a565b610120810151604051637bf41d7760e11b81529192506001600160a01b03169063f7e83aee90611960908b908b908b908b90600401613a09565b602060405180830381865afa15801561197b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061199f91906134d3565b5060048085018390555f8e815260096020526040808220859055905490516340a3b76160e11b81529182018f9052602482018490526001600160a01b0316906381476ec2906044015f604051808303815f87803b1580156119fe575f5ffd5b505af1158015611a10573d5f5f3e3d5ffd5b505050508c7f49ac1dd411942113d1c5e6799c6379ce341afe85a4175fb562cf2a5fb886c27d8d8d8d8d8d8d604051611a4e96959493929190613a3a565b60405180910390a250505050505050505050505050565b611a6d611d41565b6001600160a01b038116611a96575f604051631e4fbdf760e01b81526004016106c391906132ae565b610fe481611d73565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611ade5760405162461bcd60e51b81526004016106c390613ab3565b825464ffffffffff600160281b90910481169082168111611b3c5760405162461bcd60e51b815260206004820152601860248201527713185e9e5253550e881b195859881b5d5cdd08195e1a5cdd60421b60448201526064016106c3565b825f5b81866001015f611b4f848861253c565b64ffffffffff1681526020019081526020015f20819055505f816001611b759190613afd565b60ff168464ffffffffff16901c64ffffffffff16905060018564ffffffffff16901c64ffffffffff168111611baa5750611d39565b600185165f03611c71575f611bc983611bc4886001613b16565b61253c565b60408051808201825286815264ffffffffff83165f90815260018c0160209081529083902054908201529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611c2a91600401613b33565b602060405180830381865af4158015611c45573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c6991906134d3565b935050611d25565b5f611c8183611bc4600189613b63565b60408051808201825264ffffffffff83165f90815260018c0160209081529083902054825281018790529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611ce291600401613b33565b602060405180830381865af4158015611cfd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d2191906134d3565b9350505b50647fffffffff600194851c169301611b3f565b505050505050565b33611d4a610fe7565b6001600160a01b031614610d00573360405163118cdaa760e01b81526004016106c391906132ae565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b8154600160281b900464ffffffffff167f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611e325760405162461bcd60e51b81526004016106c390613ab3565b825464ffffffffff90811690821610611e855760405162461bcd60e51b815260206004820152601560248201527413185e9e5253550e881d1c9959481a5cc8199d5b1b605a1b60448201526064016106c3565b611e90816001613b16565b835464ffffffffff91909116600160281b0269ffffffffff000000000019909116178355815f5b81856001015f611ec7848761253c565b64ffffffffff16815260208101919091526040015f20556001831615611fb2575f611ef782611bc4600187613b63565b60408051808201825264ffffffffff83165f90815260018a0160209081529083902054825281018690529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611f5891600401613b33565b602060405180830381865af4158015611f73573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f9791906134d3565b647fffffffff600195861c1694909350919091019050611eb7565b5050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610bf0565b611fe9612559565b610fe48161257e565b602060ff821611156120405760405162461bcd60e51b81526020600482015260176024820152764c617a79494d543a205472656520746f6f206c6172676560481b60448201526064016106c3565b612051600160ff831681901b613785565b825469ffffffffffffffffffff191664ffffffffff919091161790915550565b5f82116120915760405163aeaddff160e01b815260040160405180910390fd5b6001546001600160a01b03166120ba576040516350ca893360e01b815260040160405180910390fd5b5f818152600a602052604081206001805460028301549293926001600160a01b039091169163bb03bd719188916120f091613785565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015612137573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061215b91906134d3565b90505f60015f9054906101000a90046001600160a01b03166001600160a01b0316631209b1f66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121ae573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121d291906134d3565b90505f81116121f45760405163aeaddff160e01b815260040160405180910390fd5b5f6121ff8284613b80565b90505f81116122215760405163149fbcfd60e11b815260040160405180910390fd5b808611156112b15760405163aeaddff160e01b815260040160405180910390fd5b60058301546006840180545f92600160201b900463ffffffff16908111156122c057508054600180820183555f928352602080842090920180546001600160a01b0319166001600160a01b03881690811790915583526008870182526040808420869055600988019092529120805460ff191682179055905061243c565b5f5f90505f876008015f855f815481106122dc576122dc6134a7565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054905060015b8454811015612364575f896008015f878481548110612326576123266134a7565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205490508281111561235b578092508193505b50600101612305565b50808610612378575f94505050505061243c565b5f886009015f868581548110612390576123906134a7565b5f9182526020808320909101546001600160a01b031683528201929092526040019020805460ff191660018360028111156123cd576123cd613493565b0217905550868483815481106123e5576123e56134a7565b5f91825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918916815260088a018252604080822089905560098b0190925220805460ff191660019081179091559450505050505b9392505050565b5f5f8260ff16116124965760405162461bcd60e51b815260206004820152601a60248201527f4c617a79494d543a206465707468206d757374206265203e203000000000000060448201526064016106c3565b602060ff831611156124ba5760405162461bcd60e51b81526004016106c390613b9f565b8254600160281b900464ffffffffff16806124d960ff85166002613cf0565b64ffffffffff1610156125295760405162461bcd60e51b8152602060048201526018602482015277098c2f4f2929aa87440c2dac4d2ceeadeeae640c8cae0e8d60431b60448201526064016106c3565b612534848285612586565b949350505050565b5f8161254f60ff851663ffffffff613d09565b61243c9190613b16565b61256161264e565b610d0057604051631afcd79f60e31b815260040160405180910390fd5b611a6d612559565b5f602060ff831611156125ab5760405162461bcd60e51b81526004016106c390613b9f565b8264ffffffffff165f036125c9576125c282612667565b905061243c565b5f6125d5836001613afd565b60ff166001600160401b038111156125ef576125ef61347f565b604051908082528060200260200182016040528015612618578160200160208202803683370190505b50905061262785858584612d01565b808360ff168151811061263c5761263c6134a7565b60200260200101519150509392505050565b5f612657611fb9565b54600160401b900460ff16919050565b5f8160ff165f0361267957505f919050565b8160ff166001036126ab57507f2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864919050565b8160ff166002036126dd57507f1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1919050565b8160ff1660030361270f57507f18f43331537ee2af2e3d758d50f72106467c6eea50371dd528d57eb2b856d238919050565b8160ff1660040361274157507f07f9d837cb17b0d36320ffe93ba52345f1b728571a568265caac97559dbc952a919050565b8160ff1660050361277357507f2b94cf5e8746b3f5c9631f4c5df32907a699c58c94b2ad4d7b5cec1639183f55919050565b8160ff166006036127a557507f2dee93c5a666459646ea7d22cca9e1bcfed71e6951b953611d11dda32ea09d78919050565b8160ff166007036127d757507f078295e5a22b84e982cf601eb639597b8b0515a88cb5ac7fa8a4aabe3c87349d919050565b8160ff1660080361280957507f2fa5e5f18f6027a6501bec864564472a616b2e274a41211a444cbe3a99f3cc61919050565b8160ff1660090361283b57507f0e884376d0d8fd21ecb780389e941f66e45e7acce3e228ab3e2156a614fcd747919050565b8160ff16600a0361286d57507f1b7201da72494f1e28717ad1a52eb469f95892f957713533de6175e5da190af2919050565b8160ff16600b0361289f57507f1f8d8822725e36385200c0b201249819a6e6e1e4650808b5bebc6bface7d7636919050565b8160ff16600c036128d157507f2c5d82f66c914bafb9701589ba8cfcfb6162b0a12acf88a8d0879a0471b5f85a919050565b8160ff16600d0361290357507f14c54148a0940bb820957f5adf3fa1134ef5c4aaa113f4646458f270e0bfbfd0919050565b8160ff16600e0361293557507f190d33b12f986f961e10c0ee44d8b9af11be25588cad89d416118e4bf4ebe80c919050565b8160ff16600f0361296757507f22f98aa9ce704152ac17354914ad73ed1167ae6596af510aa5b3649325e06c92919050565b8160ff1660100361299957507f2a7c7c9b6ce5880b9f6f228d72bf6a575a526f29c66ecceef8b753d38bba7323919050565b8160ff166011036129cb57507f2e8186e558698ec1c67af9c14d463ffc470043c9c2988b954d75dd643f36b992919050565b8160ff166012036129fd57507f0f57c5571e9a4eab49e2c8cf050dae948aef6ead647392273546249d1c1ff10f919050565b8160ff16601303612a2f57507f1830ee67b5fb554ad5f63d4388800e1cfe78e310697d46e43c9ce36134f72cca919050565b8160ff16601403612a6157507f2134e76ac5d21aab186c2be1dd8f84ee880a1e46eaf712f9d371b6df22191f3e919050565b8160ff16601503612a9357507f19df90ec844ebc4ffeebd866f33859b0c051d8c958ee3aa88f8f8df3db91a5b1919050565b8160ff16601603612ac557507f18cca2a66b5c0787981e69aefd84852d74af0e93ef4912b4648c05f722efe52b919050565b8160ff16601703612af757507f2388909415230d1b4d1304d2d54f473a628338f2efad83fadf05644549d2538d919050565b8160ff16601803612b2957507f27171fb4a97b6cc0e9e8f543b5294de866a2af2c9c8d0b1d96e673e4529ed540919050565b8160ff16601903612b5b57507f2ff6650540f629fd5711a0bc74fc0d28dcb230b9392583e5f8d59696dde6ae21919050565b8160ff16601a03612b8d57507f120c58f143d491e95902f7f5277778a2e0ad5168f6add75669932630ce611518919050565b8160ff16601b03612bbf57507f1f21feb70d3f21b07bf853d5e5db03071ec495a0a565a21da2d665d279483795919050565b8160ff16601c03612bf157507f24be905fa71335e14c638cc0f66a8623a826e768068a9e968bb1a1dde18a72d2919050565b8160ff16601d03612c2357507f0f8666b62ed17491c50ceadead57d4cd597ef3821d65c328744c74e553dac26d919050565b8160ff16601e03612c5557507f0918d46bf52d98b034413f4a1a1c41594e7a7a3f6ae08cb43d1a2a230e1959ef919050565b8160ff16601f03612c8757507f1bbeb01b4c479ecde76917645e404dfa2e26f90d0afc5a65128513ad375c5ff2919050565b8160ff16602003612cb957507f2f68a1c58e257e42a17a6c61dff5551ed560b9922ab119d5ac8e184c9734ead9919050565b60405162461bcd60e51b815260206004820152601e60248201527f4c617a79494d543a2064656661756c745a65726f2062616420696e646578000060448201526064016106c3565b602060ff83161115612d255760405162461bcd60e51b81526004016106c390613b9f565b5f8364ffffffffff1611612d895760405162461bcd60e51b815260206004820152602560248201527f4c617a79494d543a206e756d626572206f66206c6561766573206d7573742062604482015264065203e20360dc1b60648201526084016106c3565b5f612d95600185613b63565b9050600181165f03612de857846001015f612db05f8461253c565b64ffffffffff1681526020019081526020015f2054825f81518110612dd757612dd76134a7565b602002602001018181525050612e10565b612df15f612667565b825f81518110612e0357612e036134a7565b6020026020010181815250505b5f5b8360ff168160ff161015611d3957600182165f03612f085773__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280868560ff1681518110612e6457612e646134a7565b60200260200101518152602001612e7a85612667565b8152506040518263ffffffff1660e01b8152600401612e999190613b33565b602060405180830381865af4158015612eb4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed891906134d3565b83612ee4836001613afd565b60ff1681518110612ef757612ef76134a7565b6020026020010181815250506130b9565b5f612f14826001613afd565b60ff168664ffffffffff16901c64ffffffffff16905060018364ffffffffff16901c64ffffffffff16811115612fb6575f876001015f612f6b856001612f5a9190613afd565b60018864ffffffffff16901c61253c565b64ffffffffff1681526020019081526020015f205490508085846001612f919190613afd565b60ff1681518110612fa457612fa46134a7565b602002602001018181525050506130b7565b5f876001015f612fcd85600188611bc49190613b63565b64ffffffffff1681526020019081526020015f2054905073__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280848152602001888760ff1681518110613024576130246134a7565b60200260200101518152506040518263ffffffff1660e01b815260040161304b9190613b33565b602060405180830381865af4158015613066573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061308a91906134d3565b85613096856001613afd565b60ff16815181106130a9576130a96134a7565b602002602001018181525050505b505b647fffffffff600192831c169101612e12565b60018301918390821561315d579160200282015f5b8382111561312b57833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026130e1565b801561315b5782816101000a81549063ffffffff021916905560040160208160030104928301926001030261312b565b505b5061316992915061316d565b5090565b5b80821115613169575f815560010161316e565b6001600160a01b0381168114610fe4575f5ffd5b5f602082840312156131a5575f5ffd5b813561243c81613181565b5f602082840312156131c0575f5ffd5b5035919050565b602080825282518282018190525f918401906040840190835b818110156132075783516001600160a01b03168352602093840193909201916001016131e0565b509095945050505050565b5f5f5f60808486031215613224575f5ffd5b83359250602084013591506080840185101561323e575f5ffd5b6040840190509250925092565b5f5f6040838503121561325c575f5ffd5b82359150602083013561326e81613181565b809150509250929050565b5f5f5f6060848603121561328b575f5ffd5b83359250602084013561329d81613181565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b5f5f604083850312156132d3575f5ffd5b82356132de81613181565b946020939093013593505050565b5f5f604083850312156132fd575f5ffd5b50508035926020909101359150565b5f5f83601f84011261331c575f5ffd5b5081356001600160401b03811115613332575f5ffd5b602083019150836020828501011115613349575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f5f60a08a8c031215613368575f5ffd5b8935985060208a01356001600160401b03811115613384575f5ffd5b8a01601f81018c13613394575f5ffd5b80356001600160401b038111156133a9575f5ffd5b8c60208260051b84010111156133bd575f5ffd5b6020919091019850965060408a01356001600160401b038111156133df575f5ffd5b6133eb8c828d0161330c565b90975095505060608a01356001600160401b03811115613409575f5ffd5b6134158c828d0161330c565b90955093505060808a01356001600160401b03811115613433575f5ffd5b61343f8c828d0161330c565b915080935050809150509295985092959850929598565b634e487b7160e01b5f52601160045260245ffd5b5f8161347857613478613456565b505f190190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f600182016134cc576134cc613456565b5060010190565b5f602082840312156134e3575f5ffd5b5051919050565b803563ffffffff81168114611754575f5ffd5b5f6020828403121561350d575f5ffd5b61243c826134ea565b80820180821115610bf057610bf0613456565b84815260a0810160208201855f5b60028110156135645763ffffffff61354e836134ea565b1683526020928301929190910190600101613537565b50505060608201939093526080015292915050565b80518015158114611754575f5ffd5b5f60208284031215613598575f5ffd5b61243c82613579565b602080825282548282018190525f848152918220906040840190835b818110156132075783546001600160a01b03168352600193840193602090930192016135bd565b6040516101e081016001600160401b03811182821017156136075761360761347f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156136355761363561347f565b604052919050565b5f6001600160401b038211156136555761365561347f565b50601f01601f191660200190565b5f82601f830112613672575f5ffd5b81356001600160401b0381111561368b5761368b61347f565b8060051b61369b6020820161360d565b918252602081850181019290810190868411156136b6575f5ffd5b6020860192505b838310156136d85782358252602092830192909101906136bd565b9695505050505050565b5f5f604083850312156136f3575f5ffd5b82356001600160401b03811115613708575f5ffd5b8301601f81018513613718575f5ffd5b803561372b6137268261363d565b61360d565b81815286602083850101111561373f575f5ffd5b816020840160208301375f6020838301015280945050505060208301356001600160401b0381111561376f575f5ffd5b61377b85828601613663565b9150509250929050565b81810381811115610bf057610bf0613456565b805160048110611754575f5ffd5b5f82601f8301126137b5575f5ffd5b604080519081016001600160401b03811182821017156137d7576137d761347f565b80604052508060408401858111156137ed575f5ffd5b845b818110156138075780518352602092830192016137ef565b509195945050505050565b805161175481613181565b5f82601f83011261382c575f5ffd5b815161383a6137268261363d565b81815284602083860101111561384e575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561387a575f5ffd5b81516001600160401b0381111561388f575f5ffd5b820161020081850312156138a1575f5ffd5b6138a96135e4565b815181526138b960208301613798565b6020820152604082810151908201526138d585606084016137a6565b606082015260a082015160808201526138f060c08301613812565b60a082015260e08201516001600160401b0381111561390d575f5ffd5b6139198682850161381d565b60c0830152506101008201516001600160401b03811115613938575f5ffd5b6139448682850161381d565b60e0830152506139576101208301613812565b61010082015261396a6101408301613812565b61012082015261016082810151610140830152610180830151908201526101a08201516001600160401b038111156139a0575f5ffd5b6139ac8682850161381d565b610180830152506139c06101c08301613812565b6101a08201526139d36101e08301613579565b6101c0820152949350505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f613a1c6040830186886139e1565b8281036020840152613a2f8185876139e1565b979650505050505050565b606080825281018690525f8760808301825b89811015613a7c578235613a5f81613181565b6001600160a01b0316825260209283019290910190600101613a4c565b508381036020850152613a9081888a6139e1565b9150508281036040840152613aa68185876139e1565b9998505050505050505050565b6020808252602a908201527f4c617a79494d543a206c656166206d757374206265203c20534e41524b5f53436040820152691053105497d19251531160b21b606082015260800190565b60ff8181168382160190811115610bf057610bf0613456565b64ffffffffff8181168382160190811115610bf057610bf0613456565b6040810181835f5b6002811015613b5a578151835260209283019290910190600101613b3b565b50505092915050565b64ffffffffff8281168282160390811115610bf057610bf0613456565b5f82613b9a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526023908201527f4c617a79494d543a206465707468206d757374206265203c3d204d41585f44456040820152620a0a8960eb1b606082015260800190565b6001815b6001841115610ea157808504811115613c0157613c01613456565b6001841615613c0f57908102905b60019390931c928002613be6565b5f82613c2b57506001610bf0565b81613c3757505f610bf0565b8160018114613c4d5760028114613c5757613c89565b6001915050610bf0565b60ff841115613c6857613c68613456565b6001841b915064ffffffffff821115613c8357613c83613456565b50610bf0565b5060208310610133831016604e8410600b8410161715613cc1575081810a64ffffffffff811115613cbc57613cbc613456565b610bf0565b613cd164ffffffffff8484613be2565b8064ffffffffff04821115613ce857613ce8613456565b029392505050565b5f61243c64ffffffffff841664ffffffffff8416613c1d565b64ffffffffff8181168382160290811690818114613d2957613d29613456565b509291505056fea164736f6c634300081c000a", + "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b613e2d806100d65f395ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80639f0f874a11610135578063e59e4695116100b4578063f26ef74e11610079578063f26ef74e14610571578063f2fde38b14610584578063f379b0df14610597578063f52fd803146105d1578063f6fc05d514610643575f5ffd5b8063e59e469514610516578063e6745e1314610529578063e82f3b701461053c578063ebf0c7171461054f578063f165053614610557575f5ffd5b8063c3a0ec30116100fa578063c3a0ec30146104ae578063ca2869a0146104bf578063cd6dc687146104de578063da881e5a146104f1578063dbb06c9314610504575f5ffd5b80639f0f874a1461044d578063a016493014610456578063a8a4d69b14610469578063bff232c11461047c578063c2b40ae41461048f575f5ffd5b8063715018a6116101c15780638d1ddfb1116101865780638d1ddfb1146103cd5780638da5cb5b146103e35780638e5ce3ad146103eb5780639015d371146103fe5780639a7a2ffc14610411575f5ffd5b8063715018a6146103465780637c92f5241461034e578063858142431461037b5780638a78bb151461039b5780638cb89ecb146103ae575f5ffd5b80632e7b716d116102075780632e7b716d146102d85780634d6861a6146102eb57806350e6d94c146102fe5780635d5047761461032057806370e36bbe14610333575f5ffd5b8063096b810a146102435780630f3e34121461025857806317d611201461026b5780632800d82914610294578063291a691b146102b5575b5f5ffd5b61025661025136600461323c565b61064c565b005b610256610266366004613257565b610798565b61027e610279366004613257565b6107db565b60405161028b919061326e565b60405180910390f35b6102a76102a2366004613257565b61091d565b60405190815260200161028b565b6102c86102c33660046132b9565b610969565b604051901515815260200161028b565b6102c86102e636600461323c565b610b43565b6102c86102f9366004613257565b610bf6565b6102c861030c36600461323c565b60066020525f908152604090205460ff1681565b6102c861032e3660046132f2565b610c35565b61025661034136600461323c565b610c79565b610256610cef565b61036161035c366004613320565b610d02565b6040805192835263ffffffff90911660208301520161028b565b60015461038e906001600160a01b031681565b60405161028b9190613355565b6102566103a936600461323c565b610ea9565b6102a76103bc366004613257565b60096020525f908152604090205481565b600454600160281b900464ffffffffff166102a7565b61038e610fe7565b600b5461038e906001600160a01b031681565b6102c861040c36600461323c565b611015565b61043761041f36600461323c565b60076020525f908152604090205464ffffffffff1681565b60405164ffffffffff909116815260200161028b565b6102a760035481565b61027e610464366004613257565b611032565b6102c86104773660046132f2565b6110c8565b61025661048a36600461323c565b61110c565b6102a761049d366004613257565b60086020525f908152604090205481565b6001546001600160a01b031661038e565b6102a76104cd366004613257565b5f9081526008602052604090205490565b6102566104ec366004613369565b61115d565b6102c86104ff366004613257565b6112ba565b5f5461038e906001600160a01b031681565b61025661052436600461323c565b611594565b610256610537366004613393565b61160c565b6102a761054a366004613257565b6117cf565b6102a7611800565b61055f601481565b60405160ff909116815260200161028b565b61025661057f3660046133f7565b611812565b61025661059236600461323c565b611b0c565b6004546105b39064ffffffffff80821691600160281b90041682565b6040805164ffffffffff93841681529290911660208301520161028b565b6106146105df366004613257565b5f908152600a6020819052604090912090810154600590910154909163ffffffff80831692600160201b900416908284101590565b60405161028b949392919093845263ffffffff9283166020850152911660408301521515606082015260800190565b6102a760025481565b610654610fe7565b6001600160a01b0316336001600160a01b0316148061067d57506001546001600160a01b031633145b61069a57604051632864c4e160e01b815260040160405180910390fd5b6106a381611015565b81906106cc576040516381e5828960e01b81526004016106c39190613355565b60405180910390fd5b506001600160a01b0381165f9081526007602052604081205464ffffffffff16906106fa9060049083611b46565b6001600160a01b0382165f908152600660205260408120805460ff19169055600280549161072783613511565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f8c008e3835f6c79bfcdb89f0f6ca8705e0b01049ee84a90b0e4da1c7ba9405d5906060015b60405180910390a25050565b6107a0611de8565b60038190556040518181527fbe772dc189863d512fa01e489c8eac204975aef1a8662d8b5a333804b5207ab79060200160405180910390a150565b5f818152600a602081905260408220600681015491810154606093919291816001600160401b0381111561081157610811613526565b60405190808252806020026020018201604052801561083a578160200160208202803683370190505b5090505f805b84811015610911576001866009015f8860060184815481106108645761086461354e565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205460ff16600281111561089c5761089c61353a565b03610909578560060181815481106108b6576108b661354e565b905f5260205f20015f9054906101000a90046001600160a01b03168383815181106108e3576108e361354e565b6001600160a01b03909216602092830291909101909101528161090581613562565b9250505b600101610840565b50909695505050505050565b5f818152600a6020526040812081815460ff1660038111156109415761094161353a565b0361095f57604051630d4c1d9760e41b815260040160405180910390fd5b6003015492915050565b5f80546001600160a01b031633146109945760405163e4c2a7eb60e01b815260040160405180910390fd5b5f848152600a6020526040812090815460ff1660038111156109b8576109b861353a565b146109d6576040516374ff462560e11b815260040160405180910390fd5b60015460408051630cc37d8f60e11b815290515f926001600160a01b031691631986fb1e9160048083019260209291908290030181865afa158015610a1d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a41919061357a565b905080610a5460408601602087016135a4565b63ffffffff161115610a6c60408601602087016135a4565b829091610a9a576040516344ec930f60e01b815263ffffffff909216600483015260248201526044016106c3565b5050815460ff1916600190811783558201859055436002830155600354610ac190426135bd565b6003830155610ad560058301856002613173565b50610ade611800565b5f87815260086020526040908190209190915560028301546003840154915188927f381d281d32f95ef8fe4e5f3b263ea6a32d03d331e1a141ae1da996dc02a7a17092610b2f928a928a92916135d0565b60405180910390a250600195945050505050565b5f610b4d82611015565b610b5857505f919050565b6001546001600160a01b0316610b81576040516350ca893360e01b815260040160405180910390fd5b600154604051639f8a13d760e01b81526001600160a01b0390911690639f8a13d790610bb1908590600401613355565b602060405180830381865afa158015610bcc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf0919061362f565b92915050565b5f818152600a602052604081206001815460ff166003811115610c1b57610c1b61353a565b14610c2857505f92915050565b6003015442111592915050565b5f60015f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff166002811115610c7157610c7161353a565b149392505050565b610c81611de8565b6001600160a01b038116610ca85760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b038316908117825560405190917f2c8267accd82e977550ed2349c73311183cd22e306347be4453c8d130995e3c991a250565b610cf7611de8565b610d005f611e1a565b565b600b545f9081906001600160a01b03163314610d315760405163fcef374960e01b815260040160405180910390fd5b5f858152600a602052604090206002815460ff166003811115610d5657610d5661353a565b14610d7457604051634f4b461f60e11b815260040160405180910390fd5b60058101546001600160a01b0386165f90815260098301602052604090205463ffffffff909116925060019060ff166002811115610db457610db461353a565b14610dc457600a01549150610ea1565b6001600160a01b0385165f9081526009820160205260408120805460ff19166002179055600a8201805491610df883613511565b919050555080600a01549250846001600160a01b0316867f6c783b92374361b4d6efaf29673b89437ee969bb3c9d2d5d86b143ad5447b8498686604051610e49929190918252602082015260400190565b60405180910390a36040805184815263ffffffff84166020820181905285101591810182905287907f119cb11dd0a68c257d6dc9b06dcb37dd422ce276eb8bf3cd0b7079a116b8e2989060600160405180910390a250505b935093915050565b610eb1610fe7565b6001600160a01b0316336001600160a01b03161480610eda57506001546001600160a01b031633145b610ef757604051632864c4e160e01b815260040160405180910390fd5b610f0081611015565b610fe45760048054600160281b900464ffffffffff1690610f2a906001600160a01b038416611e8a565b6001600160a01b0382165f908152600660209081526040808320805460ff1916600117905560079091528120805464ffffffffff841664ffffffffff199091161790556002805491610f7b83613562565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f3318d261fe14a5761d2d1e21555652f623d2134c430a9883c9ad6e958bb0db539060600161078c565b50565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03165f9081526006602052604090205460ff1690565b5f818152600a60205260409020600481015460609190611065576040516322e679e360e11b815260040160405180910390fd5b806006018054806020026020016040519081016040528092919081815260200182805480156110bb57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161109d575b5050505050915050919050565b5f805f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff1660028111156111035761110361353a565b14159392505050565b611114611de8565b6001600160a01b03811661113b5760405163d92e233d60e01b815260040160405180910390fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f611166612060565b805490915060ff600160401b82041615906001600160401b03165f8115801561118c5750825b90505f826001600160401b031660011480156111a75750303b155b9050811580156111b5575080155b156111d35760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111fd57845460ff60401b1916600160401b1785555b6001600160a01b0387166112245760405163d92e233d60e01b815260040160405180910390fd5b61122d33612088565b61123960046014612099565b61124286610798565b61124a610fe7565b6001600160a01b0316876001600160a01b03161461126b5761126b87611b0c565b83156112b157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f818152600a6020526040812081815460ff1660038111156112de576112de61353a565b036112fc57604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff1660038111156113145761131461353a565b1461133257604051631860f69960e31b815260040160405180910390fd5b8060030154421161135657604051632f021e8d60e11b815260040160405180910390fd5b60058101546006820154600160201b90910463ffffffff1611158061143b578154600360ff199091161782556006820154600583015460408051928352600160201b90910463ffffffff16602083015285917fecc4a9fb7e28d074cba7f5b227e9b5827823c850a385539b9a2f98a08f8c203d910160405180910390a25f54604051635d968dc160e11b815260048101869052600260248201526001600160a01b039091169063bb2d1b82906044015f604051808303815f87803b15801561141c575f5ffd5b505af115801561142e573d5f5f3e3d5ffd5b505f979650505050505050565b815460ff191660021782556006820154600a83018190555f816001600160401b0381111561146b5761146b613526565b604051908082528060200260200182016040528015611494578160200160208202803683370190505b5090505f5b8281101561150657846008015f8660060183815481106114bb576114bb61354e565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205482518390839081106114f3576114f361354e565b6020908102919091010152600101611499565b505f54604051631f3ea75d60e21b8152600481018890526001600160a01b0390911690637cfa9d74906024015f604051808303815f87803b158015611549575f5ffd5b505af115801561155b573d5f5f3e3d5ffd5b50505050857f4f1f5b329c741a8ba15e9645e301061294d0c1fdd455448ffd5e76ff255929d78560060183604051610b2f929190613648565b61159c611de8565b6001600160a01b0381166115c35760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a7905f90a250565b5f828152600a6020526040812090815460ff1660038111156116305761163061353a565b0361164e57604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff1660038111156116665761166661353a565b1461168457604051631860f69960e31b815260040160405180910390fd5b80600301544211156116a957604051639a19114d60e01b815260040160405180910390fd5b335f90815260078201602052604090205460ff16156116db5760405163257309f160e11b815260040160405180910390fd5b6116e433610b43565b6117015760405163149fbcfd60e11b815260040160405180910390fd5b61170c338385612118565b6001810154604080516bffffffffffffffffffffffff193360601b16602080830191909152603482018690526054820187905260748083019490945282518083039094018452609490910190915281519101205f90335f8181526007850160205260409020805460ff1916600117905590915061178b908390836122e9565b506040805184815260208101839052339186917f52999628fb1cb05707e842278833b22e511f11746202cecdf221968b0b89e8bd910160405180910390a350505050565b5f81815260096020526040902054806117fb576040516322e679e360e11b815260040160405180910390fd5b919050565b5f61180d600460146124ea565b905090565b61181a611de8565b5f898152600a602052604090206002815460ff16600381111561183f5761183f61353a565b1461185d57604051634f4b461f60e11b815260040160405180910390fd5b6004810154156118805760405163632a22bb60e01b815260040160405180910390fd5b600681015488146118c95760405162461bcd60e51b815260206004820152601360248201527209cdec8ca40c6deeadce840dad2e6dac2e8c6d606b1b60448201526064016106c3565b5f6118d6858701876137d2565b9150505f8151116119205760405162461bcd60e51b815260206004820152601460248201527343353a206e6f207075626c696320696e7075747360601b60448201526064016106c3565b5f81600183516119309190613875565b815181106119405761194061354e565b602002602001015190505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663406ed35c8e6040518263ffffffff1660e01b815260040161198c91815260200190565b5f60405180830381865afa1580156119a6573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119cd919081019061395a565b610120810151604051637bf41d7760e11b81529192506001600160a01b03169063f7e83aee90611a07908b908b908b908b90600401613af9565b602060405180830381865afa158015611a22573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a46919061357a565b5060048085018390555f8e815260096020526040808220859055905490516340a3b76160e11b81529182018f9052602482018490526001600160a01b0316906381476ec2906044015f604051808303815f87803b158015611aa5575f5ffd5b505af1158015611ab7573d5f5f3e3d5ffd5b505050508c7f49ac1dd411942113d1c5e6799c6379ce341afe85a4175fb562cf2a5fb886c27d8d8d8d8d8d8d604051611af596959493929190613b2a565b60405180910390a250505050505050505050505050565b611b14611de8565b6001600160a01b038116611b3d575f604051631e4fbdf760e01b81526004016106c39190613355565b610fe481611e1a565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611b855760405162461bcd60e51b81526004016106c390613ba3565b825464ffffffffff600160281b90910481169082168111611be35760405162461bcd60e51b815260206004820152601860248201527713185e9e5253550e881b195859881b5d5cdd08195e1a5cdd60421b60448201526064016106c3565b825f5b81866001015f611bf684886125e3565b64ffffffffff1681526020019081526020015f20819055505f816001611c1c9190613bed565b60ff168464ffffffffff16901c64ffffffffff16905060018564ffffffffff16901c64ffffffffff168111611c515750611de0565b600185165f03611d18575f611c7083611c6b886001613c06565b6125e3565b60408051808201825286815264ffffffffff83165f90815260018c0160209081529083902054908201529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611cd191600401613c23565b602060405180830381865af4158015611cec573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d10919061357a565b935050611dcc565b5f611d2883611c6b600189613c53565b60408051808201825264ffffffffff83165f90815260018c0160209081529083902054825281018790529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611d8991600401613c23565b602060405180830381865af4158015611da4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc8919061357a565b9350505b50647fffffffff600194851c169301611be6565b505050505050565b33611df1610fe7565b6001600160a01b031614610d00573360405163118cdaa760e01b81526004016106c39190613355565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b8154600160281b900464ffffffffff167f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611ed95760405162461bcd60e51b81526004016106c390613ba3565b825464ffffffffff90811690821610611f2c5760405162461bcd60e51b815260206004820152601560248201527413185e9e5253550e881d1c9959481a5cc8199d5b1b605a1b60448201526064016106c3565b611f37816001613c06565b835464ffffffffff91909116600160281b0269ffffffffff000000000019909116178355815f5b81856001015f611f6e84876125e3565b64ffffffffff16815260208101919091526040015f20556001831615612059575f611f9e82611c6b600187613c53565b60408051808201825264ffffffffff83165f90815260018a0160209081529083902054825281018690529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611fff91600401613c23565b602060405180830381865af415801561201a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061203e919061357a565b647fffffffff600195861c1694909350919091019050611f5e565b5050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610bf0565b612090612600565b610fe481612625565b602060ff821611156120e75760405162461bcd60e51b81526020600482015260176024820152764c617a79494d543a205472656520746f6f206c6172676560481b60448201526064016106c3565b6120f8600160ff831681901b613875565b825469ffffffffffffffffffff191664ffffffffff919091161790915550565b5f82116121385760405163aeaddff160e01b815260040160405180910390fd5b6001546001600160a01b0316612161576040516350ca893360e01b815260040160405180910390fd5b5f818152600a602052604081206001805460028301549293926001600160a01b039091169163bb03bd7191889161219791613875565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156121de573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612202919061357a565b90505f60015f9054906101000a90046001600160a01b03166001600160a01b0316631209b1f66040518163ffffffff1660e01b8152600401602060405180830381865afa158015612255573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612279919061357a565b90505f811161229b5760405163aeaddff160e01b815260040160405180910390fd5b5f6122a68284613c70565b90505f81116122c85760405163149fbcfd60e11b815260040160405180910390fd5b808611156112b15760405163aeaddff160e01b815260040160405180910390fd5b60058301546006840180545f92600160201b900463ffffffff169081111561236757508054600180820183555f928352602080842090920180546001600160a01b0319166001600160a01b03881690811790915583526008870182526040808420869055600988019092529120805460ff19168217905590506124e3565b5f5f90505f876008015f855f815481106123835761238361354e565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054905060015b845481101561240b575f896008015f8784815481106123cd576123cd61354e565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054905082811115612402578092508193505b506001016123ac565b5080861061241f575f9450505050506124e3565b5f886009015f8685815481106124375761243761354e565b5f9182526020808320909101546001600160a01b031683528201929092526040019020805460ff191660018360028111156124745761247461353a565b02179055508684838154811061248c5761248c61354e565b5f91825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918916815260088a018252604080822089905560098b0190925220805460ff191660019081179091559450505050505b9392505050565b5f5f8260ff161161253d5760405162461bcd60e51b815260206004820152601a60248201527f4c617a79494d543a206465707468206d757374206265203e203000000000000060448201526064016106c3565b602060ff831611156125615760405162461bcd60e51b81526004016106c390613c8f565b8254600160281b900464ffffffffff168061258060ff85166002613de0565b64ffffffffff1610156125d05760405162461bcd60e51b8152602060048201526018602482015277098c2f4f2929aa87440c2dac4d2ceeadeeae640c8cae0e8d60431b60448201526064016106c3565b6125db84828561262d565b949350505050565b5f816125f660ff851663ffffffff613df9565b6124e39190613c06565b6126086126f5565b610d0057604051631afcd79f60e31b815260040160405180910390fd5b611b14612600565b5f602060ff831611156126525760405162461bcd60e51b81526004016106c390613c8f565b8264ffffffffff165f03612670576126698261270e565b90506124e3565b5f61267c836001613bed565b60ff166001600160401b0381111561269657612696613526565b6040519080825280602002602001820160405280156126bf578160200160208202803683370190505b5090506126ce85858584612da8565b808360ff16815181106126e3576126e361354e565b60200260200101519150509392505050565b5f6126fe612060565b54600160401b900460ff16919050565b5f8160ff165f0361272057505f919050565b8160ff1660010361275257507f2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864919050565b8160ff1660020361278457507f1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1919050565b8160ff166003036127b657507f18f43331537ee2af2e3d758d50f72106467c6eea50371dd528d57eb2b856d238919050565b8160ff166004036127e857507f07f9d837cb17b0d36320ffe93ba52345f1b728571a568265caac97559dbc952a919050565b8160ff1660050361281a57507f2b94cf5e8746b3f5c9631f4c5df32907a699c58c94b2ad4d7b5cec1639183f55919050565b8160ff1660060361284c57507f2dee93c5a666459646ea7d22cca9e1bcfed71e6951b953611d11dda32ea09d78919050565b8160ff1660070361287e57507f078295e5a22b84e982cf601eb639597b8b0515a88cb5ac7fa8a4aabe3c87349d919050565b8160ff166008036128b057507f2fa5e5f18f6027a6501bec864564472a616b2e274a41211a444cbe3a99f3cc61919050565b8160ff166009036128e257507f0e884376d0d8fd21ecb780389e941f66e45e7acce3e228ab3e2156a614fcd747919050565b8160ff16600a0361291457507f1b7201da72494f1e28717ad1a52eb469f95892f957713533de6175e5da190af2919050565b8160ff16600b0361294657507f1f8d8822725e36385200c0b201249819a6e6e1e4650808b5bebc6bface7d7636919050565b8160ff16600c0361297857507f2c5d82f66c914bafb9701589ba8cfcfb6162b0a12acf88a8d0879a0471b5f85a919050565b8160ff16600d036129aa57507f14c54148a0940bb820957f5adf3fa1134ef5c4aaa113f4646458f270e0bfbfd0919050565b8160ff16600e036129dc57507f190d33b12f986f961e10c0ee44d8b9af11be25588cad89d416118e4bf4ebe80c919050565b8160ff16600f03612a0e57507f22f98aa9ce704152ac17354914ad73ed1167ae6596af510aa5b3649325e06c92919050565b8160ff16601003612a4057507f2a7c7c9b6ce5880b9f6f228d72bf6a575a526f29c66ecceef8b753d38bba7323919050565b8160ff16601103612a7257507f2e8186e558698ec1c67af9c14d463ffc470043c9c2988b954d75dd643f36b992919050565b8160ff16601203612aa457507f0f57c5571e9a4eab49e2c8cf050dae948aef6ead647392273546249d1c1ff10f919050565b8160ff16601303612ad657507f1830ee67b5fb554ad5f63d4388800e1cfe78e310697d46e43c9ce36134f72cca919050565b8160ff16601403612b0857507f2134e76ac5d21aab186c2be1dd8f84ee880a1e46eaf712f9d371b6df22191f3e919050565b8160ff16601503612b3a57507f19df90ec844ebc4ffeebd866f33859b0c051d8c958ee3aa88f8f8df3db91a5b1919050565b8160ff16601603612b6c57507f18cca2a66b5c0787981e69aefd84852d74af0e93ef4912b4648c05f722efe52b919050565b8160ff16601703612b9e57507f2388909415230d1b4d1304d2d54f473a628338f2efad83fadf05644549d2538d919050565b8160ff16601803612bd057507f27171fb4a97b6cc0e9e8f543b5294de866a2af2c9c8d0b1d96e673e4529ed540919050565b8160ff16601903612c0257507f2ff6650540f629fd5711a0bc74fc0d28dcb230b9392583e5f8d59696dde6ae21919050565b8160ff16601a03612c3457507f120c58f143d491e95902f7f5277778a2e0ad5168f6add75669932630ce611518919050565b8160ff16601b03612c6657507f1f21feb70d3f21b07bf853d5e5db03071ec495a0a565a21da2d665d279483795919050565b8160ff16601c03612c9857507f24be905fa71335e14c638cc0f66a8623a826e768068a9e968bb1a1dde18a72d2919050565b8160ff16601d03612cca57507f0f8666b62ed17491c50ceadead57d4cd597ef3821d65c328744c74e553dac26d919050565b8160ff16601e03612cfc57507f0918d46bf52d98b034413f4a1a1c41594e7a7a3f6ae08cb43d1a2a230e1959ef919050565b8160ff16601f03612d2e57507f1bbeb01b4c479ecde76917645e404dfa2e26f90d0afc5a65128513ad375c5ff2919050565b8160ff16602003612d6057507f2f68a1c58e257e42a17a6c61dff5551ed560b9922ab119d5ac8e184c9734ead9919050565b60405162461bcd60e51b815260206004820152601e60248201527f4c617a79494d543a2064656661756c745a65726f2062616420696e646578000060448201526064016106c3565b602060ff83161115612dcc5760405162461bcd60e51b81526004016106c390613c8f565b5f8364ffffffffff1611612e305760405162461bcd60e51b815260206004820152602560248201527f4c617a79494d543a206e756d626572206f66206c6561766573206d7573742062604482015264065203e20360dc1b60648201526084016106c3565b5f612e3c600185613c53565b9050600181165f03612e8f57846001015f612e575f846125e3565b64ffffffffff1681526020019081526020015f2054825f81518110612e7e57612e7e61354e565b602002602001018181525050612eb7565b612e985f61270e565b825f81518110612eaa57612eaa61354e565b6020026020010181815250505b5f5b8360ff168160ff161015611de057600182165f03612faf5773__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280868560ff1681518110612f0b57612f0b61354e565b60200260200101518152602001612f218561270e565b8152506040518263ffffffff1660e01b8152600401612f409190613c23565b602060405180830381865af4158015612f5b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f7f919061357a565b83612f8b836001613bed565b60ff1681518110612f9e57612f9e61354e565b602002602001018181525050613160565b5f612fbb826001613bed565b60ff168664ffffffffff16901c64ffffffffff16905060018364ffffffffff16901c64ffffffffff1681111561305d575f876001015f6130128560016130019190613bed565b60018864ffffffffff16901c6125e3565b64ffffffffff1681526020019081526020015f2054905080858460016130389190613bed565b60ff168151811061304b5761304b61354e565b6020026020010181815250505061315e565b5f876001015f61307485600188611c6b9190613c53565b64ffffffffff1681526020019081526020015f2054905073__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280848152602001888760ff16815181106130cb576130cb61354e565b60200260200101518152506040518263ffffffff1660e01b81526004016130f29190613c23565b602060405180830381865af415801561310d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613131919061357a565b8561313d856001613bed565b60ff16815181106131505761315061354e565b602002602001018181525050505b505b647fffffffff600192831c169101612eb9565b600183019183908215613204579160200282015f5b838211156131d257833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302613188565b80156132025782816101000a81549063ffffffff02191690556004016020816003010492830192600103026131d2565b505b50613210929150613214565b5090565b5b80821115613210575f8155600101613215565b6001600160a01b0381168114610fe4575f5ffd5b5f6020828403121561324c575f5ffd5b81356124e381613228565b5f60208284031215613267575f5ffd5b5035919050565b602080825282518282018190525f918401906040840190835b818110156132ae5783516001600160a01b0316835260209384019390920191600101613287565b509095945050505050565b5f5f5f608084860312156132cb575f5ffd5b8335925060208401359150608084018510156132e5575f5ffd5b6040840190509250925092565b5f5f60408385031215613303575f5ffd5b82359150602083013561331581613228565b809150509250929050565b5f5f5f60608486031215613332575f5ffd5b83359250602084013561334481613228565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b5f5f6040838503121561337a575f5ffd5b823561338581613228565b946020939093013593505050565b5f5f604083850312156133a4575f5ffd5b50508035926020909101359150565b5f5f83601f8401126133c3575f5ffd5b5081356001600160401b038111156133d9575f5ffd5b6020830191508360208285010111156133f0575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f5f60a08a8c03121561340f575f5ffd5b8935985060208a01356001600160401b0381111561342b575f5ffd5b8a01601f81018c1361343b575f5ffd5b80356001600160401b03811115613450575f5ffd5b8c60208260051b8401011115613464575f5ffd5b6020919091019850965060408a01356001600160401b03811115613486575f5ffd5b6134928c828d016133b3565b90975095505060608a01356001600160401b038111156134b0575f5ffd5b6134bc8c828d016133b3565b90955093505060808a01356001600160401b038111156134da575f5ffd5b6134e68c828d016133b3565b915080935050809150509295985092959850929598565b634e487b7160e01b5f52601160045260245ffd5b5f8161351f5761351f6134fd565b505f190190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60018201613573576135736134fd565b5060010190565b5f6020828403121561358a575f5ffd5b5051919050565b803563ffffffff811681146117fb575f5ffd5b5f602082840312156135b4575f5ffd5b6124e382613591565b80820180821115610bf057610bf06134fd565b84815260a0810160208201855f5b600281101561360b5763ffffffff6135f583613591565b16835260209283019291909101906001016135de565b50505060608201939093526080015292915050565b805180151581146117fb575f5ffd5b5f6020828403121561363f575f5ffd5b6124e382613620565b604080825283549082018190525f8481526020812090916060840190835b8181101561368d5783546001600160a01b0316835260019384019360209093019201613666565b5050838103602080860191909152855180835291810192508501905f5b818110156136c85782518452602093840193909201916001016136aa565b50919695505050505050565b6040516101e081016001600160401b03811182821017156136f7576136f7613526565b60405290565b604051601f8201601f191681016001600160401b038111828210171561372557613725613526565b604052919050565b5f6001600160401b0382111561374557613745613526565b50601f01601f191660200190565b5f82601f830112613762575f5ffd5b81356001600160401b0381111561377b5761377b613526565b8060051b61378b602082016136fd565b918252602081850181019290810190868411156137a6575f5ffd5b6020860192505b838310156137c85782358252602092830192909101906137ad565b9695505050505050565b5f5f604083850312156137e3575f5ffd5b82356001600160401b038111156137f8575f5ffd5b8301601f81018513613808575f5ffd5b803561381b6138168261372d565b6136fd565b81815286602083850101111561382f575f5ffd5b816020840160208301375f6020838301015280945050505060208301356001600160401b0381111561385f575f5ffd5b61386b85828601613753565b9150509250929050565b81810381811115610bf057610bf06134fd565b8051600481106117fb575f5ffd5b5f82601f8301126138a5575f5ffd5b604080519081016001600160401b03811182821017156138c7576138c7613526565b80604052508060408401858111156138dd575f5ffd5b845b818110156138f75780518352602092830192016138df565b509195945050505050565b80516117fb81613228565b5f82601f83011261391c575f5ffd5b815161392a6138168261372d565b81815284602083860101111561393e575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561396a575f5ffd5b81516001600160401b0381111561397f575f5ffd5b82016102008185031215613991575f5ffd5b6139996136d4565b815181526139a960208301613888565b6020820152604082810151908201526139c58560608401613896565b606082015260a082015160808201526139e060c08301613902565b60a082015260e08201516001600160401b038111156139fd575f5ffd5b613a098682850161390d565b60c0830152506101008201516001600160401b03811115613a28575f5ffd5b613a348682850161390d565b60e083015250613a476101208301613902565b610100820152613a5a6101408301613902565b61012082015261016082810151610140830152610180830151908201526101a08201516001600160401b03811115613a90575f5ffd5b613a9c8682850161390d565b61018083015250613ab06101c08301613902565b6101a0820152613ac36101e08301613620565b6101c0820152949350505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f613b0c604083018688613ad1565b8281036020840152613b1f818587613ad1565b979650505050505050565b606080825281018690525f8760808301825b89811015613b6c578235613b4f81613228565b6001600160a01b0316825260209283019290910190600101613b3c565b508381036020850152613b8081888a613ad1565b9150508281036040840152613b96818587613ad1565b9998505050505050505050565b6020808252602a908201527f4c617a79494d543a206c656166206d757374206265203c20534e41524b5f53436040820152691053105497d19251531160b21b606082015260800190565b60ff8181168382160190811115610bf057610bf06134fd565b64ffffffffff8181168382160190811115610bf057610bf06134fd565b6040810181835f5b6002811015613c4a578151835260209283019290910190600101613c2b565b50505092915050565b64ffffffffff8281168282160390811115610bf057610bf06134fd565b5f82613c8a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526023908201527f4c617a79494d543a206465707468206d757374206265203c3d204d41585f44456040820152620a0a8960eb1b606082015260800190565b6001815b6001841115610ea157808504811115613cf157613cf16134fd565b6001841615613cff57908102905b60019390931c928002613cd6565b5f82613d1b57506001610bf0565b81613d2757505f610bf0565b8160018114613d3d5760028114613d4757613d79565b6001915050610bf0565b60ff841115613d5857613d586134fd565b6001841b915064ffffffffff821115613d7357613d736134fd565b50610bf0565b5060208310610133831016604e8410600b8410161715613db1575081810a64ffffffffff811115613dac57613dac6134fd565b610bf0565b613dc164ffffffffff8484613cd2565b8064ffffffffff04821115613dd857613dd86134fd565b029392505050565b5f6124e364ffffffffff841664ffffffffff8416613d0d565b64ffffffffff8181168382160290811690818114613e1957613e196134fd565b509291505056fea164736f6c634300081c000a", + "deployedBytecode": "0x608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80639f0f874a11610135578063e59e4695116100b4578063f26ef74e11610079578063f26ef74e14610571578063f2fde38b14610584578063f379b0df14610597578063f52fd803146105d1578063f6fc05d514610643575f5ffd5b8063e59e469514610516578063e6745e1314610529578063e82f3b701461053c578063ebf0c7171461054f578063f165053614610557575f5ffd5b8063c3a0ec30116100fa578063c3a0ec30146104ae578063ca2869a0146104bf578063cd6dc687146104de578063da881e5a146104f1578063dbb06c9314610504575f5ffd5b80639f0f874a1461044d578063a016493014610456578063a8a4d69b14610469578063bff232c11461047c578063c2b40ae41461048f575f5ffd5b8063715018a6116101c15780638d1ddfb1116101865780638d1ddfb1146103cd5780638da5cb5b146103e35780638e5ce3ad146103eb5780639015d371146103fe5780639a7a2ffc14610411575f5ffd5b8063715018a6146103465780637c92f5241461034e578063858142431461037b5780638a78bb151461039b5780638cb89ecb146103ae575f5ffd5b80632e7b716d116102075780632e7b716d146102d85780634d6861a6146102eb57806350e6d94c146102fe5780635d5047761461032057806370e36bbe14610333575f5ffd5b8063096b810a146102435780630f3e34121461025857806317d611201461026b5780632800d82914610294578063291a691b146102b5575b5f5ffd5b61025661025136600461323c565b61064c565b005b610256610266366004613257565b610798565b61027e610279366004613257565b6107db565b60405161028b919061326e565b60405180910390f35b6102a76102a2366004613257565b61091d565b60405190815260200161028b565b6102c86102c33660046132b9565b610969565b604051901515815260200161028b565b6102c86102e636600461323c565b610b43565b6102c86102f9366004613257565b610bf6565b6102c861030c36600461323c565b60066020525f908152604090205460ff1681565b6102c861032e3660046132f2565b610c35565b61025661034136600461323c565b610c79565b610256610cef565b61036161035c366004613320565b610d02565b6040805192835263ffffffff90911660208301520161028b565b60015461038e906001600160a01b031681565b60405161028b9190613355565b6102566103a936600461323c565b610ea9565b6102a76103bc366004613257565b60096020525f908152604090205481565b600454600160281b900464ffffffffff166102a7565b61038e610fe7565b600b5461038e906001600160a01b031681565b6102c861040c36600461323c565b611015565b61043761041f36600461323c565b60076020525f908152604090205464ffffffffff1681565b60405164ffffffffff909116815260200161028b565b6102a760035481565b61027e610464366004613257565b611032565b6102c86104773660046132f2565b6110c8565b61025661048a36600461323c565b61110c565b6102a761049d366004613257565b60086020525f908152604090205481565b6001546001600160a01b031661038e565b6102a76104cd366004613257565b5f9081526008602052604090205490565b6102566104ec366004613369565b61115d565b6102c86104ff366004613257565b6112ba565b5f5461038e906001600160a01b031681565b61025661052436600461323c565b611594565b610256610537366004613393565b61160c565b6102a761054a366004613257565b6117cf565b6102a7611800565b61055f601481565b60405160ff909116815260200161028b565b61025661057f3660046133f7565b611812565b61025661059236600461323c565b611b0c565b6004546105b39064ffffffffff80821691600160281b90041682565b6040805164ffffffffff93841681529290911660208301520161028b565b6106146105df366004613257565b5f908152600a6020819052604090912090810154600590910154909163ffffffff80831692600160201b900416908284101590565b60405161028b949392919093845263ffffffff9283166020850152911660408301521515606082015260800190565b6102a760025481565b610654610fe7565b6001600160a01b0316336001600160a01b0316148061067d57506001546001600160a01b031633145b61069a57604051632864c4e160e01b815260040160405180910390fd5b6106a381611015565b81906106cc576040516381e5828960e01b81526004016106c39190613355565b60405180910390fd5b506001600160a01b0381165f9081526007602052604081205464ffffffffff16906106fa9060049083611b46565b6001600160a01b0382165f908152600660205260408120805460ff19169055600280549161072783613511565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f8c008e3835f6c79bfcdb89f0f6ca8705e0b01049ee84a90b0e4da1c7ba9405d5906060015b60405180910390a25050565b6107a0611de8565b60038190556040518181527fbe772dc189863d512fa01e489c8eac204975aef1a8662d8b5a333804b5207ab79060200160405180910390a150565b5f818152600a602081905260408220600681015491810154606093919291816001600160401b0381111561081157610811613526565b60405190808252806020026020018201604052801561083a578160200160208202803683370190505b5090505f805b84811015610911576001866009015f8860060184815481106108645761086461354e565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205460ff16600281111561089c5761089c61353a565b03610909578560060181815481106108b6576108b661354e565b905f5260205f20015f9054906101000a90046001600160a01b03168383815181106108e3576108e361354e565b6001600160a01b03909216602092830291909101909101528161090581613562565b9250505b600101610840565b50909695505050505050565b5f818152600a6020526040812081815460ff1660038111156109415761094161353a565b0361095f57604051630d4c1d9760e41b815260040160405180910390fd5b6003015492915050565b5f80546001600160a01b031633146109945760405163e4c2a7eb60e01b815260040160405180910390fd5b5f848152600a6020526040812090815460ff1660038111156109b8576109b861353a565b146109d6576040516374ff462560e11b815260040160405180910390fd5b60015460408051630cc37d8f60e11b815290515f926001600160a01b031691631986fb1e9160048083019260209291908290030181865afa158015610a1d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a41919061357a565b905080610a5460408601602087016135a4565b63ffffffff161115610a6c60408601602087016135a4565b829091610a9a576040516344ec930f60e01b815263ffffffff909216600483015260248201526044016106c3565b5050815460ff1916600190811783558201859055436002830155600354610ac190426135bd565b6003830155610ad560058301856002613173565b50610ade611800565b5f87815260086020526040908190209190915560028301546003840154915188927f381d281d32f95ef8fe4e5f3b263ea6a32d03d331e1a141ae1da996dc02a7a17092610b2f928a928a92916135d0565b60405180910390a250600195945050505050565b5f610b4d82611015565b610b5857505f919050565b6001546001600160a01b0316610b81576040516350ca893360e01b815260040160405180910390fd5b600154604051639f8a13d760e01b81526001600160a01b0390911690639f8a13d790610bb1908590600401613355565b602060405180830381865afa158015610bcc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf0919061362f565b92915050565b5f818152600a602052604081206001815460ff166003811115610c1b57610c1b61353a565b14610c2857505f92915050565b6003015442111592915050565b5f60015f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff166002811115610c7157610c7161353a565b149392505050565b610c81611de8565b6001600160a01b038116610ca85760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b038316908117825560405190917f2c8267accd82e977550ed2349c73311183cd22e306347be4453c8d130995e3c991a250565b610cf7611de8565b610d005f611e1a565b565b600b545f9081906001600160a01b03163314610d315760405163fcef374960e01b815260040160405180910390fd5b5f858152600a602052604090206002815460ff166003811115610d5657610d5661353a565b14610d7457604051634f4b461f60e11b815260040160405180910390fd5b60058101546001600160a01b0386165f90815260098301602052604090205463ffffffff909116925060019060ff166002811115610db457610db461353a565b14610dc457600a01549150610ea1565b6001600160a01b0385165f9081526009820160205260408120805460ff19166002179055600a8201805491610df883613511565b919050555080600a01549250846001600160a01b0316867f6c783b92374361b4d6efaf29673b89437ee969bb3c9d2d5d86b143ad5447b8498686604051610e49929190918252602082015260400190565b60405180910390a36040805184815263ffffffff84166020820181905285101591810182905287907f119cb11dd0a68c257d6dc9b06dcb37dd422ce276eb8bf3cd0b7079a116b8e2989060600160405180910390a250505b935093915050565b610eb1610fe7565b6001600160a01b0316336001600160a01b03161480610eda57506001546001600160a01b031633145b610ef757604051632864c4e160e01b815260040160405180910390fd5b610f0081611015565b610fe45760048054600160281b900464ffffffffff1690610f2a906001600160a01b038416611e8a565b6001600160a01b0382165f908152600660209081526040808320805460ff1916600117905560079091528120805464ffffffffff841664ffffffffff199091161790556002805491610f7b83613562565b90915550506002546004546040805164ffffffffff80861682526020820194909452600160281b909204909216918101919091526001600160a01b038316907f3318d261fe14a5761d2d1e21555652f623d2134c430a9883c9ad6e958bb0db539060600161078c565b50565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03165f9081526006602052604090205460ff1690565b5f818152600a60205260409020600481015460609190611065576040516322e679e360e11b815260040160405180910390fd5b806006018054806020026020016040519081016040528092919081815260200182805480156110bb57602002820191905f5260205f20905b81546001600160a01b0316815260019091019060200180831161109d575b5050505050915050919050565b5f805f848152600a602090815260408083206001600160a01b038716845260090190915290205460ff1660028111156111035761110361353a565b14159392505050565b611114611de8565b6001600160a01b03811661113b5760405163d92e233d60e01b815260040160405180910390fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f611166612060565b805490915060ff600160401b82041615906001600160401b03165f8115801561118c5750825b90505f826001600160401b031660011480156111a75750303b155b9050811580156111b5575080155b156111d35760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111fd57845460ff60401b1916600160401b1785555b6001600160a01b0387166112245760405163d92e233d60e01b815260040160405180910390fd5b61122d33612088565b61123960046014612099565b61124286610798565b61124a610fe7565b6001600160a01b0316876001600160a01b03161461126b5761126b87611b0c565b83156112b157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f818152600a6020526040812081815460ff1660038111156112de576112de61353a565b036112fc57604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff1660038111156113145761131461353a565b1461133257604051631860f69960e31b815260040160405180910390fd5b8060030154421161135657604051632f021e8d60e11b815260040160405180910390fd5b60058101546006820154600160201b90910463ffffffff1611158061143b578154600360ff199091161782556006820154600583015460408051928352600160201b90910463ffffffff16602083015285917fecc4a9fb7e28d074cba7f5b227e9b5827823c850a385539b9a2f98a08f8c203d910160405180910390a25f54604051635d968dc160e11b815260048101869052600260248201526001600160a01b039091169063bb2d1b82906044015f604051808303815f87803b15801561141c575f5ffd5b505af115801561142e573d5f5f3e3d5ffd5b505f979650505050505050565b815460ff191660021782556006820154600a83018190555f816001600160401b0381111561146b5761146b613526565b604051908082528060200260200182016040528015611494578160200160208202803683370190505b5090505f5b8281101561150657846008015f8660060183815481106114bb576114bb61354e565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205482518390839081106114f3576114f361354e565b6020908102919091010152600101611499565b505f54604051631f3ea75d60e21b8152600481018890526001600160a01b0390911690637cfa9d74906024015f604051808303815f87803b158015611549575f5ffd5b505af115801561155b573d5f5f3e3d5ffd5b50505050857f4f1f5b329c741a8ba15e9645e301061294d0c1fdd455448ffd5e76ff255929d78560060183604051610b2f929190613648565b61159c611de8565b6001600160a01b0381166115c35760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517fad4055f18cdad6f4bdd71afe3a72cbeee964217943e1bde38f138289e981a9a7905f90a250565b5f828152600a6020526040812090815460ff1660038111156116305761163061353a565b0361164e57604051630d4c1d9760e41b815260040160405180910390fd5b6001815460ff1660038111156116665761166661353a565b1461168457604051631860f69960e31b815260040160405180910390fd5b80600301544211156116a957604051639a19114d60e01b815260040160405180910390fd5b335f90815260078201602052604090205460ff16156116db5760405163257309f160e11b815260040160405180910390fd5b6116e433610b43565b6117015760405163149fbcfd60e11b815260040160405180910390fd5b61170c338385612118565b6001810154604080516bffffffffffffffffffffffff193360601b16602080830191909152603482018690526054820187905260748083019490945282518083039094018452609490910190915281519101205f90335f8181526007850160205260409020805460ff1916600117905590915061178b908390836122e9565b506040805184815260208101839052339186917f52999628fb1cb05707e842278833b22e511f11746202cecdf221968b0b89e8bd910160405180910390a350505050565b5f81815260096020526040902054806117fb576040516322e679e360e11b815260040160405180910390fd5b919050565b5f61180d600460146124ea565b905090565b61181a611de8565b5f898152600a602052604090206002815460ff16600381111561183f5761183f61353a565b1461185d57604051634f4b461f60e11b815260040160405180910390fd5b6004810154156118805760405163632a22bb60e01b815260040160405180910390fd5b600681015488146118c95760405162461bcd60e51b815260206004820152601360248201527209cdec8ca40c6deeadce840dad2e6dac2e8c6d606b1b60448201526064016106c3565b5f6118d6858701876137d2565b9150505f8151116119205760405162461bcd60e51b815260206004820152601460248201527343353a206e6f207075626c696320696e7075747360601b60448201526064016106c3565b5f81600183516119309190613875565b815181106119405761194061354e565b602002602001015190505f5f5f9054906101000a90046001600160a01b03166001600160a01b031663406ed35c8e6040518263ffffffff1660e01b815260040161198c91815260200190565b5f60405180830381865afa1580156119a6573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119cd919081019061395a565b610120810151604051637bf41d7760e11b81529192506001600160a01b03169063f7e83aee90611a07908b908b908b908b90600401613af9565b602060405180830381865afa158015611a22573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a46919061357a565b5060048085018390555f8e815260096020526040808220859055905490516340a3b76160e11b81529182018f9052602482018490526001600160a01b0316906381476ec2906044015f604051808303815f87803b158015611aa5575f5ffd5b505af1158015611ab7573d5f5f3e3d5ffd5b505050508c7f49ac1dd411942113d1c5e6799c6379ce341afe85a4175fb562cf2a5fb886c27d8d8d8d8d8d8d604051611af596959493929190613b2a565b60405180910390a250505050505050505050505050565b611b14611de8565b6001600160a01b038116611b3d575f604051631e4fbdf760e01b81526004016106c39190613355565b610fe481611e1a565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611b855760405162461bcd60e51b81526004016106c390613ba3565b825464ffffffffff600160281b90910481169082168111611be35760405162461bcd60e51b815260206004820152601860248201527713185e9e5253550e881b195859881b5d5cdd08195e1a5cdd60421b60448201526064016106c3565b825f5b81866001015f611bf684886125e3565b64ffffffffff1681526020019081526020015f20819055505f816001611c1c9190613bed565b60ff168464ffffffffff16901c64ffffffffff16905060018564ffffffffff16901c64ffffffffff168111611c515750611de0565b600185165f03611d18575f611c7083611c6b886001613c06565b6125e3565b60408051808201825286815264ffffffffff83165f90815260018c0160209081529083902054908201529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611cd191600401613c23565b602060405180830381865af4158015611cec573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d10919061357a565b935050611dcc565b5f611d2883611c6b600189613c53565b60408051808201825264ffffffffff83165f90815260018c0160209081529083902054825281018790529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611d8991600401613c23565b602060405180830381865af4158015611da4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc8919061357a565b9350505b50647fffffffff600194851c169301611be6565b505050505050565b33611df1610fe7565b6001600160a01b031614610d00573360405163118cdaa760e01b81526004016106c39190613355565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b8154600160281b900464ffffffffff167f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018210611ed95760405162461bcd60e51b81526004016106c390613ba3565b825464ffffffffff90811690821610611f2c5760405162461bcd60e51b815260206004820152601560248201527413185e9e5253550e881d1c9959481a5cc8199d5b1b605a1b60448201526064016106c3565b611f37816001613c06565b835464ffffffffff91909116600160281b0269ffffffffff000000000019909116178355815f5b81856001015f611f6e84876125e3565b64ffffffffff16815260208101919091526040015f20556001831615612059575f611f9e82611c6b600187613c53565b60408051808201825264ffffffffff83165f90815260018a0160209081529083902054825281018690529051632b0aac7f60e11b815291925073__$078c82ddf6c95d34ea184ef1dd6130d136$__9163561558fe91611fff91600401613c23565b602060405180830381865af415801561201a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061203e919061357a565b647fffffffff600195861c1694909350919091019050611f5e565b5050505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610bf0565b612090612600565b610fe481612625565b602060ff821611156120e75760405162461bcd60e51b81526020600482015260176024820152764c617a79494d543a205472656520746f6f206c6172676560481b60448201526064016106c3565b6120f8600160ff831681901b613875565b825469ffffffffffffffffffff191664ffffffffff919091161790915550565b5f82116121385760405163aeaddff160e01b815260040160405180910390fd5b6001546001600160a01b0316612161576040516350ca893360e01b815260040160405180910390fd5b5f818152600a602052604081206001805460028301549293926001600160a01b039091169163bb03bd7191889161219791613875565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156121de573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612202919061357a565b90505f60015f9054906101000a90046001600160a01b03166001600160a01b0316631209b1f66040518163ffffffff1660e01b8152600401602060405180830381865afa158015612255573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612279919061357a565b90505f811161229b5760405163aeaddff160e01b815260040160405180910390fd5b5f6122a68284613c70565b90505f81116122c85760405163149fbcfd60e11b815260040160405180910390fd5b808611156112b15760405163aeaddff160e01b815260040160405180910390fd5b60058301546006840180545f92600160201b900463ffffffff169081111561236757508054600180820183555f928352602080842090920180546001600160a01b0319166001600160a01b03881690811790915583526008870182526040808420869055600988019092529120805460ff19168217905590506124e3565b5f5f90505f876008015f855f815481106123835761238361354e565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054905060015b845481101561240b575f896008015f8784815481106123cd576123cd61354e565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054905082811115612402578092508193505b506001016123ac565b5080861061241f575f9450505050506124e3565b5f886009015f8685815481106124375761243761354e565b5f9182526020808320909101546001600160a01b031683528201929092526040019020805460ff191660018360028111156124745761247461353a565b02179055508684838154811061248c5761248c61354e565b5f91825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918916815260088a018252604080822089905560098b0190925220805460ff191660019081179091559450505050505b9392505050565b5f5f8260ff161161253d5760405162461bcd60e51b815260206004820152601a60248201527f4c617a79494d543a206465707468206d757374206265203e203000000000000060448201526064016106c3565b602060ff831611156125615760405162461bcd60e51b81526004016106c390613c8f565b8254600160281b900464ffffffffff168061258060ff85166002613de0565b64ffffffffff1610156125d05760405162461bcd60e51b8152602060048201526018602482015277098c2f4f2929aa87440c2dac4d2ceeadeeae640c8cae0e8d60431b60448201526064016106c3565b6125db84828561262d565b949350505050565b5f816125f660ff851663ffffffff613df9565b6124e39190613c06565b6126086126f5565b610d0057604051631afcd79f60e31b815260040160405180910390fd5b611b14612600565b5f602060ff831611156126525760405162461bcd60e51b81526004016106c390613c8f565b8264ffffffffff165f03612670576126698261270e565b90506124e3565b5f61267c836001613bed565b60ff166001600160401b0381111561269657612696613526565b6040519080825280602002602001820160405280156126bf578160200160208202803683370190505b5090506126ce85858584612da8565b808360ff16815181106126e3576126e361354e565b60200260200101519150509392505050565b5f6126fe612060565b54600160401b900460ff16919050565b5f8160ff165f0361272057505f919050565b8160ff1660010361275257507f2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864919050565b8160ff1660020361278457507f1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1919050565b8160ff166003036127b657507f18f43331537ee2af2e3d758d50f72106467c6eea50371dd528d57eb2b856d238919050565b8160ff166004036127e857507f07f9d837cb17b0d36320ffe93ba52345f1b728571a568265caac97559dbc952a919050565b8160ff1660050361281a57507f2b94cf5e8746b3f5c9631f4c5df32907a699c58c94b2ad4d7b5cec1639183f55919050565b8160ff1660060361284c57507f2dee93c5a666459646ea7d22cca9e1bcfed71e6951b953611d11dda32ea09d78919050565b8160ff1660070361287e57507f078295e5a22b84e982cf601eb639597b8b0515a88cb5ac7fa8a4aabe3c87349d919050565b8160ff166008036128b057507f2fa5e5f18f6027a6501bec864564472a616b2e274a41211a444cbe3a99f3cc61919050565b8160ff166009036128e257507f0e884376d0d8fd21ecb780389e941f66e45e7acce3e228ab3e2156a614fcd747919050565b8160ff16600a0361291457507f1b7201da72494f1e28717ad1a52eb469f95892f957713533de6175e5da190af2919050565b8160ff16600b0361294657507f1f8d8822725e36385200c0b201249819a6e6e1e4650808b5bebc6bface7d7636919050565b8160ff16600c0361297857507f2c5d82f66c914bafb9701589ba8cfcfb6162b0a12acf88a8d0879a0471b5f85a919050565b8160ff16600d036129aa57507f14c54148a0940bb820957f5adf3fa1134ef5c4aaa113f4646458f270e0bfbfd0919050565b8160ff16600e036129dc57507f190d33b12f986f961e10c0ee44d8b9af11be25588cad89d416118e4bf4ebe80c919050565b8160ff16600f03612a0e57507f22f98aa9ce704152ac17354914ad73ed1167ae6596af510aa5b3649325e06c92919050565b8160ff16601003612a4057507f2a7c7c9b6ce5880b9f6f228d72bf6a575a526f29c66ecceef8b753d38bba7323919050565b8160ff16601103612a7257507f2e8186e558698ec1c67af9c14d463ffc470043c9c2988b954d75dd643f36b992919050565b8160ff16601203612aa457507f0f57c5571e9a4eab49e2c8cf050dae948aef6ead647392273546249d1c1ff10f919050565b8160ff16601303612ad657507f1830ee67b5fb554ad5f63d4388800e1cfe78e310697d46e43c9ce36134f72cca919050565b8160ff16601403612b0857507f2134e76ac5d21aab186c2be1dd8f84ee880a1e46eaf712f9d371b6df22191f3e919050565b8160ff16601503612b3a57507f19df90ec844ebc4ffeebd866f33859b0c051d8c958ee3aa88f8f8df3db91a5b1919050565b8160ff16601603612b6c57507f18cca2a66b5c0787981e69aefd84852d74af0e93ef4912b4648c05f722efe52b919050565b8160ff16601703612b9e57507f2388909415230d1b4d1304d2d54f473a628338f2efad83fadf05644549d2538d919050565b8160ff16601803612bd057507f27171fb4a97b6cc0e9e8f543b5294de866a2af2c9c8d0b1d96e673e4529ed540919050565b8160ff16601903612c0257507f2ff6650540f629fd5711a0bc74fc0d28dcb230b9392583e5f8d59696dde6ae21919050565b8160ff16601a03612c3457507f120c58f143d491e95902f7f5277778a2e0ad5168f6add75669932630ce611518919050565b8160ff16601b03612c6657507f1f21feb70d3f21b07bf853d5e5db03071ec495a0a565a21da2d665d279483795919050565b8160ff16601c03612c9857507f24be905fa71335e14c638cc0f66a8623a826e768068a9e968bb1a1dde18a72d2919050565b8160ff16601d03612cca57507f0f8666b62ed17491c50ceadead57d4cd597ef3821d65c328744c74e553dac26d919050565b8160ff16601e03612cfc57507f0918d46bf52d98b034413f4a1a1c41594e7a7a3f6ae08cb43d1a2a230e1959ef919050565b8160ff16601f03612d2e57507f1bbeb01b4c479ecde76917645e404dfa2e26f90d0afc5a65128513ad375c5ff2919050565b8160ff16602003612d6057507f2f68a1c58e257e42a17a6c61dff5551ed560b9922ab119d5ac8e184c9734ead9919050565b60405162461bcd60e51b815260206004820152601e60248201527f4c617a79494d543a2064656661756c745a65726f2062616420696e646578000060448201526064016106c3565b602060ff83161115612dcc5760405162461bcd60e51b81526004016106c390613c8f565b5f8364ffffffffff1611612e305760405162461bcd60e51b815260206004820152602560248201527f4c617a79494d543a206e756d626572206f66206c6561766573206d7573742062604482015264065203e20360dc1b60648201526084016106c3565b5f612e3c600185613c53565b9050600181165f03612e8f57846001015f612e575f846125e3565b64ffffffffff1681526020019081526020015f2054825f81518110612e7e57612e7e61354e565b602002602001018181525050612eb7565b612e985f61270e565b825f81518110612eaa57612eaa61354e565b6020026020010181815250505b5f5b8360ff168160ff161015611de057600182165f03612faf5773__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280868560ff1681518110612f0b57612f0b61354e565b60200260200101518152602001612f218561270e565b8152506040518263ffffffff1660e01b8152600401612f409190613c23565b602060405180830381865af4158015612f5b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f7f919061357a565b83612f8b836001613bed565b60ff1681518110612f9e57612f9e61354e565b602002602001018181525050613160565b5f612fbb826001613bed565b60ff168664ffffffffff16901c64ffffffffff16905060018364ffffffffff16901c64ffffffffff1681111561305d575f876001015f6130128560016130019190613bed565b60018864ffffffffff16901c6125e3565b64ffffffffff1681526020019081526020015f2054905080858460016130389190613bed565b60ff168151811061304b5761304b61354e565b6020026020010181815250505061315e565b5f876001015f61307485600188611c6b9190613c53565b64ffffffffff1681526020019081526020015f2054905073__$078c82ddf6c95d34ea184ef1dd6130d136$__63561558fe6040518060400160405280848152602001888760ff16815181106130cb576130cb61354e565b60200260200101518152506040518263ffffffff1660e01b81526004016130f29190613c23565b602060405180830381865af415801561310d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613131919061357a565b8561313d856001613bed565b60ff16815181106131505761315061354e565b602002602001018181525050505b505b647fffffffff600192831c169101612eb9565b600183019183908215613204579160200282015f5b838211156131d257833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302613188565b80156132025782816101000a81549063ffffffff02191690556004016020816003010492830192600103026131d2565b505b50613210929150613214565b5090565b5b80821115613210575f8155600101613215565b6001600160a01b0381168114610fe4575f5ffd5b5f6020828403121561324c575f5ffd5b81356124e381613228565b5f60208284031215613267575f5ffd5b5035919050565b602080825282518282018190525f918401906040840190835b818110156132ae5783516001600160a01b0316835260209384019390920191600101613287565b509095945050505050565b5f5f5f608084860312156132cb575f5ffd5b8335925060208401359150608084018510156132e5575f5ffd5b6040840190509250925092565b5f5f60408385031215613303575f5ffd5b82359150602083013561331581613228565b809150509250929050565b5f5f5f60608486031215613332575f5ffd5b83359250602084013561334481613228565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b5f5f6040838503121561337a575f5ffd5b823561338581613228565b946020939093013593505050565b5f5f604083850312156133a4575f5ffd5b50508035926020909101359150565b5f5f83601f8401126133c3575f5ffd5b5081356001600160401b038111156133d9575f5ffd5b6020830191508360208285010111156133f0575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f5f60a08a8c03121561340f575f5ffd5b8935985060208a01356001600160401b0381111561342b575f5ffd5b8a01601f81018c1361343b575f5ffd5b80356001600160401b03811115613450575f5ffd5b8c60208260051b8401011115613464575f5ffd5b6020919091019850965060408a01356001600160401b03811115613486575f5ffd5b6134928c828d016133b3565b90975095505060608a01356001600160401b038111156134b0575f5ffd5b6134bc8c828d016133b3565b90955093505060808a01356001600160401b038111156134da575f5ffd5b6134e68c828d016133b3565b915080935050809150509295985092959850929598565b634e487b7160e01b5f52601160045260245ffd5b5f8161351f5761351f6134fd565b505f190190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60018201613573576135736134fd565b5060010190565b5f6020828403121561358a575f5ffd5b5051919050565b803563ffffffff811681146117fb575f5ffd5b5f602082840312156135b4575f5ffd5b6124e382613591565b80820180821115610bf057610bf06134fd565b84815260a0810160208201855f5b600281101561360b5763ffffffff6135f583613591565b16835260209283019291909101906001016135de565b50505060608201939093526080015292915050565b805180151581146117fb575f5ffd5b5f6020828403121561363f575f5ffd5b6124e382613620565b604080825283549082018190525f8481526020812090916060840190835b8181101561368d5783546001600160a01b0316835260019384019360209093019201613666565b5050838103602080860191909152855180835291810192508501905f5b818110156136c85782518452602093840193909201916001016136aa565b50919695505050505050565b6040516101e081016001600160401b03811182821017156136f7576136f7613526565b60405290565b604051601f8201601f191681016001600160401b038111828210171561372557613725613526565b604052919050565b5f6001600160401b0382111561374557613745613526565b50601f01601f191660200190565b5f82601f830112613762575f5ffd5b81356001600160401b0381111561377b5761377b613526565b8060051b61378b602082016136fd565b918252602081850181019290810190868411156137a6575f5ffd5b6020860192505b838310156137c85782358252602092830192909101906137ad565b9695505050505050565b5f5f604083850312156137e3575f5ffd5b82356001600160401b038111156137f8575f5ffd5b8301601f81018513613808575f5ffd5b803561381b6138168261372d565b6136fd565b81815286602083850101111561382f575f5ffd5b816020840160208301375f6020838301015280945050505060208301356001600160401b0381111561385f575f5ffd5b61386b85828601613753565b9150509250929050565b81810381811115610bf057610bf06134fd565b8051600481106117fb575f5ffd5b5f82601f8301126138a5575f5ffd5b604080519081016001600160401b03811182821017156138c7576138c7613526565b80604052508060408401858111156138dd575f5ffd5b845b818110156138f75780518352602092830192016138df565b509195945050505050565b80516117fb81613228565b5f82601f83011261391c575f5ffd5b815161392a6138168261372d565b81815284602083860101111561393e575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561396a575f5ffd5b81516001600160401b0381111561397f575f5ffd5b82016102008185031215613991575f5ffd5b6139996136d4565b815181526139a960208301613888565b6020820152604082810151908201526139c58560608401613896565b606082015260a082015160808201526139e060c08301613902565b60a082015260e08201516001600160401b038111156139fd575f5ffd5b613a098682850161390d565b60c0830152506101008201516001600160401b03811115613a28575f5ffd5b613a348682850161390d565b60e083015250613a476101208301613902565b610100820152613a5a6101408301613902565b61012082015261016082810151610140830152610180830151908201526101a08201516001600160401b03811115613a90575f5ffd5b613a9c8682850161390d565b61018083015250613ab06101c08301613902565b6101a0820152613ac36101e08301613620565b6101c0820152949350505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b604081525f613b0c604083018688613ad1565b8281036020840152613b1f818587613ad1565b979650505050505050565b606080825281018690525f8760808301825b89811015613b6c578235613b4f81613228565b6001600160a01b0316825260209283019290910190600101613b3c565b508381036020850152613b8081888a613ad1565b9150508281036040840152613b96818587613ad1565b9998505050505050505050565b6020808252602a908201527f4c617a79494d543a206c656166206d757374206265203c20534e41524b5f53436040820152691053105497d19251531160b21b606082015260800190565b60ff8181168382160190811115610bf057610bf06134fd565b64ffffffffff8181168382160190811115610bf057610bf06134fd565b6040810181835f5b6002811015613c4a578151835260209283019290910190600101613c2b565b50505092915050565b64ffffffffff8281168282160390811115610bf057610bf06134fd565b5f82613c8a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526023908201527f4c617a79494d543a206465707468206d757374206265203c3d204d41585f44456040820152620a0a8960eb1b606082015260800190565b6001815b6001841115610ea157808504811115613cf157613cf16134fd565b6001841615613cff57908102905b60019390931c928002613cd6565b5f82613d1b57506001610bf0565b81613d2757505f610bf0565b8160018114613d3d5760028114613d4757613d79565b6001915050610bf0565b60ff841115613d5857613d586134fd565b6001841b915064ffffffffff821115613d7357613d736134fd565b50610bf0565b5060208310610133831016604e8410600b8410161715613db1575081810a64ffffffffff811115613dac57613dac6134fd565b610bf0565b613dc164ffffffffff8484613cd2565b8064ffffffffff04821115613dd857613dd86134fd565b029392505050565b5f6124e364ffffffffff841664ffffffffff8416613d0d565b64ffffffffff8181168382160290811690818114613e1957613e196134fd565b509291505056fea164736f6c634300081c000a", "linkReferences": { "npm/poseidon-solidity@0.0.5/PoseidonT3.sol": { "PoseidonT3": [ { "length": 20, - "start": 7386 + "start": 7553 }, { "length": 20, - "start": 7570 + "start": 7737 }, { "length": 20, - "start": 8200 + "start": 8367 }, { "length": 20, - "start": 12034 + "start": 12201 }, { "length": 20, - "start": 12476 + "start": 12643 } ] } @@ -1286,28 +1292,28 @@ "PoseidonT3": [ { "length": 20, - "start": 7172 + "start": 7339 }, { "length": 20, - "start": 7356 + "start": 7523 }, { "length": 20, - "start": 7986 + "start": 8153 }, { "length": 20, - "start": 11820 + "start": 11987 }, { "length": 20, - "start": 12262 + "start": 12429 } ] } }, "immutableReferences": {}, "inputSourceName": "project/contracts/registry/CiphernodeRegistryOwnable.sol", - "buildInfoId": "solc-0_8_28-74ea8e366bd07fddf0065d16be962bc1ae5e80d7" + "buildInfoId": "solc-0_8_28-fd853fea4a7c18ebe6d1db07eac4a0f86f797607" } \ No newline at end of file diff --git a/packages/enclave-contracts/contracts/interfaces/ICiphernodeRegistry.sol b/packages/enclave-contracts/contracts/interfaces/ICiphernodeRegistry.sol index e0b29b8e8d..6298a4df90 100644 --- a/packages/enclave-contracts/contracts/interfaces/ICiphernodeRegistry.sol +++ b/packages/enclave-contracts/contracts/interfaces/ICiphernodeRegistry.sol @@ -84,7 +84,12 @@ interface ICiphernodeRegistry { /// @notice This event MUST be emitted when a committee is finalized /// @param e3Id ID of the E3 computation /// @param committee Array of selected ciphernode addresses - event CommitteeFinalized(uint256 indexed e3Id, address[] committee); + /// @param scores Array of sortition scores corresponding to each committee member + event CommitteeFinalized( + uint256 indexed e3Id, + address[] committee, + uint256[] scores + ); /// @notice This event MUST be emitted when committee formation fails (threshold not met) /// @param e3Id ID of the E3 computation diff --git a/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol b/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol index 305181ffbb..e67ae0c1af 100644 --- a/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol +++ b/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol @@ -348,8 +348,14 @@ contract CiphernodeRegistryOwnable is ICiphernodeRegistry, OwnableUpgradeable { c.stage = ICiphernodeRegistry.CommitteeStage.Finalized; c.activeCount = c.topNodes.length; + uint256 len = c.topNodes.length; + uint256[] memory scores = new uint256[](len); + for (uint256 i = 0; i < len; ++i) { + scores[i] = c.scoreOf[c.topNodes[i]]; + } + enclave.onCommitteeFinalized(e3Id); - emit CommitteeFinalized(e3Id, c.topNodes); + emit CommitteeFinalized(e3Id, c.topNodes, scores); return true; } diff --git a/packages/enclave-sdk/src/events/types.ts b/packages/enclave-sdk/src/events/types.ts index 357f8ebff4..4da2c67268 100644 --- a/packages/enclave-sdk/src/events/types.ts +++ b/packages/enclave-sdk/src/events/types.ts @@ -99,7 +99,8 @@ export interface CommitteePublishedData { export interface CommitteeFinalizedData { e3Id: bigint - nodes: string[] + committee: string[] + scores: bigint[] } export interface EnclaveEventData {