holosphere 2.0.0-alpha5 → 2.0.0-alpha7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/cjs/holosphere.cjs +1 -1
  2. package/dist/esm/holosphere.js +1 -1
  3. package/dist/index-Bvwyvd0T.cjs +5 -0
  4. package/dist/index-Bvwyvd0T.cjs.map +1 -0
  5. package/dist/{index-BG8FStkt.cjs → index-C-IlLYlk.cjs} +2 -2
  6. package/dist/{index-BG8FStkt.cjs.map → index-C-IlLYlk.cjs.map} +1 -1
  7. package/dist/{index-Bbey4GkP.js → index-d6f4RJBM.js} +222 -116
  8. package/dist/index-d6f4RJBM.js.map +1 -0
  9. package/dist/{index-Cp3xctq8.js → index-jmTHEbR2.js} +2 -2
  10. package/dist/{index-Cp3xctq8.js.map → index-jmTHEbR2.js.map} +1 -1
  11. package/dist/{indexeddb-storage-Bjg84U5R.js → indexeddb-storage-D8kOl0oK.js} +2 -2
  12. package/dist/{indexeddb-storage-Bjg84U5R.js.map → indexeddb-storage-D8kOl0oK.js.map} +1 -1
  13. package/dist/{indexeddb-storage-BD70pN7q.cjs → indexeddb-storage-a8GipaDr.cjs} +2 -2
  14. package/dist/{indexeddb-storage-BD70pN7q.cjs.map → indexeddb-storage-a8GipaDr.cjs.map} +1 -1
  15. package/dist/{memory-storage-CD0XFayE.js → memory-storage-DBQK622V.js} +2 -2
  16. package/dist/{memory-storage-CD0XFayE.js.map → memory-storage-DBQK622V.js.map} +1 -1
  17. package/dist/{memory-storage-DmMyJtOo.cjs → memory-storage-gfRovk2O.cjs} +2 -2
  18. package/dist/{memory-storage-DmMyJtOo.cjs.map → memory-storage-gfRovk2O.cjs.map} +1 -1
  19. package/dist/{secp256k1-TcN6vWGh.cjs → secp256k1-BCAPF45D.cjs} +2 -2
  20. package/dist/{secp256k1-TcN6vWGh.cjs.map → secp256k1-BCAPF45D.cjs.map} +1 -1
  21. package/dist/{secp256k1-69sS9O-P.js → secp256k1-DYm_CMqW.js} +2 -2
  22. package/dist/{secp256k1-69sS9O-P.js.map → secp256k1-DYm_CMqW.js.map} +1 -1
  23. package/package.json +1 -1
  24. package/src/contracts/abis/Bundle.json +1438 -1435
  25. package/src/contracts/deployer.js +32 -3
  26. package/src/federation/handshake.js +13 -5
  27. package/src/index.js +9 -1
  28. package/src/storage/gun-async.js +57 -6
  29. package/src/storage/gun-auth.js +90 -31
  30. package/src/storage/gun-wrapper.js +42 -48
  31. package/src/storage/nostr-client.js +5 -2
  32. package/dist/index-Bbey4GkP.js.map +0 -1
  33. package/dist/index-hfVGRwSr.cjs +0 -5
  34. package/dist/index-hfVGRwSr.cjs.map +0 -1
@@ -361,12 +361,12 @@ async function createPersistentStorage(namespace, options = {}) {
361
361
  const isBrowser = typeof window !== "undefined" && typeof window.indexedDB !== "undefined";
362
362
  typeof process !== "undefined" && process.versions && void 0;
363
363
  if (isBrowser) {
364
- const { IndexedDBStorage } = await import("./indexeddb-storage-Bjg84U5R.js");
364
+ const { IndexedDBStorage } = await import("./indexeddb-storage-D8kOl0oK.js");
365
365
  const storage = new IndexedDBStorage();
366
366
  await storage.init(namespace);
367
367
  return storage;
368
368
  } else {
369
- const { MemoryStorage } = await import("./memory-storage-CD0XFayE.js");
369
+ const { MemoryStorage } = await import("./memory-storage-DBQK622V.js");
370
370
  const storage = new MemoryStorage();
371
371
  await storage.init(namespace);
372
372
  return storage;
@@ -730,7 +730,7 @@ class NostrClient {
730
730
  */
731
731
  async _doPublish(event, options = {}) {
732
732
  const waitForRelays = options.waitForRelays || false;
733
- const signedEvent = finalizeEvent(event, this.privateKey);
733
+ const signedEvent = event.id && event.sig ? event : finalizeEvent(event, this.privateKey);
734
734
  await this._cacheEvent(signedEvent);
735
735
  if (this.outboxQueue) {
736
736
  await this.outboxQueue.enqueue(signedEvent, this.relays);
@@ -1560,16 +1560,51 @@ function gunPut(gunChain, data, timeout = 1e3) {
1560
1560
  });
1561
1561
  });
1562
1562
  }
1563
- async function gunMap(gunChain, timeout = 300) {
1563
+ async function gunMap(gunChain, timeout = 5e3) {
1564
1564
  return new Promise((resolve) => {
1565
1565
  const items = {};
1566
- gunChain.map().once((data, key) => {
1567
- if (data && !key.startsWith("_")) {
1568
- items[key] = data;
1566
+ let settled = false;
1567
+ let expectedCount = 0;
1568
+ let receivedCount = 0;
1569
+ const tryResolve = () => {
1570
+ if (settled) return;
1571
+ if (expectedCount > 0 && receivedCount >= expectedCount) {
1572
+ settled = true;
1573
+ resolve(items);
1569
1574
  }
1575
+ };
1576
+ gunChain.once((parentData) => {
1577
+ if (settled) return;
1578
+ if (!parentData) {
1579
+ settled = true;
1580
+ resolve({});
1581
+ return;
1582
+ }
1583
+ const keys = Object.keys(parentData).filter((k) => k !== "_");
1584
+ if (keys.length === 0) {
1585
+ settled = true;
1586
+ resolve({});
1587
+ return;
1588
+ }
1589
+ for (const key of keys) {
1590
+ const rawItem = parentData[key];
1591
+ if (!rawItem) continue;
1592
+ if (typeof rawItem === "object" && rawItem["#"]) continue;
1593
+ items[key] = rawItem;
1594
+ }
1595
+ expectedCount = keys.length;
1596
+ gunChain.map().once((data, key) => {
1597
+ if (settled || !data || key.startsWith("_")) return;
1598
+ items[key] = data;
1599
+ receivedCount++;
1600
+ tryResolve();
1601
+ });
1570
1602
  });
1571
1603
  setTimeout(() => {
1572
- resolve(items);
1604
+ if (!settled) {
1605
+ settled = true;
1606
+ resolve(items);
1607
+ }
1573
1608
  }, timeout);
1574
1609
  });
1575
1610
  }
@@ -1664,11 +1699,23 @@ async function read$2(gun, path) {
1664
1699
  }
1665
1700
  return data;
1666
1701
  }
1667
- async function readAll$2(gun, path) {
1702
+ async function readAll$2(gun, path, timeout = 5e3) {
1668
1703
  return new Promise((resolve) => {
1669
1704
  const output2 = /* @__PURE__ */ new Map();
1670
1705
  let settled = false;
1706
+ let expectedCount = 0;
1707
+ let receivedCount = 0;
1671
1708
  const ref = gun.get(path);
1709
+ const tryResolve = () => {
1710
+ if (settled) return;
1711
+ if (expectedCount > 0 && receivedCount >= expectedCount) {
1712
+ settled = true;
1713
+ resolve(Array.from(output2.values()));
1714
+ }
1715
+ };
1716
+ const parseItem = (data) => {
1717
+ return deserializeFromGun(data);
1718
+ };
1672
1719
  ref.once((parentData) => {
1673
1720
  if (settled) return;
1674
1721
  if (!parentData) {
@@ -1685,61 +1732,38 @@ async function readAll$2(gun, path) {
1685
1732
  for (const key of keys) {
1686
1733
  const rawItem = parentData[key];
1687
1734
  if (!rawItem) continue;
1688
- let item = null;
1689
1735
  if (typeof rawItem === "object" && rawItem["#"]) {
1690
1736
  continue;
1691
1737
  }
1692
- if (rawItem._json && typeof rawItem._json === "string") {
1693
- try {
1694
- item = JSON.parse(rawItem._json);
1695
- } catch (e) {
1696
- }
1697
- } else if (typeof rawItem === "string") {
1698
- try {
1699
- item = JSON.parse(rawItem);
1700
- } catch (e) {
1701
- }
1702
- }
1738
+ const item = parseItem(rawItem);
1703
1739
  if (item && item.id && !item._deleted) {
1704
1740
  output2.set(item.id, item);
1705
1741
  }
1706
1742
  }
1707
- if (output2.size > 0) {
1743
+ expectedCount = keys.length;
1744
+ if (expectedCount === 0) {
1708
1745
  settled = true;
1709
1746
  resolve(Array.from(output2.values()));
1710
1747
  return;
1711
1748
  }
1712
1749
  ref.map().once((data, key) => {
1713
1750
  if (settled || !data || key === "_") return;
1714
- let item = null;
1715
- if (data._json && typeof data._json === "string") {
1716
- try {
1717
- item = JSON.parse(data._json);
1718
- } catch (e) {
1719
- }
1720
- } else if (typeof data === "string") {
1721
- try {
1722
- item = JSON.parse(data);
1723
- } catch (e) {
1724
- }
1725
- }
1751
+ const item = parseItem(data);
1726
1752
  if (item && item.id && !item._deleted) {
1727
- output2.set(item.id, item);
1753
+ if (!output2.has(item.id)) {
1754
+ output2.set(item.id, item);
1755
+ }
1728
1756
  }
1757
+ receivedCount++;
1758
+ tryResolve();
1729
1759
  });
1730
- setTimeout(() => {
1731
- if (!settled) {
1732
- settled = true;
1733
- resolve(Array.from(output2.values()));
1734
- }
1735
- }, 500);
1736
1760
  });
1737
1761
  setTimeout(() => {
1738
1762
  if (!settled) {
1739
1763
  settled = true;
1740
1764
  resolve(Array.from(output2.values()));
1741
1765
  }
1742
- }, 2e3);
1766
+ }, timeout);
1743
1767
  });
1744
1768
  }
1745
1769
  async function update$2(gun, path, updates) {
@@ -2823,11 +2847,12 @@ class GunAuth {
2823
2847
  }
2824
2848
  /**
2825
2849
  * Read all data from a private lens
2850
+ * First gets count of items, then collects until count is reached
2826
2851
  * @param {string} lens - Lens name
2827
- * @param {number} timeout - Timeout in ms
2852
+ * @param {number} timeout - Timeout in ms (fallback)
2828
2853
  * @returns {Promise<Object[]>} Array of data objects
2829
2854
  */
2830
- async readAllPrivate(lens, timeout = 2e3) {
2855
+ async readAllPrivate(lens, timeout = 5e3) {
2831
2856
  if (!this.isAuthenticated()) {
2832
2857
  throw new Error("Not authenticated");
2833
2858
  }
@@ -2835,37 +2860,79 @@ class GunAuth {
2835
2860
  const results = [];
2836
2861
  const seen = /* @__PURE__ */ new Set();
2837
2862
  const ref = this.getPrivatePath(lens);
2838
- setTimeout(() => {
2839
- try {
2840
- ref.off();
2841
- } catch (e) {
2863
+ let settled = false;
2864
+ let expectedCount = 0;
2865
+ let receivedCount = 0;
2866
+ const tryResolve = () => {
2867
+ if (settled) return;
2868
+ if (expectedCount > 0 && receivedCount >= expectedCount) {
2869
+ settled = true;
2870
+ resolve(results);
2842
2871
  }
2843
- resolve(results);
2844
- }, timeout);
2845
- ref.map().once((data, key) => {
2846
- if (data && !key.startsWith("_") && !seen.has(key)) {
2847
- seen.add(key);
2848
- let parsed = null;
2849
- if (typeof data === "string") {
2850
- try {
2851
- parsed = JSON.parse(data);
2852
- } catch (e) {
2853
- parsed = data;
2854
- }
2855
- } else if (data._json && typeof data._json === "string") {
2856
- try {
2857
- parsed = JSON.parse(data._json);
2858
- } catch (e) {
2859
- }
2860
- } else if (typeof data === "object") {
2861
- parsed = { ...data };
2862
- delete parsed["_"];
2872
+ };
2873
+ const parseItem = (data) => {
2874
+ if (!data) return null;
2875
+ let parsed = null;
2876
+ if (typeof data === "string") {
2877
+ try {
2878
+ parsed = JSON.parse(data);
2879
+ } catch (e) {
2880
+ parsed = data;
2863
2881
  }
2864
- if (parsed && !parsed._deleted) {
2882
+ } else if (data._json && typeof data._json === "string") {
2883
+ try {
2884
+ parsed = JSON.parse(data._json);
2885
+ } catch (e) {
2886
+ }
2887
+ } else if (typeof data === "object") {
2888
+ parsed = { ...data };
2889
+ delete parsed["_"];
2890
+ }
2891
+ return parsed;
2892
+ };
2893
+ ref.once((parentData) => {
2894
+ if (settled) return;
2895
+ if (!parentData) {
2896
+ settled = true;
2897
+ resolve([]);
2898
+ return;
2899
+ }
2900
+ const keys = Object.keys(parentData).filter((k) => k !== "_");
2901
+ if (keys.length === 0) {
2902
+ settled = true;
2903
+ resolve([]);
2904
+ return;
2905
+ }
2906
+ for (const key of keys) {
2907
+ const rawItem = parentData[key];
2908
+ if (!rawItem) continue;
2909
+ if (typeof rawItem === "object" && rawItem["#"]) continue;
2910
+ const parsed = parseItem(rawItem);
2911
+ if (parsed && !parsed._deleted && !seen.has(key)) {
2912
+ seen.add(key);
2865
2913
  results.push(parsed);
2866
2914
  }
2867
2915
  }
2916
+ expectedCount = keys.length;
2917
+ ref.map().once((data, key) => {
2918
+ if (settled || !data || key.startsWith("_")) return;
2919
+ if (!seen.has(key)) {
2920
+ seen.add(key);
2921
+ const parsed = parseItem(data);
2922
+ if (parsed && !parsed._deleted) {
2923
+ results.push(parsed);
2924
+ }
2925
+ }
2926
+ receivedCount++;
2927
+ tryResolve();
2928
+ });
2868
2929
  });
2930
+ setTimeout(() => {
2931
+ if (!settled) {
2932
+ settled = true;
2933
+ resolve(results);
2934
+ }
2935
+ }, timeout);
2869
2936
  });
2870
2937
  }
2871
2938
  /**
@@ -3562,7 +3629,7 @@ class GunDBBackend extends StorageBackend {
3562
3629
  }
3563
3630
  }
3564
3631
  const name = "holosphere";
3565
- const version$1 = "2.0.0-alpha5";
3632
+ const version$1 = "2.0.0-alpha7";
3566
3633
  const description = "Holonic geospatial communication infrastructure combining H3 hexagonal indexing with distributed P2P storage";
3567
3634
  const type = "module";
3568
3635
  const bin = {
@@ -5459,7 +5526,7 @@ const sha256 = sha256$1;
5459
5526
  let secp256k1 = null;
5460
5527
  async function loadCrypto() {
5461
5528
  if (!secp256k1) {
5462
- const module2 = await import("./secp256k1-69sS9O-P.js");
5529
+ const module2 = await import("./secp256k1-DYm_CMqW.js");
5463
5530
  secp256k1 = module2.secp256k1;
5464
5531
  }
5465
5532
  return secp256k1;
@@ -6674,8 +6741,8 @@ async function initiateFederationHandshake(holosphere, privateKey, params) {
6674
6741
  message
6675
6742
  } = params;
6676
6743
  try {
6677
- const { getPublicKeyFromPrivate } = await Promise.resolve().then(() => nostrUtils);
6678
- const senderPubKey = getPublicKeyFromPrivate(privateKey);
6744
+ const { getPublicKey: getPublicKey2 } = await Promise.resolve().then(() => nostrUtils);
6745
+ const senderPubKey = getPublicKey2(privateKey);
6679
6746
  const request = createFederationRequest({
6680
6747
  senderHolonId: holonId,
6681
6748
  senderHolonName: holonName,
@@ -6710,8 +6777,8 @@ async function acceptFederationRequest$1(holosphere, privateKey, params) {
6710
6777
  message
6711
6778
  } = params;
6712
6779
  try {
6713
- const { getPublicKeyFromPrivate } = await Promise.resolve().then(() => nostrUtils);
6714
- const responderPubKey = getPublicKeyFromPrivate(privateKey);
6780
+ const { getPublicKey: getPublicKey2 } = await Promise.resolve().then(() => nostrUtils);
6781
+ const responderPubKey = getPublicKey2(privateKey);
6715
6782
  if (holosphere.client) {
6716
6783
  await addFederatedPartner(holosphere.client, holosphere.config.appName, senderPubKey, {
6717
6784
  alias: request.senderHolonName,
@@ -6723,6 +6790,10 @@ async function acceptFederationRequest$1(holosphere, privateKey, params) {
6723
6790
  }
6724
6791
  }
6725
6792
  }
6793
+ await holosphere.federateHolon(holonId, senderPubKey, {
6794
+ lensConfig,
6795
+ partnerName: request.senderHolonName
6796
+ });
6726
6797
  const response = createFederationResponse({
6727
6798
  requestId: request.requestId,
6728
6799
  status: "accepted",
@@ -17089,7 +17160,7 @@ class ChainManager {
17089
17160
  */
17090
17161
  async _loadEthers() {
17091
17162
  if (!this.ethers) {
17092
- const ethersModule = await import("./index-Cp3xctq8.js");
17163
+ const ethersModule = await import("./index-jmTHEbR2.js");
17093
17164
  this.ethers = ethersModule;
17094
17165
  }
17095
17166
  return this.ethers;
@@ -17273,11 +17344,11 @@ class ChainManager {
17273
17344
  * @param {boolean} [useSigner=true] - Use signer for write operations
17274
17345
  * @returns {Contract}
17275
17346
  */
17276
- async getContract(address, abi, useSigner = true) {
17347
+ async getContract(address, abi2, useSigner = true) {
17277
17348
  this._requireInitialized();
17278
17349
  const ethers = await this._loadEthers();
17279
17350
  const signerOrProvider = useSigner && this.signer ? this.signer : this.provider;
17280
- return new ethers.Contract(address, abi, signerOrProvider);
17351
+ return new ethers.Contract(address, abi2, signerOrProvider);
17281
17352
  }
17282
17353
  /**
17283
17354
  * Deploy a contract
@@ -17286,13 +17357,13 @@ class ChainManager {
17286
17357
  * @param {Array} [constructorArgs=[]] - Constructor arguments
17287
17358
  * @returns {Promise<{contract, address, deployTx}>}
17288
17359
  */
17289
- async deployContract(abi, bytecode, constructorArgs = []) {
17360
+ async deployContract(abi2, bytecode2, constructorArgs = []) {
17290
17361
  this._requireInitialized();
17291
17362
  if (!this.signer) {
17292
17363
  throw new Error("Signer required for contract deployment");
17293
17364
  }
17294
17365
  const ethers = await this._loadEthers();
17295
- const factory = new ethers.ContractFactory(abi, bytecode, this.signer);
17366
+ const factory = new ethers.ContractFactory(abi2, bytecode2, this.signer);
17296
17367
  const contract = await factory.deploy(...constructorArgs);
17297
17368
  await contract.waitForDeployment();
17298
17369
  const address = await contract.getAddress();
@@ -23011,7 +23082,7 @@ const AppreciativeABI = [
23011
23082
  anonymous: false
23012
23083
  }
23013
23084
  ];
23014
- const BundleABI = [
23085
+ const abi = [
23015
23086
  {
23016
23087
  type: "constructor",
23017
23088
  inputs: [
@@ -24446,6 +24517,11 @@ const BundleABI = [
24446
24517
  ]
24447
24518
  }
24448
24519
  ];
24520
+ const bytecode = "0x60806040526040518060400160405280600681526020017f42756e646c650000000000000000000000000000000000000000000000000000815250600290816200004a9190620006da565b5034801562000057575f80fd5b5060405162007e0338038062007e0383398181016040528101906200007d9190620009a6565b60015f819055505f821180156200009b5750670de0b6b3a764000082105b620000dd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000d49062000ac6565b60405180910390fd5b8460035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503360055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260019081620001ae9190620006da565b5081601381905550806014819055506001600985604051620001d1919062000b26565b90815260200160405180910390205f6101000a81548160ff021916908315150217905550600684908060018154018082558091505060019003905f5260205f20015f909190919091509081620002289190620006da565b50620002396200024460201b60201c565b505050505062000d3a565b60185f620002539190620003e9565b600160145462000264919062000b6b565b67ffffffffffffffff81111562000280576200027f62000480565b5b604051908082528060200260200182016040528015620002af5781602001602082028036833780820191505090505b5060189080519060200190620002c792919062000409565b505f6019819055505f670de0b6b3a764000090505f5b60145481116200037b578160188281548110620002ff57620002fe62000ba5565b5b905f5260205f2001819055508160155f8381526020019081526020015f20805490506200032d919062000bd2565b60195f8282546200033f919062000b6b565b925050819055506200036382601354670de0b6b3a76400006200037f60201b60201c565b91508080620003729062000c1c565b915050620002dd565b5050565b5f808211620003c5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003bc9062000cb6565b60405180910390fd5b818385620003d4919062000bd2565b620003e0919062000d03565b90509392505050565b5080545f8255905f5260205f209081019062000406919062000459565b50565b828054828255905f5260205f2090810192821562000446579160200282015b828111156200044557825182559160200191906001019062000428565b5b50905062000455919062000459565b5090565b5b8082111562000472575f815f9055506001016200045a565b5090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620004f257607f821691505b602082108103620005085762000507620004ad565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200056c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200052f565b6200057886836200052f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620005c2620005bc620005b68462000590565b62000599565b62000590565b9050919050565b5f819050919050565b620005dd83620005a2565b620005f5620005ec82620005c9565b8484546200053b565b825550505050565b5f90565b6200060b620005fd565b62000618818484620005d2565b505050565b5b818110156200063f57620006335f8262000601565b6001810190506200061e565b5050565b601f8211156200068e5762000658816200050e565b620006638462000520565b8101602085101562000673578190505b6200068b620006828562000520565b8301826200061d565b50505b505050565b5f82821c905092915050565b5f620006b05f198460080262000693565b1980831691505092915050565b5f620006ca83836200069f565b9150826002028217905092915050565b620006e58262000476565b67ffffffffffffffff81111562000701576200070062000480565b5b6200070d8254620004da565b6200071a82828562000643565b5f60209050601f83116001811462000750575f84156200073b578287015190505b620007478582620006bd565b865550620007b6565b601f19841662000760866200050e565b5f5b82811015620007895784890151825560018201915060208501945060208101905062000762565b86831015620007a95784890151620007a5601f8916826200069f565b8355505b6001600288020188555050505b505050505050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620007fa82620007cf565b9050919050565b6200080c81620007ee565b811462000817575f80fd5b50565b5f815190506200082a8162000801565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b620008538262000838565b810181811067ffffffffffffffff8211171562000875576200087462000480565b5b80604052505050565b5f62000889620007be565b905062000897828262000848565b919050565b5f67ffffffffffffffff821115620008b957620008b862000480565b5b620008c48262000838565b9050602081019050919050565b5f5b83811015620008f0578082015181840152602081019050620008d3565b5f8484015250505050565b5f620009116200090b846200089c565b6200087e565b90508281526020810184848401111562000930576200092f62000834565b5b6200093d848285620008d1565b509392505050565b5f82601f8301126200095c576200095b62000830565b5b81516200096e848260208601620008fb565b91505092915050565b620009828162000590565b81146200098d575f80fd5b50565b5f81519050620009a08162000977565b92915050565b5f805f805f60a08688031215620009c257620009c1620007c7565b5b5f620009d1888289016200081a565b955050602086015167ffffffffffffffff811115620009f557620009f4620007cb565b5b62000a038882890162000945565b945050604086015167ffffffffffffffff81111562000a275762000a26620007cb565b5b62000a358882890162000945565b935050606062000a488882890162000990565b925050608062000a5b8882890162000990565b9150509295509295909350565b5f82825260208201905092915050565b7f53746565706e657373206d7573742062652030203c2073203c203165313800005f82015250565b5f62000aae601e8362000a68565b915062000abb8262000a78565b602082019050919050565b5f6020820190508181035f83015262000adf8162000aa0565b9050919050565b5f81905092915050565b5f62000afc8262000476565b62000b08818562000ae6565b935062000b1a818560208601620008d1565b80840191505092915050565b5f62000b33828462000af0565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62000b778262000590565b915062000b848362000590565b925082820190508082111562000b9f5762000b9e62000b3e565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f62000bde8262000590565b915062000beb8362000590565b925082820262000bfb8162000590565b9150828204841483151762000c155762000c1462000b3e565b5b5092915050565b5f62000c288262000590565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362000c5d5762000c5c62000b3e565b5b600182019050919050565b7f4469766973696f6e206279207a65726f000000000000000000000000000000005f82015250565b5f62000c9e60108362000a68565b915062000cab8262000c68565b602082019050919050565b5f6020820190508181035f83015262000ccf8162000c90565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f62000d0f8262000590565b915062000d1c8362000590565b92508262000d2f5762000d2e62000cd6565b5b828204905092915050565b6170bb8062000d485f395ff3fe608060405260043610610338575f3560e01c806377e7fca2116101aa578063c21be6ae116100f6578063dad4ae3711610094578063e1f1c4a71161006e578063e1f1c4a714610ca5578063e8d5940d14610ccf578063ead6252014610cf7578063f59e4f6514610d3357610349565b8063dad4ae3714610c03578063de8fa43114610c3f578063e15b3f5f14610c6957610349565b8063cafa4ffa116100d0578063cafa4ffa14610b4b578063cc18494814610b75578063d118a53f14610bb1578063d7841a1c14610bdb57610349565b8063c21be6ae14610aa9578063c45a015514610ae5578063ca22431314610b0f57610349565b8063873010d911610163578063918f96871161013d578063918f9687146109e1578063981a63dc14610a09578063b801603514610a45578063b99ef1fa14610a6d57610349565b8063873010d91461095157806387563ec11461098d5780638da5cb5b146109b757610349565b806377e7fca2146108355780637a3c22eb1461085f5780637b0a7e33146108875780637c59dd5f146108c35780637ed628bb146108ff578063804d74701461092957610349565b806339bfeae31161028457806357a32534116102225780636a146024116101fc5780636a1460241461078f5780636bd39c52146107b95780636cc6837e146107e35780636d2687c0146107f957610349565b806357a325341461071557806360a1da831461075157806362d73eb81461077957610349565b80634635fd681161025e5780634635fd681461064b57806351599b151461068757806353055481146106c35780635744426e146106ff57610349565b806339bfeae3146105ab578063404880d9146105e7578063441179e51461062357610349565b806321670f22116102f15780633477ee2e116102cb5780633477ee2e146104e3578063363454ee1461051f578063372c3e7c1461055b57806338eccabd1461058357610349565b806321670f221461046157806328c317d71461047d57806333d6e65f146104b957610349565b806302d05d3f1461035557806306a49fce1461037f57806306fdde03146103a957806312feb905146103d35780631821fcab146103fd5780631a2f4ee51461043957610349565b36610349576103475f34610d5d565b005b6103535f34610d5d565b005b348015610360575f80fd5b50610369611149565b604051610376919061509c565b60405180910390f35b34801561038a575f80fd5b5061039361116e565b6040516103a091906151fa565b60405180910390f35b3480156103b4575f80fd5b506103bd611242565b6040516103ca9190615262565b60405180910390f35b3480156103de575f80fd5b506103e76112ce565b6040516103f491906151fa565b60405180910390f35b348015610408575f80fd5b50610423600480360381019061041e91906153bf565b6113a2565b604051610430919061541e565b60405180910390f35b348015610444575f80fd5b5061045f600480360381019061045a9190615461565b6113cf565b005b61047b600480360381019061047691906154c9565b610d5d565b005b348015610488575f80fd5b506104a3600480360381019061049e91906153bf565b6114f8565b6040516104b091906155be565b60405180910390f35b3480156104c4575f80fd5b506104cd6115a1565b6040516104da919061541e565b60405180910390f35b3480156104ee575f80fd5b50610509600480360381019061050491906155de565b6115a7565b6040516105169190615262565b60405180910390f35b34801561052a575f80fd5b50610545600480360381019061054091906153bf565b61164d565b6040516105529190615623565b60405180910390f35b348015610566575f80fd5b50610581600480360381019061057c91906155de565b611682565b005b34801561058e575f80fd5b506105a960048036038101906105a491906153bf565b611723565b005b3480156105b6575f80fd5b506105d160048036038101906105cc91906153bf565b61189c565b6040516105de9190615623565b60405180910390f35b3480156105f2575f80fd5b5061060d600480360381019061060891906153bf565b6118d1565b60405161061a9190615623565b60405180910390f35b34801561062e575f80fd5b506106496004803603810190610644919061563c565b611906565b005b348015610656575f80fd5b50610671600480360381019061066c91906155de565b611c2b565b60405161067e9190615262565b60405180910390f35b348015610692575f80fd5b506106ad60048036038101906106a891906153bf565b611cd1565b6040516106ba9190615623565b60405180910390f35b3480156106ce575f80fd5b506106e960048036038101906106e49190615696565b611d06565b6040516106f6919061541e565b60405180910390f35b34801561070a575f80fd5b50610713611d1b565b005b348015610720575f80fd5b5061073b600480360381019061073691906153bf565b611e3f565b604051610748919061541e565b60405180910390f35b34801561075c575f80fd5b50610777600480360381019061077291906156c1565b611e6c565b005b348015610784575f80fd5b5061078d612201565b005b34801561079a575f80fd5b506107a361245e565b6040516107b0919061541e565b60405180910390f35b3480156107c4575f80fd5b506107cd61246a565b6040516107da919061541e565b60405180910390f35b3480156107ee575f80fd5b506107f7612470565b005b348015610804575f80fd5b5061081f600480360381019061081a91906155de565b612987565b60405161082c9190615262565b60405180910390f35b348015610840575f80fd5b50610849612a2d565b604051610856919061541e565b60405180910390f35b34801561086a575f80fd5b50610885600480360381019061088091906153bf565b612a33565b005b348015610892575f80fd5b506108ad60048036038101906108a891906155de565b612c87565b6040516108ba91906151fa565b60405180910390f35b3480156108ce575f80fd5b506108e960048036038101906108e491906153bf565b612d6c565b6040516108f69190615623565b60405180910390f35b34801561090a575f80fd5b50610913612da1565b6040516109209190615623565b60405180910390f35b348015610934575f80fd5b5061094f600480360381019061094a91906157fd565b612db3565b005b34801561095c575f80fd5b50610977600480360381019061097291906155de565b612fac565b604051610984919061541e565b60405180910390f35b348015610998575f80fd5b506109a1612fcc565b6040516109ae919061541e565b60405180910390f35b3480156109c2575f80fd5b506109cb612fd2565b6040516109d8919061509c565b60405180910390f35b3480156109ec575f80fd5b50610a076004803603810190610a0291906153bf565b612ff7565b005b348015610a14575f80fd5b50610a2f6004803603810190610a2a91906153bf565b6131ab565b604051610a3c9190615262565b60405180910390f35b348015610a50575f80fd5b50610a6b6004803603810190610a669190615904565b61325e565b005b348015610a78575f80fd5b50610a936004803603810190610a8e91906153bf565b61368c565b604051610aa0919061541e565b60405180910390f35b348015610ab4575f80fd5b50610acf6004803603810190610aca91906153bf565b6136b9565b604051610adc919061509c565b60405180910390f35b348015610af0575f80fd5b50610af9613701565b604051610b06919061509c565b60405180910390f35b348015610b1a575f80fd5b50610b356004803603810190610b3091906156c1565b613726565b604051610b42919061541e565b60405180910390f35b348015610b56575f80fd5b50610b5f61375e565b604051610b6c919061541e565b60405180910390f35b348015610b80575f80fd5b50610b9b6004803603810190610b96919061563c565b613764565b604051610ba8919061509c565b60405180910390f35b348015610bbc575f80fd5b50610bc56137c4565b604051610bd29190615a31565b60405180910390f35b348015610be6575f80fd5b50610c016004803603810190610bfc91906155de565b61381a565b005b348015610c0e575f80fd5b50610c296004803603810190610c2491906153bf565b613947565b604051610c369190615623565b60405180910390f35b348015610c4a575f80fd5b50610c5361397c565b604051610c60919061541e565b60405180910390f35b348015610c74575f80fd5b50610c8f6004803603810190610c8a91906153bf565b613988565b604051610c9c919061541e565b60405180910390f35b348015610cb0575f80fd5b50610cb96139b5565b604051610cc6919061541e565b60405180910390f35b348015610cda575f80fd5b50610cf56004803603810190610cf09190615a51565b6139bb565b005b348015610d02575f80fd5b50610d1d6004803603810190610d189190615461565b613ca9565b604051610d2a9190615262565b60405180910390f35b348015610d3e575f80fd5b50610d47613d5a565b604051610d549190615262565b60405180910390f35b610d65613de6565b5f8034118015610da057505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b90505f8115610e18573492503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167f37de26b9f29dba736fb8291dad9ace7d2f6dc76e3e5faaeca097145b5298f94b5f86604051610e0b929190615ac7565b60405180910390a3610f8a565b8390505f600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20548273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e93919061509c565b602060405180830381865afa158015610eae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed29190615b02565b610edc9190615b5a565b905083811015610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1890615bd7565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167f37de26b9f29dba736fb8291dad9ace7d2f6dc76e3e5faaeca097145b5298f94b8787604051610f80929190615ac7565b60405180910390a3505b5f610f9a84600e54612710613e2a565b90505f8185610fa99190615b5a565b90505f8083118015610fbf57505f601080549050115b15610fde57610fd087848787613e8d565b81610fdb9190615bf5565b90505b5f82118015610fee57505f601954115b1561100d57610fff87838787613fb6565b8161100a9190615bf5565b90505b3073ffffffffffffffffffffffffffffffffffffffff167fd83308e9158842b2115ec5e6f6395db42fff24e4b5506ef42fe33854fafad655878388611087576040518060400160405280600581526020017f45524332300000000000000000000000000000000000000000000000000000008152506110be565b6040518060400160405280600381526020017f45544800000000000000000000000000000000000000000000000000000000008152505b6040516110cd93929190615c28565b60405180910390a23073ffffffffffffffffffffffffffffffffffffffff167fc2d2b959adca67349f750fed9ef9eaefbec59f24fa563c7fa410157130395c4060018761111a578961111c565b5f5b89855f604051611130959493929190615d96565b60405180910390a25050505050611145614184565b5050565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060601b805480602002602001604051908101604052809291908181526020015f905b82821015611239578382905f5260205f200180546111ae90615c91565b80601f01602080910402602001604051908101604052809291908181526020018280546111da90615c91565b80156112255780601f106111fc57610100808354040283529160200191611225565b820191905f5260205f20905b81548152906001019060200180831161120857829003601f168201915b505050505081526020019060010190611191565b50505050905090565b6001805461124f90615c91565b80601f016020809104026020016040519081016040528092919081815260200182805461127b90615c91565b80156112c65780601f1061129d576101008083540402835291602001916112c6565b820191905f5260205f20905b8154815290600101906020018083116112a957829003601f168201915b505050505081565b60606010805480602002602001604051908101604052809291908181526020015f905b82821015611399578382905f5260205f2001805461130e90615c91565b80601f016020809104026020016040519081016040528092919081815260200182805461133a90615c91565b80156113855780601f1061135c57610100808354040283529160200191611385565b820191905f5260205f20905b81548152906001019060200180831161136857829003601f168201915b5050505050815260200190600101906112f1565b50505050905090565b6016818051602081018201805184825260208301602085012081835280955050505050505f915090505481565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461145e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145590615e38565b60405180910390fd5b612710818361146d9190615bf5565b146114ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a490615ea0565b60405180910390fd5b81600e8190555080600f819055507f29dd4a83e71eab2a472a8bb7a7bb9467395098acb48b07c8d9ea7294de0ba0ae82826040516114ec929190615ebe565b60405180910390a15050565b6060600c8260405161150a9190615f1f565b908152602001604051809103902080548060200260200160405190810160405280929190818152602001828054801561159557602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161154c575b50505050509050919050565b60145481565b601b81815481106115b6575f80fd5b905f5260205f20015f9150905080546115ce90615c91565b80601f01602080910402602001604051908101604052809291908181526020018280546115fa90615c91565b80156116455780601f1061161c57610100808354040283529160200191611645565b820191905f5260205f20905b81548152906001019060200180831161162857829003601f168201915b505050505081565b6008818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900460ff1681565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170890615e38565b60405180910390fd5b8060148190555061172061418d565b50565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a990615e38565b60405180910390fd5b6017816040516117c29190615f1f565b90815260200160405180910390205f9054906101000a900460ff1661181c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181390615f7f565b60405180910390fd5b611825816142ab565b5f6017826040516118369190615f1f565b90815260200160405180910390205f6101000a81548160ff02191690831515021790555061186261418d565b7fe6db474363a3116f4cf525fc0d78d9dd53e214383db31efef8368f08c4bf7991816040516118919190615262565b60405180910390a150565b601e818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900460ff1681565b6009818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900460ff1681565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198c90615e38565b60405180910390fd5b6009826040516119a59190615f1f565b90815260200160405180910390205f9054906101000a900460ff166119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f690615fe7565b60405180910390fd5b601454811115611a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3b9061604f565b60405180910390fd5b5f601783604051611a559190615f1f565b90815260200160405180910390205f9054906101000a900460ff16611a9a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611aba565b601683604051611aaa9190615f1f565b9081526020016040518091039020545b9050601783604051611acc9190615f1f565b90815260200160405180910390205f9054906101000a900460ff1615611af657611af5836142ab565b5b81601684604051611b079190615f1f565b90815260200160405180910390208190555060155f8381526020019081526020015f2083908060018154018082558091505060019003905f5260205f20015f909190919091509081611b5991906161ef565b506001601784604051611b6c9190615f1f565b90815260200160405180910390205f6101000a81548160ff021916908315150217905550611b9861418d565b7f9bca84993827a6bd2bc824f45db9e0ae931cf1f7b1706b7c735ba0102300b4ca8383604051611bc99291906162be565b60405180910390a13073ffffffffffffffffffffffffffffffffffffffff167f7d482c93a88a92e4d27ba697265785162f607bc0ac6c55b868232b3ba3fbb63d6001858486604051611c1e94939291906162ec565b60405180910390a2505050565b60068181548110611c3a575f80fd5b905f5260205f20015f915090508054611c5290615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054611c7e90615c91565b8015611cc95780601f10611ca057610100808354040283529160200191611cc9565b820191905f5260205f20905b815481529060010190602001808311611cac57829003601f168201915b505050505081565b601c818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900460ff1681565b600d602052805f5260405f205f915090505481565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da190615e38565b60405180910390fd5b601a5f9054906101000a900460ff16611df8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611def90616387565b60405180910390fd5b5f601a5f6101000a81548160ff0219169083151502179055507f990bb31515adefe5ecd88a4dca3e9772b32d484c81e22cae38d5482e0d9f35e460405160405180910390a1565b600a818051602081018201805184825260208301602085012081835280955050505050505f915090505481565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef290615e38565b60405180910390fd5b611f03613de6565b600882604051611f139190615f1f565b90815260200160405180910390205f9054906101000a900460ff1615611f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f65906163ef565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd390616457565b60405180910390fd5b600982604051611fec9190615f1f565b90815260200160405180910390205f9054906101000a900460ff16612046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203d906164bf565b60405180910390fd5b5f600a836040516120579190615f1f565b9081526020016040518091039020549050600160088460405161207a9190615f1f565b90815260200160405180910390205f6101000a81548160ff0219169083151502179055505f73ffffffffffffffffffffffffffffffffffffffff166007846040516120c59190615f1f565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361216b578160078460405161211f9190615f1f565b90815260200160405180910390205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b61217583836143c9565b61217f83836144c5565b5f8111156121f4578173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167f605614956ef211f270ab0b08a13dd69698dc38d70e20899e1051ae2e1ae6cd5b6001865f866040516121eb94939291906164dd565b60405180910390a35b506121fd614184565b5050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228790615e38565b60405180910390fd5b5f5b601b80549050811015612340575f601d601b83815481106122b6576122b561652e565b5b905f5260205f20016040516122cb91906165db565b9081526020016040518091039020819055505f601c601b83815481106122f4576122f361652e565b5b905f5260205f200160405161230991906165db565b90815260200160405180910390205f6101000a81548160ff0219169083151502179055508080612338906165f1565b915050612292565b50601b5f61234e9190614f5b565b5f5b600680549050811015612415575f601e600683815481106123745761237361652e565b5b905f5260205f200160405161238991906165db565b90815260200160405180910390205f6101000a81548160ff02191690831515021790555060405180602001604052805f815250601f600683815481106123d2576123d161652e565b5b905f5260205f20016040516123e791906165db565b9081526020016040518091039020908161240191906161ef565b50808061240d906165f1565b915050612350565b506001601a5f6101000a81548160ff0219169083151502179055507fc475c26aa25ed8e85a7faa790e5f63b5d7ee1025f12821f4c9bfddd36ab4d11260405160405180910390a1565b670de0b6b3a764000081565b600e5481565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f690615e38565b60405180910390fd5b601a5f9054906101000a900460ff1661254d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254490616387565b60405180910390fd5b5f601b8054905011612594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258b90616682565b60405180910390fd5b5f601b5f815481106125a9576125a861652e565b5b905f5260205f200180546125bc90615c91565b80601f01602080910402602001604051908101604052809291908181526020018280546125e890615c91565b80156126335780601f1061260a57610100808354040283529160200191612633565b820191905f5260205f20905b81548152906001019060200180831161261657829003601f168201915b505050505090505f601d601b5f815481106126515761265061652e565b5b905f5260205f200160405161266691906165db565b90815260200160405180910390205490505f600190505b601b805490508110156127c05781601d601b83815481106126a1576126a061652e565b5b905f5260205f20016040516126b691906165db565b90815260200160405180910390205411156127ad57601d601b82815481106126e1576126e061652e565b5b905f5260205f20016040516126f691906165db565b9081526020016040518091039020549150601b818154811061271b5761271a61652e565b5b905f5260205f2001805461272e90615c91565b80601f016020809104026020016040519081016040528092919081815260200182805461275a90615c91565b80156127a55780601f1061277c576101008083540402835291602001916127a5565b820191905f5260205f20905b81548152906001019060200180831161278857829003601f168201915b505050505092505b80806127b8906165f1565b91505061267d565b505f6007836040516127d29190615f1f565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286790616710565b60405180910390fd5b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f601a5f6101000a81548160ff0219169083151502179055507f5e99cd5235d5c8c4f0f8dc2626c83130cf843047e4ecbe4c111076e2b31a0d52848460405161291f9291906162be565b60405180910390a18173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350505050565b60108181548110612996575f80fd5b905f5260205f20015f9150905080546129ae90615c91565b80601f01602080910402602001604051908101604052809291908181526020018280546129da90615c91565b8015612a255780601f106129fc57610100808354040283529160200191612a25565b820191905f5260205f20905b815481529060010190602001808311612a0857829003601f168201915b505050505081565b600f5481565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab990615e38565b60405180910390fd5b601a5f9054906101000a900460ff16612b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0790616387565b60405180910390fd5b600981604051612b209190615f1f565b90815260200160405180910390205f9054906101000a900460ff16612b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7190616778565b60405180910390fd5b601c81604051612b8a9190615f1f565b90815260200160405180910390205f9054906101000a900460ff1615612be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdc906167e0565b60405180910390fd5b601b81908060018154018082558091505060019003905f5260205f20015f909190919091509081612c1691906161ef565b506001601c82604051612c299190615f1f565b90815260200160405180910390205f6101000a81548160ff0219169083151502179055507f134c877b5bd4770ffc56867fc5d2c549dd813a5db276d378f8d855a04fc7aa1d81604051612c7c9190615262565b60405180910390a150565b606060155f8381526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b82821015612d61578382905f5260205f20018054612cd690615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054612d0290615c91565b8015612d4d5780601f10612d2457610100808354040283529160200191612d4d565b820191905f5260205f20905b815481529060010190602001808311612d3057829003601f168201915b505050505081526020019060010190612cb9565b505050509050919050565b6011818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900460ff1681565b601a5f9054906101000a900460ff1681565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3990615e38565b60405180910390fd5b5f5b8151811015612fa8575f828281518110612e6157612e6061652e565b5b60200260200101519050600981604051612e7b9190615f1f565b90815260200160405180910390205f9054906101000a900460ff1615612ea15750612f95565b6001600982604051612eb39190615f1f565b90815260200160405180910390205f6101000a81548160ff021916908315150217905550600681908060018154018082558091505060019003905f5260205f20015f909190919091509081612f0891906161ef565b507fdfaa3c24567cbffbf024ddfd8dfca7a224b307e94b0df5437facad0f2fea2f9b81604051612f389190615262565b60405180910390a13073ffffffffffffffffffffffffffffffffffffffff167f954917c11fc57299ff064c483b4113756221231fcea3a1a3aa54ebd605a9c1e860018333604051612f8b939291906167fe565b60405180910390a2505b8080612fa0906165f1565b915050612e44565b5050565b60188181548110612fbb575f80fd5b905f5260205f20015f915090505481565b60135481565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307d90615e38565b60405180910390fd5b6009816040516130969190615f1f565b90815260200160405180910390205f9054906101000a900460ff166131a85760016009826040516130c79190615f1f565b90815260200160405180910390205f6101000a81548160ff021916908315150217905550600681908060018154018082558091505060019003905f5260205f20015f90919091909150908161311c91906161ef565b507fdfaa3c24567cbffbf024ddfd8dfca7a224b307e94b0df5437facad0f2fea2f9b8160405161314c9190615262565b60405180910390a13073ffffffffffffffffffffffffffffffffffffffff167f954917c11fc57299ff064c483b4113756221231fcea3a1a3aa54ebd605a9c1e86001833360405161319f939291906167fe565b60405180910390a25b50565b601f818051602081018201805184825260208301602085012081835280955050505050505f9150905080546131df90615c91565b80601f016020809104026020016040519081016040528092919081815260200182805461320b90615c91565b80156132565780601f1061322d57610100808354040283529160200191613256565b820191905f5260205f20905b81548152906001019060200180831161323957829003601f168201915b505050505081565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146132ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e490615e38565b60405180910390fd5b8051825114613331576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133289061688b565b60405180910390fd5b5f5b6010805490508110156133e1575f6012601083815481106133575761335661652e565b5b905f5260205f200160405161336c91906165db565b9081526020016040518091039020819055505f6011601083815481106133955761339461652e565b5b905f5260205f20016040516133aa91906165db565b90815260200160405180910390205f6101000a81548160ff02191690831515021790555080806133d9906165f1565b915050613333565b5060105f6133ef9190614f5b565b5f805b83518110156136095760098482815181106134105761340f61652e565b5b60200260200101516040516134259190615f1f565b90815260200160405180910390205f9054906101000a900460ff1661347f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613476906168f3565b60405180910390fd5b5f8382815181106134935761349261652e565b5b6020026020010151116134db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d29061695b565b60405180910390fd5b60108482815181106134f0576134ef61652e565b5b6020026020010151908060018154018082558091505060019003905f5260205f20015f90919091909150908161352691906161ef565b506001601185838151811061353e5761353d61652e565b5b60200260200101516040516135539190615f1f565b90815260200160405180910390205f6101000a81548160ff02191690831515021790555082818151811061358a5761358961652e565b5b602002602001015160128583815181106135a7576135a661652e565b5b60200260200101516040516135bc9190615f1f565b9081526020016040518091039020819055508281815181106135e1576135e061652e565b5b6020026020010151826135f49190615bf5565b91508080613601906165f1565b9150506133f2565b50612710811461364e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613645906169c3565b60405180910390fd5b7f7749ddba77d660c1351ff548a0bf5b09743d6ad44914e3cb9a29a1f805fb09fe838360405161367f9291906169e1565b60405180910390a1505050565b601d818051602081018201805184825260208301602085012081835280955050505050505f915090505481565b6007818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b82805160208101820180518482526020830160208501208183528095505050505050602052805f5260405f205f91509150505481565b60195481565b600c828051602081018201805184825260208301602085012081835280955050505050508181548110613795575f80fd5b905f5260205f20015f915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060601880548060200260200160405190810160405280929190818152602001828054801561381057602002820191905f5260205f20905b8154815260200190600101908083116137fc575b5050505050905090565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146138a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138a090615e38565b60405180910390fd5b5f811180156138bf5750670de0b6b3a764000081105b6138fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138f590616a60565b60405180910390fd5b8060138190555061390d61418d565b7f5fad7fda6b8fb652ca59780d340772fed3852ba698b3a4cd40ebc117b8ec57508160405161393c919061541e565b60405180910390a150565b6017818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900460ff1681565b5f600680549050905090565b6012818051602081018201805184825260208301602085012081835280955050505050505f915090505481565b61271081565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a4190615e38565b60405180910390fd5b601a5f9054906101000a900460ff16613a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8f90616387565b60405180910390fd5b600982604051613aa89190615f1f565b90815260200160405180910390205f9054906101000a900460ff16613b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613af990616ac8565b60405180910390fd5b601c81604051613b129190615f1f565b90815260200160405180910390205f9054906101000a900460ff16613b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b6390616b30565b60405180910390fd5b601e82604051613b7c9190615f1f565b90815260200160405180910390205f9054906101000a900460ff1615613bd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bce90616b98565b60405180910390fd5b6001601e83604051613be99190615f1f565b90815260200160405180910390205f6101000a81548160ff02191690831515021790555080601f83604051613c1e9190615f1f565b90815260200160405180910390209081613c3891906161ef565b50601d81604051613c499190615f1f565b90815260200160405180910390205f815480929190613c67906165f1565b91905055507f137ad23732468494166ec34d1367743690ffa17f6ceac8429cba8fc35d088b6e8282604051613c9d929190616bb6565b60405180910390a15050565b6015602052815f5260405f208181548110613cc2575f80fd5b905f5260205f20015f91509150508054613cdb90615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054613d0790615c91565b8015613d525780601f10613d2957610100808354040283529160200191613d52565b820191905f5260205f20905b815481529060010190602001808311613d3557829003601f168201915b505050505081565b60028054613d6790615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054613d9390615c91565b8015613dde5780601f10613db557610100808354040283529160200191613dde565b820191905f5260205f20905b815481529060010190602001808311613dc157829003601f168201915b505050505081565b60025f5403613e21576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f81905550565b5f808211613e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e6490616c35565b60405180910390fd5b818385613e7a9190616c53565b613e849190616cc1565b90509392505050565b5f805f90505b601080549050811015613fad575f60108281548110613eb557613eb461652e565b5b905f5260205f20018054613ec890615c91565b80601f0160208091040260200160405190810160405280929190818152602001828054613ef490615c91565b8015613f3f5780601f10613f1657610100808354040283529160200191613f3f565b820191905f5260205f20905b815481529060010190602001808311613f2257829003601f168201915b505050505090505f613f7287601284604051613f5b9190615f1f565b908152602001604051809103902054612710613e2a565b90505f811115613f9857613f898289838989614737565b8380613f94906165f1565b9450505b50508080613fa5906165f1565b915050613e93565b50949350505050565b5f805f90505b601454811161417b575f60155f8381526020019081526020015f208054905090505f8103613fea5750614168565b5f60188381548110613fff57613ffe61652e565b5b905f5260205f200154826140139190616c53565b90505f6140238883601954613e2a565b90505f83826140329190616cc1565b90505f805b85811015614161575f60018761404d9190615b5a565b820361406657828561405f9190615b5a565b9050614078565b83905083836140759190615bf5565b92505b5f81111561414d5761413e60155f8a81526020019081526020015f2083815481106140a6576140a561652e565b5b905f5260205f200180546140b990615c91565b80601f01602080910402602001604051908101604052809291908181526020018280546140e590615c91565b80156141305780601f1061410757610100808354040283529160200191614130565b820191905f5260205f20905b81548152906001019060200180831161411357829003601f168201915b50505050508e838e8e614737565b8880614149906165f1565b9950505b508080614159906165f1565b915050614037565b5050505050505b8080614173906165f1565b915050613fbc565b50949350505050565b60015f81905550565b60185f61419a9190614f79565b60016014546141a99190615bf5565b67ffffffffffffffff8111156141c2576141c161529b565b5b6040519080825280602002602001820160405280156141f05781602001602082028036833780820191505090505b5060189080519060200190614206929190614f97565b505f6019819055505f670de0b6b3a764000090505f5b60145481116142a757816018828154811061423a5761423961652e565b5b905f5260205f2001819055508160155f8381526020019081526020015f20805490506142669190616c53565b60195f8282546142769190615bf5565b9250508190555061429282601354670de0b6b3a7640000613e2a565b9150808061429f906165f1565b91505061421c565b5050565b5f6016826040516142bc9190615f1f565b90815260200160405180910390205490505f60155f8381526020019081526020015f2090505f5b81805490508110156143c357838051906020012082828154811061430a5761430961652e565b5b905f5260205f200160405161431f9190616d8d565b6040518091039020036143b057816001838054905061433e9190615b5a565b8154811061434f5761434e61652e565b5b905f5260205f200182828154811061436a5761436961652e565b5b905f5260205f2001908161437e9190616dca565b50818054806143905761438f616eaf565b5b600190038181905f5260205f20015f6143a99190614fe2565b90556143c3565b80806143bb906165f1565b9150506142e3565b50505050565b5f600a836040516143da9190615f1f565b90815260200160405180910390205490505f8111156144c0575f600a846040516144049190615f1f565b9081526020016040518091039020819055505f8273ffffffffffffffffffffffffffffffffffffffff168260405161443b90616eff565b5f6040518083038185875af1925050503d805f8114614475576040519150601f19603f3d011682016040523d82523d5f602084013e61447a565b606091505b50509050806144be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016144b590616f5d565b60405180910390fd5b505b505050565b5f600c836040516144d69190615f1f565b908152602001604051809103902080548060200260200160405190810160405280929190818152602001828054801561456157602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311614518575b505050505090505f5b8151811015614731575f600b856040516145849190615f1f565b90815260200160405180910390205f8484815181106145a6576145a561652e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f81111561471d575f600b866040516146039190615f1f565b90815260200160405180910390205f8585815181106146255761462461652e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080600d5f8585815181106146815761468061652e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546146d09190615b5a565b9250508190555061471c84828585815181106146ef576146ee61652e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16614e419092919063ffffffff16565b5b508080614729906165f1565b91505061456a565b50505050565b5f6007866040516147489190615f1f565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156147cb57505f8273ffffffffffffffffffffffffffffffffffffffff163b115b90506008876040516147dd9190615f1f565b90815260200160405180910390205f9054906101000a900460ff16801561483057505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15614a715783156148e9575f8273ffffffffffffffffffffffffffffffffffffffff168660405161486090616eff565b5f6040518083038185875af1925050503d805f811461489a576040519150601f19603f3d011682016040523d82523d5f602084013e61489f565b606091505b50509050806148e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016148da90616fc5565b60405180910390fd5b50614915565b61491482868573ffffffffffffffffffffffffffffffffffffffff16614e419092919063ffffffff16565b5b8173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167f7d6a6b7452c2fec7981096e354fb3311f3f3b800ff27def1017b22cbff2751908784886149a6576040518060400160405280600581526020017f45524332300000000000000000000000000000000000000000000000000000008152506149dd565b6040518060400160405280600381526020017f45544800000000000000000000000000000000000000000000000000000000008152505b6040516149ec93929190616fe3565b60405180910390a38173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167f71e611184866cc19c5f49af6c856ce9bde5a13bcd197c7499b61ab410ac9439960018a88614a51578a614a53565b5f5b8a604051614a6494939291906164dd565b60405180910390a3614e38565b8315614ab05784600a88604051614a889190615f1f565b90815260200160405180910390205f828254614aa49190615bf5565b92505081905550614c50565b5f600b88604051614ac19190615f1f565b90815260200160405180910390205f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205403614b8d57600c87604051614b209190615f1f565b908152602001604051809103902086908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b84600b88604051614b9e9190615f1f565b90815260200160405180910390205f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254614bf59190615bf5565b9250508190555084600d5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254614c489190615bf5565b925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167f7d6a6b7452c2fec7981096e354fb3311f3f3b800ff27def1017b22cbff275190875f88614ce1576040518060400160405280600c81526020017f53544f5245445f45524332300000000000000000000000000000000000000000815250614d18565b6040518060400160405280600a81526020017f53544f5245445f455448000000000000000000000000000000000000000000008152505b604051614d2793929190616fe3565b60405180910390a35f601188604051614d409190615f1f565b90815260200160405180910390205f9054906101000a900460ff16614d9a576040518060400160405280600481526020017f7a6f6e6500000000000000000000000000000000000000000000000000000000815250614dd1565b6040518060400160405280600a81526020017f70657263656e74616765000000000000000000000000000000000000000000008152505b90503073ffffffffffffffffffffffffffffffffffffffff167ff9700e8ac41cc506d3f79229bad9981619140b63838136cdb10ac6ba5f6976ab60018a88614e19578a614e1b565b5f5b8a86604051614e2e95949392919061701f565b60405180910390a2505b50505050505050565b614ebb838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401614e74929190615ac7565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614ec0565b505050565b5f8060205f8451602086015f885af180614edf576040513d5f823e3d81fd5b3d92505f519150505f8214614ef8576001811415614f13565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b15614f5557836040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401614f4c919061509c565b60405180910390fd5b50505050565b5080545f8255905f5260205f2090810190614f76919061501f565b50565b5080545f8255905f5260205f2090810190614f949190615042565b50565b828054828255905f5260205f20908101928215614fd1579160200282015b82811115614fd0578251825591602001919060010190614fb5565b5b509050614fde9190615042565b5090565b508054614fee90615c91565b5f825580601f10614fff575061501c565b601f0160209004905f5260205f209081019061501b9190615042565b5b50565b5b8082111561503e575f81816150359190614fe2565b50600101615020565b5090565b5b80821115615059575f815f905550600101615043565b5090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6150868261505d565b9050919050565b6150968161507c565b82525050565b5f6020820190506150af5f83018461508d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156151155780820151818401526020810190506150fa565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61513a826150de565b61514481856150e8565b93506151548185602086016150f8565b61515d81615120565b840191505092915050565b5f6151738383615130565b905092915050565b5f602082019050919050565b5f615191826150b5565b61519b81856150bf565b9350836020820285016151ad856150cf565b805f5b858110156151e857848403895281516151c98582615168565b94506151d48361517b565b925060208a019950506001810190506151b0565b50829750879550505050505092915050565b5f6020820190508181035f8301526152128184615187565b905092915050565b5f82825260208201905092915050565b5f615234826150de565b61523e818561521a565b935061524e8185602086016150f8565b61525781615120565b840191505092915050565b5f6020820190508181035f83015261527a818461522a565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6152d182615120565b810181811067ffffffffffffffff821117156152f0576152ef61529b565b5b80604052505050565b5f615302615282565b905061530e82826152c8565b919050565b5f67ffffffffffffffff82111561532d5761532c61529b565b5b61533682615120565b9050602081019050919050565b828183375f83830152505050565b5f61536361535e84615313565b6152f9565b90508281526020810184848401111561537f5761537e615297565b5b61538a848285615343565b509392505050565b5f82601f8301126153a6576153a5615293565b5b81356153b6848260208601615351565b91505092915050565b5f602082840312156153d4576153d361528b565b5b5f82013567ffffffffffffffff8111156153f1576153f061528f565b5b6153fd84828501615392565b91505092915050565b5f819050919050565b61541881615406565b82525050565b5f6020820190506154315f83018461540f565b92915050565b61544081615406565b811461544a575f80fd5b50565b5f8135905061545b81615437565b92915050565b5f80604083850312156154775761547661528b565b5b5f6154848582860161544d565b92505060206154958582860161544d565b9150509250929050565b6154a88161507c565b81146154b2575f80fd5b50565b5f813590506154c38161549f565b92915050565b5f80604083850312156154df576154de61528b565b5b5f6154ec858286016154b5565b92505060206154fd8582860161544d565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6155398161507c565b82525050565b5f61554a8383615530565b60208301905092915050565b5f602082019050919050565b5f61556c82615507565b6155768185615511565b935061558183615521565b805f5b838110156155b1578151615598888261553f565b97506155a383615556565b925050600181019050615584565b5085935050505092915050565b5f6020820190508181035f8301526155d68184615562565b905092915050565b5f602082840312156155f3576155f261528b565b5b5f6156008482850161544d565b91505092915050565b5f8115159050919050565b61561d81615609565b82525050565b5f6020820190506156365f830184615614565b92915050565b5f80604083850312156156525761565161528b565b5b5f83013567ffffffffffffffff81111561566f5761566e61528f565b5b61567b85828601615392565b925050602061568c8582860161544d565b9150509250929050565b5f602082840312156156ab576156aa61528b565b5b5f6156b8848285016154b5565b91505092915050565b5f80604083850312156156d7576156d661528b565b5b5f83013567ffffffffffffffff8111156156f4576156f361528f565b5b61570085828601615392565b9250506020615711858286016154b5565b9150509250929050565b5f67ffffffffffffffff8211156157355761573461529b565b5b602082029050602081019050919050565b5f80fd5b5f61575c6157578461571b565b6152f9565b9050808382526020820190506020840283018581111561577f5761577e615746565b5b835b818110156157c657803567ffffffffffffffff8111156157a4576157a3615293565b5b8086016157b18982615392565b85526020850194505050602081019050615781565b5050509392505050565b5f82601f8301126157e4576157e3615293565b5b81356157f484826020860161574a565b91505092915050565b5f602082840312156158125761581161528b565b5b5f82013567ffffffffffffffff81111561582f5761582e61528f565b5b61583b848285016157d0565b91505092915050565b5f67ffffffffffffffff82111561585e5761585d61529b565b5b602082029050602081019050919050565b5f61588161587c84615844565b6152f9565b905080838252602082019050602084028301858111156158a4576158a3615746565b5b835b818110156158cd57806158b9888261544d565b8452602084019350506020810190506158a6565b5050509392505050565b5f82601f8301126158eb576158ea615293565b5b81356158fb84826020860161586f565b91505092915050565b5f806040838503121561591a5761591961528b565b5b5f83013567ffffffffffffffff8111156159375761593661528f565b5b615943858286016157d0565b925050602083013567ffffffffffffffff8111156159645761596361528f565b5b615970858286016158d7565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6159ac81615406565b82525050565b5f6159bd83836159a3565b60208301905092915050565b5f602082019050919050565b5f6159df8261597a565b6159e98185615984565b93506159f483615994565b805f5b83811015615a24578151615a0b88826159b2565b9750615a16836159c9565b9250506001810190506159f7565b5085935050505092915050565b5f6020820190508181035f830152615a4981846159d5565b905092915050565b5f8060408385031215615a6757615a6661528b565b5b5f83013567ffffffffffffffff811115615a8457615a8361528f565b5b615a9085828601615392565b925050602083013567ffffffffffffffff811115615ab157615ab061528f565b5b615abd85828601615392565b9150509250929050565b5f604082019050615ada5f83018561508d565b615ae7602083018461540f565b9392505050565b5f81519050615afc81615437565b92915050565b5f60208284031215615b1757615b1661528b565b5b5f615b2484828501615aee565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f615b6482615406565b9150615b6f83615406565b9250828203905081811115615b8757615b86615b2d565b5b92915050565b7f496e73756666696369656e7420746f6b656e2062616c616e63650000000000005f82015250565b5f615bc1601a8361521a565b9150615bcc82615b8d565b602082019050919050565b5f6020820190508181035f830152615bee81615bb5565b9050919050565b5f615bff82615406565b9150615c0a83615406565b9250828201905080821115615c2257615c21615b2d565b5b92915050565b5f606082019050615c3b5f83018661540f565b615c48602083018561540f565b8181036040830152615c5a818461522a565b9050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680615ca857607f821691505b602082108103615cbb57615cba615c64565b5b50919050565b5f819050815f5260205f209050919050565b5f8154615cdf81615c91565b615ce9818661521a565b9450600182165f8114615d035760018114615d1957615d4b565b60ff198316865281151560200286019350615d4b565b615d2285615cc1565b5f5b83811015615d4357815481890152600182019150602081019050615d24565b808801955050505b50505092915050565b5f819050919050565b5f819050919050565b5f615d80615d7b615d7684615d54565b615d5d565b615406565b9050919050565b615d9081615d66565b82525050565b5f60a0820190508181035f830152615dae8188615cd3565b9050615dbd602083018761508d565b615dca604083018661540f565b615dd7606083018561540f565b615de46080830184615d87565b9695505050505050565b7f4f6e6c79206f776e6572000000000000000000000000000000000000000000005f82015250565b5f615e22600a8361521a565b9150615e2d82615dee565b602082019050919050565b5f6020820190508181035f830152615e4f81615e16565b9050919050565b7f4d7573742073756d20746f2031303030300000000000000000000000000000005f82015250565b5f615e8a60118361521a565b9150615e9582615e56565b602082019050919050565b5f6020820190508181035f830152615eb781615e7e565b9050919050565b5f604082019050615ed15f83018561540f565b615ede602083018461540f565b9392505050565b5f81905092915050565b5f615ef9826150de565b615f038185615ee5565b9350615f138185602086016150f8565b80840191505092915050565b5f615f2a8284615eef565b915081905092915050565b7f4e6f7420616e206578746572696f72206d656d626572000000000000000000005f82015250565b5f615f6960168361521a565b9150615f7482615f35565b602082019050919050565b5f6020820190508181035f830152615f9681615f5d565b9050919050565b7f4d75737420626520612062756e646c65206d656d6265720000000000000000005f82015250565b5f615fd160178361521a565b9150615fdc82615f9d565b602082019050919050565b5f6020820190508181035f830152615ffe81615fc5565b9050919050565b7f5a6f6e65206f7574206f662072616e67650000000000000000000000000000005f82015250565b5f61603960118361521a565b915061604482616005565b602082019050919050565b5f6020820190508181035f8301526160668161602d565b9050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026160b77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261607c565b6160c1868361607c565b95508019841693508086168417925050509392505050565b5f6160f36160ee6160e984615406565b615d5d565b615406565b9050919050565b5f819050919050565b61610c836160d9565b616120616118826160fa565b848454616088565b825550505050565b5f90565b616134616128565b61613f818484616103565b505050565b5b81811015616162576161575f8261612c565b600181019050616145565b5050565b601f8211156161a75761617881615cc1565b6161818461606d565b81016020851015616190578190505b6161a461619c8561606d565b830182616144565b50505b505050565b5f82821c905092915050565b5f6161c75f19846008026161ac565b1980831691505092915050565b5f6161df83836161b8565b9150826002028217905092915050565b6161f8826150de565b67ffffffffffffffff8111156162115761621061529b565b5b61621b8254615c91565b616226828285616166565b5f60209050601f831160018114616257575f8415616245578287015190505b61624f85826161d4565b8655506162b6565b601f19841661626586615cc1565b5f5b8281101561628c57848901518255600182019150602085019450602081019050616267565b868310156162a957848901516162a5601f8916826161b8565b8355505b6001600288020188555050505b505050505050565b5f6040820190508181035f8301526162d6818561522a565b90506162e5602083018461540f565b9392505050565b5f6080820190508181035f8301526163048187615cd3565b90508181036020830152616318818661522a565b9050616327604083018561540f565b616334606083018461540f565b95945050505050565b7f4e6f2061637469766520656c656374696f6e00000000000000000000000000005f82015250565b5f61637160128361521a565b915061637c8261633d565b602082019050919050565b5f6020820190508181035f83015261639e81616365565b9050919050565b7f416c726561647920636c61696d656400000000000000000000000000000000005f82015250565b5f6163d9600f8361521a565b91506163e4826163a5565b602082019050919050565b5f6020820190508181035f830152616406816163cd565b9050919050565b7f496e76616c69642062656e6566696369617279000000000000000000000000005f82015250565b5f61644160138361521a565b915061644c8261640d565b602082019050919050565b5f6020820190508181035f83015261646e81616435565b9050919050565b7f4e6f742061206d656d62657200000000000000000000000000000000000000005f82015250565b5f6164a9600c8361521a565b91506164b482616475565b602082019050919050565b5f6020820190508181035f8301526164d68161649d565b9050919050565b5f6080820190508181035f8301526164f58187615cd3565b90508181036020830152616509818661522a565b9050616518604083018561508d565b616525606083018461540f565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f815461656781615c91565b6165718186615ee5565b9450600182165f811461658b57600181146165a0576165d2565b60ff19831686528115158202860193506165d2565b6165a985615cc1565b5f5b838110156165ca578154818901526001820191506020810190506165ab565b838801955050505b50505092915050565b5f6165e6828461655b565b915081905092915050565b5f6165fb82615406565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361662d5761662c615b2d565b5b600182019050919050565b7f4e6f2063616e64696461746573000000000000000000000000000000000000005f82015250565b5f61666c600d8361521a565b915061667782616638565b602082019050919050565b5f6020820190508181035f83015261669981616660565b9050919050565b7f57696e6e6572206d757374206861766520636c61696d656420746f20726563655f8201527f697665206f776e65727368697000000000000000000000000000000000000000602082015250565b5f6166fa602d8361521a565b9150616705826166a0565b604082019050919050565b5f6020820190508181035f830152616727816166ee565b9050919050565b7f4d7573742062652061206d656d626572000000000000000000000000000000005f82015250565b5f61676260108361521a565b915061676d8261672e565b602082019050919050565b5f6020820190508181035f83015261678f81616756565b9050919050565b7f416c726561647920612063616e646964617465000000000000000000000000005f82015250565b5f6167ca60138361521a565b91506167d582616796565b602082019050919050565b5f6020820190508181035f8301526167f7816167be565b9050919050565b5f6060820190508181035f8301526168168186615cd3565b9050818103602083015261682a818561522a565b9050616839604083018461508d565b949350505050565b7f4172726179206c656e677468206d69736d6174636800000000000000000000005f82015250565b5f61687560158361521a565b915061688082616841565b602082019050919050565b5f6020820190508181035f8301526168a281616869565b9050919050565b7f55736572206d75737420626520612062756e646c65206d656d626572000000005f82015250565b5f6168dd601c8361521a565b91506168e8826168a9565b602082019050919050565b5f6020820190508181035f83015261690a816168d1565b9050919050565b7f50657263656e74616765206d75737420626520706f73697469766500000000005f82015250565b5f616945601b8361521a565b915061695082616911565b602082019050919050565b5f6020820190508181035f83015261697281616939565b9050919050565b7f50657263656e7461676573206d7573742073756d20746f2031303030300000005f82015250565b5f6169ad601d8361521a565b91506169b882616979565b602082019050919050565b5f6020820190508181035f8301526169da816169a1565b9050919050565b5f6040820190508181035f8301526169f98185615187565b90508181036020830152616a0d81846159d5565b90509392505050565b7f53746565706e657373206d7573742062652030203c2073203c203165313800005f82015250565b5f616a4a601e8361521a565b9150616a5582616a16565b602082019050919050565b5f6020820190508181035f830152616a7781616a3e565b9050919050565b7f566f746572206d7573742062652061206d656d626572000000000000000000005f82015250565b5f616ab260168361521a565b9150616abd82616a7e565b602082019050919050565b5f6020820190508181035f830152616adf81616aa6565b9050919050565b7f4e6f7420612076616c69642063616e64696461746500000000000000000000005f82015250565b5f616b1a60158361521a565b9150616b2582616ae6565b602082019050919050565b5f6020820190508181035f830152616b4781616b0e565b9050919050565b7f416c726561647920766f746564000000000000000000000000000000000000005f82015250565b5f616b82600d8361521a565b9150616b8d82616b4e565b602082019050919050565b5f6020820190508181035f830152616baf81616b76565b9050919050565b5f6040820190508181035f830152616bce818561522a565b90508181036020830152616be2818461522a565b90509392505050565b7f4469766973696f6e206279207a65726f000000000000000000000000000000005f82015250565b5f616c1f60108361521a565b9150616c2a82616beb565b602082019050919050565b5f6020820190508181035f830152616c4c81616c13565b9050919050565b5f616c5d82615406565b9150616c6883615406565b9250828202616c7681615406565b91508282048414831517616c8d57616c8c615b2d565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f616ccb82615406565b9150616cd683615406565b925082616ce657616ce5616c94565b5b828204905092915050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154616d1981615c91565b616d238186616cf1565b9450600182165f8114616d3d5760018114616d5257616d84565b60ff1983168652811515820286019350616d84565b616d5b85616cfb565b5f5b83811015616d7c57815481890152600182019150602081019050616d5d565b838801955050505b50505092915050565b5f616d988284616d0d565b915081905092915050565b5f81549050616db181615c91565b9050919050565b5f819050815f5260205f209050919050565b818103616dd8575050616ead565b616de182616da3565b67ffffffffffffffff811115616dfa57616df961529b565b5b616e048254615c91565b616e0f828285616166565b5f601f831160018114616e3c575f8415616e2a578287015490505b616e3485826161d4565b865550616ea6565b601f198416616e4a87616db8565b9650616e5586615cc1565b5f5b82811015616e7c57848901548255600182019150600185019450602081019050616e57565b86831015616e995784890154616e95601f8916826161b8565b8355505b6001600288020188555050505b5050505050505b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b50565b5f616eea5f83616cf1565b9150616ef582616edc565b5f82019050919050565b5f616f0982616edf565b9150819050919050565b7f45544820636c61696d206661696c6564000000000000000000000000000000005f82015250565b5f616f4760108361521a565b9150616f5282616f13565b602082019050919050565b5f6020820190508181035f830152616f7481616f3b565b9050919050565b7f455448207472616e73666572206661696c6564000000000000000000000000005f82015250565b5f616faf60138361521a565b9150616fba82616f7b565b602082019050919050565b5f6020820190508181035f830152616fdc81616fa3565b9050919050565b5f606082019050616ff65f83018661540f565b6170036020830185615614565b8181036040830152617015818461522a565b9050949350505050565b5f60a0820190508181035f8301526170378188615cd3565b9050818103602083015261704b818761522a565b905061705a604083018661508d565b617067606083018561540f565b8181036080830152617079818461522a565b9050969550505050505056fea2646970667358221220e61ca743da8bf74312a4d4f6b348b3282428098da8234b281a8987056df9bb6364736f6c63430008140033";
24521
+ const BundleABI = {
24522
+ abi,
24523
+ bytecode
24524
+ };
24449
24525
  const HolonsABI = [
24450
24526
  {
24451
24527
  type: "function",
@@ -25853,7 +25929,7 @@ class ContractDeployer {
25853
25929
  */
25854
25930
  async _loadEthers() {
25855
25931
  if (!this.ethers) {
25856
- this.ethers = await import("./index-Cp3xctq8.js");
25932
+ this.ethers = await import("./index-jmTHEbR2.js");
25857
25933
  }
25858
25934
  return this.ethers;
25859
25935
  }
@@ -26061,6 +26137,7 @@ class ContractDeployer {
26061
26137
  }
26062
26138
  /**
26063
26139
  * Deploy a Bundle contract (2-way split with steepness)
26140
+ * This is the simplest way to deploy a holon - no registry needed!
26064
26141
  * @param {string} name - Contract name
26065
26142
  * @param {number} [steepness=500000000000000000n] - Steepness factor (0.5e18 = 50% decay)
26066
26143
  * @param {number} [nZones=6] - Number of zones
@@ -26073,18 +26150,41 @@ class ContractDeployer {
26073
26150
  const deployerAddress = await signer.getAddress();
26074
26151
  const creatorUserId = options.creatorUserId || "creator";
26075
26152
  const steepnessValue = steepness || ethers.parseEther("0.5");
26153
+ const abi2 = BundleABI.abi || BundleABI;
26154
+ const bytecode2 = BundleABI.bytecode;
26155
+ if (!bytecode2) {
26156
+ throw new Error("Bundle bytecode not available. Please rebuild contracts.");
26157
+ }
26076
26158
  const result = await this._deployContract(
26077
- BundleABI.abi,
26078
- BundleABI.bytecode,
26159
+ abi2,
26160
+ bytecode2,
26079
26161
  [deployerAddress, creatorUserId, name2, steepnessValue, nZones]
26080
26162
  );
26081
26163
  return {
26082
26164
  ...result,
26083
26165
  type: "Bundle",
26084
26166
  steepness: steepnessValue,
26085
- nZones
26167
+ nZones,
26168
+ creatorUserId,
26169
+ name: name2
26086
26170
  };
26087
26171
  }
26172
+ /**
26173
+ * Deploy a Bundle contract directly (simplified 1-click deployment)
26174
+ * No registry needed - just deploys and returns the address
26175
+ * @param {string} holonId - Unique identifier for the holon
26176
+ * @param {string} name - Display name for the holon
26177
+ * @param {Object} [options] - Options { steepness, nZones }
26178
+ * @returns {Promise<{address, txHash, contract}>}
26179
+ */
26180
+ async deployBundleDirect(holonId, name2, options = {}) {
26181
+ const steepness = options.steepness;
26182
+ const nZones = options.nZones || 6;
26183
+ return this.deployBundle(name2, steepness, nZones, {
26184
+ creatorUserId: holonId,
26185
+ ...options
26186
+ });
26187
+ }
26088
26188
  /**
26089
26189
  * Deploy a TestToken (ERC20 for testing)
26090
26190
  * @param {string} [initialSupply='1000000'] - Initial supply in whole tokens
@@ -26144,11 +26244,11 @@ class ContractDeployer {
26144
26244
  * @returns {Promise<Contract>}
26145
26245
  */
26146
26246
  async getContract(address, type2) {
26147
- const abi = ABIs[type2];
26148
- if (!abi) {
26247
+ const abi2 = ABIs[type2];
26248
+ if (!abi2) {
26149
26249
  throw new Error(`Unknown contract type: ${type2}`);
26150
26250
  }
26151
- return this.chainManager.getContract(address, abi.abi);
26251
+ return this.chainManager.getContract(address, abi2.abi);
26152
26252
  }
26153
26253
  /**
26154
26254
  * Get deployed contract addresses
@@ -26168,8 +26268,8 @@ class ContractDeployer {
26168
26268
  * Internal: Deploy a contract
26169
26269
  * @private
26170
26270
  */
26171
- async _deployContract(abi, bytecode, constructorArgs) {
26172
- const result = await this.chainManager.deployContract(abi, bytecode, constructorArgs);
26271
+ async _deployContract(abi2, bytecode2, constructorArgs) {
26272
+ const result = await this.chainManager.deployContract(abi2, bytecode2, constructorArgs);
26173
26273
  return {
26174
26274
  contract: result.contract,
26175
26275
  address: result.address,
@@ -26191,7 +26291,7 @@ class ContractOperations {
26191
26291
  */
26192
26292
  async _loadEthers() {
26193
26293
  if (!this.ethers) {
26194
- this.ethers = await import("./index-Cp3xctq8.js");
26294
+ this.ethers = await import("./index-jmTHEbR2.js");
26195
26295
  }
26196
26296
  return this.ethers;
26197
26297
  }
@@ -26866,11 +26966,11 @@ class HolonContracts {
26866
26966
  if (this.holonContracts.has(holonId)) {
26867
26967
  throw new Error(`Holon ${holonId} already has a contract. Use unlink() first.`);
26868
26968
  }
26869
- const abi = ABIs[type2];
26870
- if (!abi) {
26969
+ const abi2 = ABIs[type2];
26970
+ if (!abi2) {
26871
26971
  throw new Error(`Unknown contract type: ${type2}`);
26872
26972
  }
26873
- const contract = await this.chainManager.getContract(contractAddress, abi.abi);
26973
+ const contract = await this.chainManager.getContract(contractAddress, abi2.abi);
26874
26974
  try {
26875
26975
  await contract.name();
26876
26976
  } catch (error) {
@@ -27001,9 +27101,9 @@ class HolonContracts {
27001
27101
  try {
27002
27102
  const data = await this.storage.get?.(`holon_contract:${holonId}`);
27003
27103
  if (data && data.address && data.type) {
27004
- const abi = ABIs[data.type];
27005
- if (abi) {
27006
- const contract = await this.chainManager.getContract(data.address, abi.abi);
27104
+ const abi2 = ABIs[data.type];
27105
+ if (abi2) {
27106
+ const contract = await this.chainManager.getContract(data.address, abi2.abi);
27007
27107
  const operations = new ContractOperations(contract, data.type, this.chainManager);
27008
27108
  this.holonContracts.set(holonId, {
27009
27109
  ...data,
@@ -32307,17 +32407,17 @@ class Interface {
32307
32407
  * Create a new Interface for the %%fragments%%.
32308
32408
  */
32309
32409
  constructor(fragments) {
32310
- let abi = [];
32410
+ let abi2 = [];
32311
32411
  if (typeof fragments === "string") {
32312
- abi = JSON.parse(fragments);
32412
+ abi2 = JSON.parse(fragments);
32313
32413
  } else {
32314
- abi = fragments;
32414
+ abi2 = fragments;
32315
32415
  }
32316
32416
  this.#functions = /* @__PURE__ */ new Map();
32317
32417
  this.#errors = /* @__PURE__ */ new Map();
32318
32418
  this.#events = /* @__PURE__ */ new Map();
32319
32419
  const frags = [];
32320
- for (const a of abi) {
32420
+ for (const a of abi2) {
32321
32421
  try {
32322
32422
  frags.push(Fragment.from(a));
32323
32423
  } catch (error) {
@@ -32381,16 +32481,16 @@ class Interface {
32381
32481
  */
32382
32482
  format(minimal) {
32383
32483
  const format = minimal ? "minimal" : "full";
32384
- const abi = this.fragments.map((f) => f.format(format));
32385
- return abi;
32484
+ const abi2 = this.fragments.map((f) => f.format(format));
32485
+ return abi2;
32386
32486
  }
32387
32487
  /**
32388
32488
  * Return the JSON-encoded ABI. This is the format Solidiy
32389
32489
  * returns.
32390
32490
  */
32391
32491
  formatJson() {
32392
- const abi = this.fragments.map((f) => f.format("json"));
32393
- return JSON.stringify(abi.map((j) => JSON.parse(j)));
32492
+ const abi2 = this.fragments.map((f) => f.format("json"));
32493
+ return JSON.stringify(abi2.map((j) => JSON.parse(j)));
32394
32494
  }
32395
32495
  /**
32396
32496
  * The ABI coder that will be used to encode and decode binary
@@ -35044,12 +35144,12 @@ class BaseContract {
35044
35144
  * optionally connected to a %%runner%% to perform operations on behalf
35045
35145
  * of.
35046
35146
  */
35047
- constructor(target, abi, runner, _deployTx) {
35147
+ constructor(target, abi2, runner, _deployTx) {
35048
35148
  assertArgument(typeof target === "string" || isAddressable(target), "invalid value for Contract target", "target", target);
35049
35149
  if (runner == null) {
35050
35150
  runner = null;
35051
35151
  }
35052
- const iface = Interface.from(abi);
35152
+ const iface = Interface.from(abi2);
35053
35153
  defineProperties(this, { target, runner, interface: iface });
35054
35154
  Object.defineProperty(this, internal, { value: {} });
35055
35155
  let addrPromise;
@@ -35412,10 +35512,10 @@ class BaseContract {
35412
35512
  /**
35413
35513
  * Create a new Class for the %%abi%%.
35414
35514
  */
35415
- static buildClass(abi) {
35515
+ static buildClass(abi2) {
35416
35516
  class CustomContract extends BaseContract {
35417
35517
  constructor(address, runner = null) {
35418
- super(address, abi, runner);
35518
+ super(address, abi2, runner);
35419
35519
  }
35420
35520
  }
35421
35521
  return CustomContract;
@@ -35423,11 +35523,11 @@ class BaseContract {
35423
35523
  /**
35424
35524
  * Create a new BaseContract with a specified Interface.
35425
35525
  */
35426
- static from(target, abi, runner) {
35526
+ static from(target, abi2, runner) {
35427
35527
  if (runner == null) {
35428
35528
  runner = null;
35429
35529
  }
35430
- const contract = new this(target, abi, runner);
35530
+ const contract = new this(target, abi2, runner);
35431
35531
  return contract;
35432
35532
  }
35433
35533
  }
@@ -35462,11 +35562,11 @@ class ContractQueries {
35462
35562
  * @returns {ethers.Contract}
35463
35563
  */
35464
35564
  getContract(address, flavor) {
35465
- const abi = ContractABIs[flavor];
35466
- if (!abi) {
35565
+ const abi2 = ContractABIs[flavor];
35566
+ if (!abi2) {
35467
35567
  throw new Error(`Unknown contract flavor: ${flavor}`);
35468
35568
  }
35469
- return new Contract(address, abi, this.provider);
35569
+ return new Contract(address, abi2, this.provider);
35470
35570
  }
35471
35571
  /**
35472
35572
  * Auto-detect contract flavor by calling flavor()
@@ -37439,6 +37539,7 @@ class HoloSphereBase extends HoloSphere$1 {
37439
37539
  if (!Array.isArray(data.inbound)) data.inbound = [];
37440
37540
  if (!Array.isArray(data.outbound)) data.outbound = [];
37441
37541
  if (!data.lensConfig || typeof data.lensConfig !== "object") data.lensConfig = {};
37542
+ if (!data.partnerNames || typeof data.partnerNames !== "object") data.partnerNames = {};
37442
37543
  if (!Array.isArray(data.federated)) {
37443
37544
  const allFederated = /* @__PURE__ */ new Set([...data.inbound, ...data.outbound]);
37444
37545
  data.federated = Array.from(allFederated);
@@ -37446,7 +37547,7 @@ class HoloSphereBase extends HoloSphere$1 {
37446
37547
  return data;
37447
37548
  }
37448
37549
  async federateHolon(sourceHolon, targetHolon, options = {}) {
37449
- const { lensConfig = { inbound: [], outbound: [] } } = options;
37550
+ const { lensConfig = { inbound: [], outbound: [] }, partnerName = null } = options;
37450
37551
  if (sourceHolon === targetHolon) {
37451
37552
  throw new Error("Cannot federate a holon with itself");
37452
37553
  }
@@ -37457,15 +37558,20 @@ class HoloSphereBase extends HoloSphere$1 {
37457
37558
  inbound: [],
37458
37559
  outbound: [],
37459
37560
  lensConfig: {},
37561
+ partnerNames: {},
37460
37562
  timestamp: Date.now()
37461
37563
  };
37462
37564
  if (!Array.isArray(federationData.federated)) federationData.federated = [];
37463
37565
  if (!Array.isArray(federationData.inbound)) federationData.inbound = [];
37464
37566
  if (!Array.isArray(federationData.outbound)) federationData.outbound = [];
37465
37567
  if (!federationData.lensConfig || typeof federationData.lensConfig !== "object") federationData.lensConfig = {};
37568
+ if (!federationData.partnerNames || typeof federationData.partnerNames !== "object") federationData.partnerNames = {};
37466
37569
  if (!federationData.federated.includes(targetHolon)) {
37467
37570
  federationData.federated.push(targetHolon);
37468
37571
  }
37572
+ if (partnerName) {
37573
+ federationData.partnerNames[targetHolon] = partnerName;
37574
+ }
37469
37575
  if (lensConfig.outbound && lensConfig.outbound.length > 0) {
37470
37576
  if (!federationData.outbound.includes(targetHolon)) {
37471
37577
  federationData.outbound.push(targetHolon);
@@ -37866,4 +37972,4 @@ export {
37866
37972
  exists as y,
37867
37973
  bytes as z
37868
37974
  };
37869
- //# sourceMappingURL=index-Bbey4GkP.js.map
37975
+ //# sourceMappingURL=index-d6f4RJBM.js.map