@shipload/sdk 2.0.0-rc4 → 2.0.0-rc6

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 (45) hide show
  1. package/lib/shipload.d.ts +411 -1025
  2. package/lib/shipload.js +879 -2057
  3. package/lib/shipload.js.map +1 -1
  4. package/lib/shipload.m.js +852 -2028
  5. package/lib/shipload.m.js.map +1 -1
  6. package/package.json +1 -1
  7. package/src/capabilities/crafting.ts +10 -0
  8. package/src/capabilities/guards.ts +0 -5
  9. package/src/capabilities/index.ts +1 -0
  10. package/src/capabilities/storage.ts +0 -8
  11. package/src/contracts/server.ts +106 -225
  12. package/src/data/items.json +15 -14
  13. package/src/data/recipes.ts +129 -0
  14. package/src/derivation/crafting.ts +120 -0
  15. package/src/derivation/index.ts +9 -6
  16. package/src/derivation/resources.ts +54 -53
  17. package/src/derivation/stats.ts +146 -0
  18. package/src/derivation/stratum.ts +14 -14
  19. package/src/entities/cargo-utils.ts +6 -64
  20. package/src/entities/container.ts +18 -0
  21. package/src/entities/entity-inventory.ts +0 -4
  22. package/src/entities/inventory-accessor.ts +0 -4
  23. package/src/entities/location.ts +2 -197
  24. package/src/entities/player.ts +1 -274
  25. package/src/entities/ship.ts +0 -21
  26. package/src/entities/warehouse.ts +0 -4
  27. package/src/index-module.ts +43 -47
  28. package/src/managers/actions.ts +38 -90
  29. package/src/managers/context.ts +0 -9
  30. package/src/managers/index.ts +0 -1
  31. package/src/managers/locations.ts +2 -85
  32. package/src/market/items.ts +1 -2
  33. package/src/scheduling/projection.ts +0 -10
  34. package/src/shipload.ts +0 -5
  35. package/src/types/capabilities.ts +1 -9
  36. package/src/types/entity-traits.ts +3 -4
  37. package/src/types/entity.ts +0 -1
  38. package/src/types.ts +8 -28
  39. package/src/utils/system.ts +5 -4
  40. package/src/managers/trades.ts +0 -119
  41. package/src/market/market.ts +0 -208
  42. package/src/market/rolls.ts +0 -8
  43. package/src/trading/collect.ts +0 -938
  44. package/src/trading/deal.ts +0 -207
  45. package/src/trading/trade.ts +0 -203
package/lib/shipload.m.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { __decorate } from 'tslib';
2
- import { Blob, ABI, Struct, Name, UInt64, Checksum256, UInt32, TimePointSec, UInt16, UInt8, TimePoint, Int64, Bytes, Checksum512, APIClient } from '@wharfkit/antelope';
2
+ import { Blob, ABI, Struct, Name, UInt64, Checksum256, UInt32, TimePointSec, UInt8, TimePoint, UInt16, Int64, Bytes, Checksum512, APIClient } from '@wharfkit/antelope';
3
3
  import ContractKit, { Contract as Contract$2 } from '@wharfkit/contract';
4
4
 
5
5
  const abiBlob$1 = Blob.from('DmVvc2lvOjphYmkvMS4yAA0KY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/C2NvbXBhbnlfcm93AAIHYWNjb3VudARuYW1lBG5hbWUGc3RyaW5nBmVuYWJsZQABB2VuYWJsZWQEYm9vbAplbmFibGVnYW1lAAIIY29udHJhY3QEbmFtZQdlbmFibGVkBGJvb2wMZm91bmRjb21wYW55AAIHYWNjb3VudARuYW1lBG5hbWUGc3RyaW5nC2dhbWVfY29uZmlnAAQEc2VlZAtjaGVja3N1bTI1NgllcG9jaHRpbWUGdWludDMyBXN0YXJ0DnRpbWVfcG9pbnRfc2VjA2VuZA50aW1lX3BvaW50X3NlYwlnYW1lX21ldGEABARuYW1lBnN0cmluZwtkZXNjcmlwdGlvbgZzdHJpbmcDdXJsBnN0cmluZwd2ZXJzaW9uBnN0cmluZwhnYW1lX3JvdwAECGNvbnRyYWN0BG5hbWUGY29uZmlnC2dhbWVfY29uZmlnBG1ldGEJZ2FtZV9tZXRhBXN0YXRlCmdhbWVfc3RhdGUKZ2FtZV9zdGF0ZQABB2VuYWJsZWQEYm9vbAlzdGFydGdhbWUABAhjb250cmFjdARuYW1lBmNvbmZpZwtnYW1lX2NvbmZpZwRtZXRhCWdhbWVfbWV0YQVzdGF0ZQpnYW1lX3N0YXRlCXN0YXRlX3JvdwABB2VuYWJsZWQEYm9vbAp1cGRhdGVnYW1lAAIIY29udHJhY3QEbmFtZQRtZXRhCWdhbWVfbWV0YQR3aXBlAAAHAICKx+RrVEQKY2xlYXJ0YWJsZb4BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsZWFydGFibGUKc3VtbWFyeTogJ0RFQlVHOiBjbGVhcnRhYmxlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAACoeMxUBmVuYWJsZfMBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZQpzdW1tYXJ5OiAnRW5hYmxlL2Rpc2FibGUgcGxhdGZvcm0nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpFbmFibGUgb3IgZGlzYWJsZSB0aGUgcGxhdGZvcm0gY29udHJhY3QuAICShql4zFQKZW5hYmxlZ2FtZfwBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZWdhbWUKc3VtbWFyeTogJ0VuYWJsZS9kaXNiYWJsZSBhIGdhbWUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpFbmFibGUgb3IgZGlzYWJsZSB0aGUgc3BlY2lmaWVkIGdhbWUgY29udHJhY3Qu4KepkqI0NV0MZm91bmRjb21wYW55gwItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZm91bmRjb21wYW55CnN1bW1hcnk6ICdGb3VuZCBhIG5ldyBjb21wYW55JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKRm91bmQgYSBuZXcgY29tcGFueSBpbiB0aGUgU2hpcGxvYWQgcGxhdGZvcm0gY29udHJhY3QuAABQ0rB8TcYJc3RhcnRnYW1l/wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc3RhcnRnYW1lCnN1bW1hcnk6ICdTdGFydCBhIG5ldyBnYW1lJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKU3RhcnQgYSBuZXcgZ2FtZSBvZiBTaGlwbG9hZCBkZXBsb3llZCB0byBhIG5ldyBjb250cmFjdC4AgJKGqWxS1Qp1cGRhdGVnYW1ljQItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdXBkYXRlZ2FtZQpzdW1tYXJ5OiAnVXBkYXRlIGdhbWUgaW5mb3JtYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpVcGRhdGUgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgZ2FtZSBjb250cmFjdC4KCi0tLQAAAAAAoKrjBHdpcGWyAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3aXBlCnN1bW1hcnk6ICdERUJVRzogd2lwZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0DAAAAwE9TJUUDaTY0AAALY29tcGFueV9yb3cAAAAAAKykYQNpNjQAAAhnYW1lX3JvdwAAAAAAlU3GA2k2NAAACXN0YXRlX3JvdwETU2hpcGxvYWQgKFBsYXRmb3JtKRNTaGlwbG9hZCAoUGxhdGZvcm0pAAAAAA==');
@@ -205,7 +205,7 @@ var platform = /*#__PURE__*/Object.freeze({
205
205
  Contract: Contract$1
206
206
  });
207
207
 
208
- const abiBlob = Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDhaB2FkdmFuY2UAAgZyZXZlYWwGc3RyaW5nBmNvbW1pdAtjaGVja3N1bTI1NgxidXljb250YWluZXIAAwdhY2NvdW50BG5hbWUHc2hpcF9pZAZ1aW50NjQEbmFtZQZzdHJpbmcIYnV5aXRlbXMABAtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAdpdGVtX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIHYnV5c2hpcAACB2FjY291bnQEbmFtZQRuYW1lBnN0cmluZwxidXl3YXJlaG91c2UAAwdhY2NvdW50BG5hbWUHc2hpcF9pZAZ1aW50NjQEbmFtZQZzdHJpbmcGY2FuY2VsAAMLZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQFY291bnQGdWludDY0DmNhbmNlbF9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lD2NhbmNlbGxlZF9jb3VudAV1aW50OBBzY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/CmNhcmdvX2l0ZW0ABAdpdGVtX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIJdW5pdF9jb3N0BnVpbnQ2NARzZWVkB3VpbnQ2ND8JY2FyZ29fcm93AAYCaWQGdWludDY0CWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0CXVuaXRfY29zdAZ1aW50NjQEc2VlZAZ1aW50NjQJY2xlYW5yc3ZwAAIFZXBvY2gGdWludDY0CG1heF9yb3dzBnVpbnQ2NApjbGVhcnRhYmxlAAMKdGFibGVfbmFtZQRuYW1lBXNjb3BlBW5hbWU/CG1heF9yb3dzB3VpbnQ2ND8GY29tbWl0AAEGY29tbWl0C2NoZWNrc3VtMjU2CWNvbmZpZ2xvZwABBmNvbmZpZwtnYW1lX2NvbmZpZw1jb250YWluZXJfcm93AAgCaWQGdWludDY0BW93bmVyBG5hbWUEbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMIaHVsbG1hc3MGdWludDMyCGNhcGFjaXR5BnVpbnQzMgljYXJnb21hc3MGdWludDMyCHNjaGVkdWxlCXNjaGVkdWxlPwtjb29yZGluYXRlcwADAXgFaW50NjQBeQVpbnQ2NAF6B3VpbnQxNj8GZW5hYmxlAAEHZW5hYmxlZARib29sDGVuZXJneV9zdGF0cwACCGNhcGFjaXR5BnVpbnQxNghyZWNoYXJnZQZ1aW50MTYUZW50aXR5X2N1cnJlbnRfc3RhdGUAAgtjb29yZGluYXRlcwtjb29yZGluYXRlcwZlbmVyZ3kGdWludDE2D2VudGl0eV9kZWZhdWx0cwAQDXNoaXBfaHVsbG1hc3MGdWludDMyDXNoaXBfY2FwYWNpdHkGdWludDMyC3NoaXBfZW5lcmd5BnVpbnQxNgZzaGlwX3oGdWludDE2DHNoaXBfZW5naW5lcw5tb3ZlbWVudF9zdGF0cw5zaGlwX2dlbmVyYXRvcgxlbmVyZ3lfc3RhdHMMc2hpcF9sb2FkZXJzDGxvYWRlcl9zdGF0cwpzaGlwX3RyYWRlC3RyYWRlX3N0YXRzDnNoaXBfZXh0cmFjdG9yD2V4dHJhY3Rvcl9zdGF0cwlzaGlwX3dhcnAKd2FycF9zdGF0cxJ3YXJlaG91c2VfY2FwYWNpdHkGdWludDMyC3dhcmVob3VzZV96BnVpbnQxNhF3YXJlaG91c2VfbG9hZGVycwxsb2FkZXJfc3RhdHMSY29udGFpbmVyX2h1bGxtYXNzBnVpbnQzMhJjb250YWluZXJfY2FwYWNpdHkGdWludDMyC2NvbnRhaW5lcl96BnVpbnQxNgtlbnRpdHlfaW5mbwAWBHR5cGUEbmFtZQJpZAZ1aW50NjQFb3duZXIEbmFtZQtlbnRpdHlfbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMJY2FyZ29tYXNzBnVpbnQzMgVjYXJnbwxjYXJnb19pdGVtW10HbG9hZGVycw1sb2FkZXJfc3RhdHM/BmVuZXJneQd1aW50MTY/CGh1bGxtYXNzB3VpbnQzMj8HZW5naW5lcw9tb3ZlbWVudF9zdGF0cz8JZ2VuZXJhdG9yDWVuZXJneV9zdGF0cz8IY2FwYWNpdHkHdWludDMyPwlleHRyYWN0b3IQZXh0cmFjdG9yX3N0YXRzPwR3YXJwC3dhcnBfc3RhdHM/B2lzX2lkbGUEYm9vbAxjdXJyZW50X3Rhc2sFdGFzaz8UY3VycmVudF90YXNrX2VsYXBzZWQGdWludDMyFmN1cnJlbnRfdGFza19yZW1haW5pbmcGdWludDMyDXBlbmRpbmdfdGFza3MGdGFza1tdB2lkbGVfYXQLdGltZV9wb2ludD8Ic2NoZWR1bGUJc2NoZWR1bGU/CmVudGl0eV9yZWYAAgtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQOZW50aXR5X3N1bW1hcnkACAR0eXBlBG5hbWUCaWQGdWludDY0BW93bmVyBG5hbWULZW50aXR5X25hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzB2lzX2lkbGUEYm9vbA5yZXNvbHZlZF9jb3VudAZ1aW50MzINcGVuZGluZ19jb3VudAZ1aW50MzIQZW50aXR5X3Rhc2tfaW5mbwAECWVudGl0eV9pZAZ1aW50NjQLZW50aXR5X3R5cGUEbmFtZQp0YXNrX2NvdW50BXVpbnQ4EHNjaGVkdWxlX3N0YXJ0ZWQKdGltZV9wb2ludA9lbnRpdHlncm91cF9yb3cAAgJpZAZ1aW50NjQMcGFydGljaXBhbnRzDGVudGl0eV9yZWZbXQdleHRyYWN0AAQLZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQHc3RyYXR1bQZ1aW50MTYIcXVhbnRpdHkGdWludDMyD2V4dHJhY3Rvcl9zdGF0cwAFBHJhdGUGdWludDE2BWRyYWluBnVpbnQxNgplZmZpY2llbmN5BnVpbnQxNgVkZXB0aAZ1aW50MTYFZHJpbGwGdWludDE2C2dhbWVfY29uZmlnAAMHdmVyc2lvbgZ1aW50MzIIZGVmYXVsdHMPZW50aXR5X2RlZmF1bHRzBWl0ZW1zCml0ZW1fZGVmW10JZ2V0Y29uZmlnAAALZ2V0ZW50aXRpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/CWdldGVudGl0eQACC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAhnZXRpdGVtcwAAC2dldGxvY2F0aW9uAAIBeAVpbnQ2NAF5BWludDY0CmdldGxvY2RhdGEAAgF4BWludDY0AXkFaW50NjQJZ2V0bmVhcmJ5AAMLZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CHJlY2hhcmdlBGJvb2wJZ2V0cGxheWVyAAEHYWNjb3VudARuYW1lCmdldHN0YXJ0ZXIAAApnZXRzdHJhdHVtAAMBeAVpbnQ2NAF5BWludDY0B3N0cmF0dW0GdWludDE2DGdldHN1bW1hcmllcwACBW93bmVyBG5hbWULZW50aXR5X3R5cGUFbmFtZT8LZ3JvdXB0cmF2ZWwABAhlbnRpdGllcwxlbnRpdHlfcmVmW10BeAVpbnQ2NAF5BWludDY0CHJlY2hhcmdlBGJvb2wEaGFzaAABBXZhbHVlBnN0cmluZwdoYXNoNTEyAAEFdmFsdWUGc3RyaW5nBGluaXQAAQRzZWVkC2NoZWNrc3VtMjU2CGl0ZW1fZGVmAAMCaWQGdWludDE2CmJhc2VfcHJpY2UGdWludDMyBG1hc3MGdWludDMyCml0ZW1zX2luZm8AAQVpdGVtcwppdGVtX2RlZltdBGpvaW4AAQdhY2NvdW50BG5hbWUMbG9hZGVyX3N0YXRzAAMEbWFzcwZ1aW50MzIGdGhydXN0BnVpbnQxNghxdWFudGl0eQV1aW50OBBsb2NhdGlvbl9kZXJpdmVkAAMMc3RhdGljX3Byb3BzD2xvY2F0aW9uX3N0YXRpYwtlcG9jaF9wcm9wcw5sb2NhdGlvbl9lcG9jaARzaXplBnVpbnQxNg5sb2NhdGlvbl9lcG9jaAADBmFjdGl2ZQRib29sBXNlZWQwBXVpbnQ4BXNlZWQxBXVpbnQ4DWxvY2F0aW9uX2luZm8AAwZjb29yZHMLY29vcmRpbmF0ZXMJaXNfc3lzdGVtBGJvb2wFaXRlbXMPbG9jYXRpb25faXRlbVtdDWxvY2F0aW9uX2l0ZW0ABQJpZAZ1aW50MTYFcHJpY2UGdWludDMyBnN1cHBseQZ1aW50MTYRcmFyaXR5X211bHRpcGxpZXIGdWludDMyE2xvY2F0aW9uX211bHRpcGxpZXIGdWludDMyDGxvY2F0aW9uX3JvdwAGAmlkBnVpbnQ2NAVvd25lcgRuYW1lC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCWNhcmdvbWFzcwZ1aW50MzIFY2FyZ28MY2FyZ29faXRlbVtdCHNjaGVkdWxlCXNjaGVkdWxlPw9sb2NhdGlvbl9zdGF0aWMABQZjb29yZHMLY29vcmRpbmF0ZXMEdHlwZQ1sb2NhdGlvbl90eXBlB3N1YnR5cGUFdWludDgFc2VlZDAFdWludDgFc2VlZDEFdWludDgObW92ZW1lbnRfc3RhdHMAAgZ0aHJ1c3QGdWludDMyBWRyYWluBnVpbnQxNgtuZWFyYnlfaW5mbwAFCmNhbl90cmF2ZWwEYm9vbAdjdXJyZW50FGVudGl0eV9jdXJyZW50X3N0YXRlCXByb2plY3RlZBRlbnRpdHlfY3VycmVudF9zdGF0ZQptYXhfZW5lcmd5BnVpbnQxNgdzeXN0ZW1zD25lYXJieV9zeXN0ZW1bXQ1uZWFyYnlfc3lzdGVtAAQIZGlzdGFuY2UGdWludDY0C2VuZXJneV9jb3N0BnVpbnQ2NAtmbGlnaHRfdGltZQZ1aW50MzIIbG9jYXRpb24NbG9jYXRpb25faW5mbwZub3RpZnkAAQVldmVudAp0YXNrX2V2ZW50B3BheWxvYW4AAgdhY2NvdW50BG5hbWUGYW1vdW50BnVpbnQ2NAtwbGF5ZXJfaW5mbwANBW93bmVyBG5hbWUJaXNfcGxheWVyBGJvb2wMY29tcGFueV9uYW1lBnN0cmluZwdiYWxhbmNlBnVpbnQ2NARkZWJ0BnVpbnQzMghuZXR3b3J0aAVpbnQ2NA5hdmFpbGFibGVfbG9hbgZ1aW50NjQPbmV4dF9zaGlwX3ByaWNlBnVpbnQ2NBRuZXh0X3dhcmVob3VzZV9wcmljZQZ1aW50NjQUbmV4dF9jb250YWluZXJfcHJpY2UGdWludDY0CnNoaXBfY291bnQGdWludDY0D3dhcmVob3VzZV9jb3VudAZ1aW50NjQPY29udGFpbmVyX2NvdW50BnVpbnQ2NApwbGF5ZXJfcm93AAQFb3duZXIEbmFtZQdiYWxhbmNlBnVpbnQ2NARkZWJ0BnVpbnQzMghuZXR3b3J0aAVpbnQ2NAtwdXJnZXN1cHBseQABCG1heF9yb3dzB3VpbnQ2ND8IcmVjaGFyZ2UAAgtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAtyZXNlcnZlX3JvdwACAmlkBnVpbnQ2NAlyZW1haW5pbmcGdWludDMyB3Jlc29sdmUAAwtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAVjb3VudAd1aW50NjQ/D3Jlc29sdmVfcmVzdWx0cwAGCWVudGl0eV9pZAZ1aW50NjQLZW50aXR5X3R5cGUEbmFtZQ5yZXNvbHZlZF9jb3VudAV1aW50OBRuZXdfc2NoZWR1bGVfc3RhcnRlZAt0aW1lX3BvaW50PwtlbnRpdHlncm91cAd1aW50NjQ/DWdyb3VwX21lbWJlcnMWQl92ZWN0b3JfZW50aXR5X3JlZl9FPw5yZXNvdXJjZV9zdGF0cwAEBnB1cml0eQZ1aW50MTYHZGVuc2l0eQZ1aW50MTYKcmVhY3Rpdml0eQZ1aW50MTYJcmVzb25hbmNlBnVpbnQxNgRzYWx0AAEEc2FsdAZ1aW50NjQIc2NoZWR1bGUAAgdzdGFydGVkCnRpbWVfcG9pbnQFdGFza3MGdGFza1tdCXNlbGxpdGVtcwAEC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0B2l0ZW1faWQGdWludDE2CHF1YW50aXR5BnVpbnQzMgxzZXF1ZW5jZV9yb3cAAgNrZXkEbmFtZQV2YWx1ZQZ1aW50NjQIc2hpcF9yb3cADwJpZAZ1aW50NjQFb3duZXIEbmFtZQRuYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcwhodWxsbWFzcwZ1aW50MzIIY2FwYWNpdHkGdWludDMyBmVuZXJneQZ1aW50MTYJY2FyZ29tYXNzBnVpbnQzMgdlbmdpbmVzDm1vdmVtZW50X3N0YXRzCWdlbmVyYXRvcgxlbmVyZ3lfc3RhdHMHbG9hZGVycwxsb2FkZXJfc3RhdHMFdHJhZGUMdHJhZGVfc3RhdHM/CWV4dHJhY3RvchBleHRyYWN0b3Jfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8Ic2NoZWR1bGUJc2NoZWR1bGU/DHN0YXJ0ZXJfaW5mbwADB2JhbGFuY2UGdWludDY0BGRlYnQGdWludDY0BHNoaXALZW50aXR5X2luZm8Jc3RhdGVfcm93AAYHZW5hYmxlZARib29sBWVwb2NoBnVpbnQzMgRzYWx0BnVpbnQ2NAVzaGlwcwZ1aW50MzIEc2VlZAtjaGVja3N1bTI1NgZjb21taXQLY2hlY2tzdW0yNTYMc3RyYXR1bV9kYXRhAAIHc3RyYXR1bQxzdHJhdHVtX2luZm8Fc3RhdHMOcmVzb3VyY2Vfc3RhdHMMc3RyYXR1bV9pbmZvAAQHaXRlbV9pZAZ1aW50MTYEc2VlZAZ1aW50NjQIcmljaG5lc3MGdWludDE2B3Jlc2VydmUGdWludDMyCnN1cHBseV9yb3cABQJpZAZ1aW50NjQLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMFZXBvY2gGdWludDY0B2l0ZW1faWQGdWludDE2BnN1cHBseQZ1aW50MTYIdGFrZWxvYW4AAgdhY2NvdW50BG5hbWUGYW1vdW50BnVpbnQ2NAR0YXNrAAkEdHlwZQV1aW50OAhkdXJhdGlvbgZ1aW50MzIKY2FuY2VsYWJsZQV1aW50OAtjb29yZGluYXRlcwxjb29yZGluYXRlcz8FY2FyZ28MY2FyZ29faXRlbVtdDGVudGl0eXRhcmdldAtlbnRpdHlfcmVmPwtlbnRpdHlncm91cAd1aW50NjQ/B2NyZWRpdHMGaW50NjQ/C2VuZXJneV9jb3N0B3VpbnQxNj8KdGFza19ldmVudAAJCmV2ZW50X3R5cGUFdWludDgFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQKdGFza19pbmRleAV1aW50OAR0YXNrBHRhc2sJc3RhcnRzX2F0CnRpbWVfcG9pbnQMY29tcGxldGVzX2F0CnRpbWVfcG9pbnQKbmV3X2VuZXJneQd1aW50MTY/DHRhc2tfcmVzdWx0cwABCGVudGl0aWVzEmVudGl0eV90YXNrX2luZm9bXQt0cmFkZV9zdGF0cwABBm1hcmdpbgZ1aW50MTYIdHJhbnNmZXIABgtzb3VyY2VfdHlwZQRuYW1lCXNvdXJjZV9pZAZ1aW50NjQJZGVzdF90eXBlBG5hbWUHZGVzdF9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50MTYIcXVhbnRpdHkGdWludDMyBnRyYXZlbAAFC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAhyZWNoYXJnZQRib29sCXR5cGVzX3JvdwAEAmlkBnVpbnQ2NBNlbnRpdHlfc3VtbWFyeV90eXBlDmVudGl0eV9zdW1tYXJ5EXN0YXJ0ZXJfaW5mb190eXBlDHN0YXJ0ZXJfaW5mbxBnYW1lX2NvbmZpZ190eXBlC2dhbWVfY29uZmlnDHVwZGF0ZWNyZWRpdAACB2FjY291bnQEbmFtZQZhbW91bnQFaW50NjQKdXBkYXRlZGVidAACB2FjY291bnQEbmFtZQZhbW91bnQFaW50NjQNd2FyZWhvdXNlX3JvdwAIAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCGNhcGFjaXR5BnVpbnQzMgljYXJnb21hc3MGdWludDMyB2xvYWRlcnMMbG9hZGVyX3N0YXRzCHNjaGVkdWxlCXNjaGVkdWxlPwR3YXJwAAQLZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQBeAVpbnQ2NAF5BWludDY0CndhcnBfc3RhdHMAAQVyYW5nZQZ1aW50MzIEd2lwZQAADHdpcGVzZXF1ZW5jZQAAKwAAAEChaXYyB2FkdmFuY2XTAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBhZHZhbmNlCnN1bW1hcnk6ICdBZHZhbmNlIHR1cm4nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkFkdmFuY2UgdGhlIGdhbWUgdG8gdGhlIG5leHQgdHVybi5w1XQmT4q8PgxidXljb250YWluZXLKAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBidXljb250YWluZXIKc3VtbWFyeTogJ0J1eSBhIG5ldyBjb250YWluZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClB1cmNoYXNlIGEgbmV3IGNvbnRhaW5lciBhdCB0aGUgbG9jYXRpb24gb2YgYW4gaWRsZSBzaGlwLiBDb250YWluZXJzIHByb3ZpZGUgY2FyZ28gc3RvcmFnZSBidXQgaGF2ZSBubyBsb2FkZXJzIGFuZCBjYW5ub3QgbW92ZSBpbmRlcGVuZGVudGx5LgAAAFiq7Lw+CGJ1eWl0ZW1z3QEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYnV5aXRlbXMKc3VtbWFyeTogJ0J1eSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUHVyY2hhc2UgaXRlbXMgYW5kIGFkZCB0aGVtIHRvIGEgc2hpcCdzIGNhcmdvLgAAAKC6hr0+B2J1eXNoaXDGAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBidXlzaGlwCnN1bW1hcnk6ICdCdXkgYSBuZXcgc2hpcCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUHVyY2hhc2UgYSBuZXcgc2hpcKCwpk1dw70+DGJ1eXdhcmVob3VzZcwCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGJ1eXdhcmVob3VzZQpzdW1tYXJ5OiAnQnV5IGEgbmV3IHdhcmVob3VzZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUHVyY2hhc2UgYSBuZXcgd2FyZWhvdXNlIGF0IHRoZSBsb2NhdGlvbiBvZiBhbiBpZGxlIHNoaXAuIFdhcmVob3VzZXMgcHJvdmlkZSBjYXJnbyBzdG9yYWdlIHdpdGggbG9hZGluZy91bmxvYWRpbmcgY2FwYWJpbGl0aWVzIGJ1dCBjYW5ub3QgbW92ZS4AAAAARIWmQQZjYW5jZWzHAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjYW5jZWwKc3VtbWFyeTogJ0NhbmNlbCBzY2hlZHVsZWQgdGFza3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbmNlbCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0YXNrcyBmcm9tIHRoZSBlbmQgb2YgYW4gZW50aXR5J3Mgc2NoZWR1bGUuIFRhc2tzIHRoYXQgYXJlIGltbXV0YWJsZSBhbmQgaW4gcHJvZ3Jlc3MgY2Fubm90IGJlIGNhbmNlbGxlZC4KCi0tLQAAqBvfaVRECWNsZWFucnN2cAAAgIrH5GtURApjbGVhcnRhYmxlvgEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xlYXJ0YWJsZQpzdW1tYXJ5OiAnREVCVUc6IGNsZWFydGFibGUgYWN0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAAAGQnJUUGY29tbWl08QEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY29tbWl0CnN1bW1hcnk6ICdTZXQgY29tbWl0IHZhbHVlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpTZXQgdGhlIGluaXRpYWwgY29tbWl0IHZhbHVlIGR1cmluZyBnYW1lIGluaXRpYWxpemF0aW9uLgoKLS0tAABgNDK3JkUJY29uZmlnbG9nAAAAAACoeMxUBmVuYWJsZeIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZQpzdW1tYXJ5OiAnU2V0IGVuYWJsZWQgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZ2FtZSBvZiBTaGlwbG9hZC4KCi0tLQAAACAjc3NXB2V4dHJhY3ShAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBleHRyYWN0CnN1bW1hcnk6ICdFeHRyYWN0IHJlc291cmNlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKRXh0cmFjdCByZXNvdXJjZXMgYXQgdGhlIHNoaXAncyBjdXJyZW50IGxvY2F0aW9uLiBPbmx5IHdvcmtzIGF0IGV4dHJhY3RhYmxlIGxvY2F0aW9uIHR5cGVzLiBTY2hlZHVsZXMgYW4gZXh0cmFjdGlvbiB0YXNrIHRoYXQgY29uc3VtZXMgZW5lcmd5IGFuZCB5aWVsZHMgY2FyZ28gYmFzZWQgb24gdGhlIHNoaXAncyBleHRyYWN0b3Igc3RhdHMgYW5kIHRoZSBsb2NhdGlvbidzIHJlc291cmNlIGNvbXBvc2l0aW9uLgAAYG5NirJiCWdldGNvbmZpZwAAsHLZ5amyYgtnZXRlbnRpdGllc6QCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0aWVzCnN1bW1hcnk6ICdHZXQgYWxsIGVudGl0aWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBmdWxsIGVudGl0eSBpbmZvIGZvciBhbGwgZW50aXRpZXMgb3duZWQgYnkgYSBwbGF5ZXIuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgAA8NnlqbJiCWdldGVudGl0eaICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0eQpzdW1tYXJ5OiAnR2V0IGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbiBlbnRpdHkgaW5jbHVkaW5nIGlkZW50aXR5LCBjYXJnbywgc2NoZWR1bGUgc3RhdGUsIGFuZCB0eXBlLXNwZWNpZmljIGZpZWxkcy4AAABYquyyYghnZXRpdGVtc5oCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1zCnN1bW1hcnk6ICdHZXQgYWxsIGF2YWlsYWJsZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGl0ZW1zIGluIHRoZSBnYW1lIGluY2x1ZGluZyB0aGVpciBpZCwgYmFzZSBwcmljZSwgYW5kIG1hc3MuACZ12SAas2ILZ2V0bG9jYXRpb27iAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NhdGlvbgpzdW1tYXJ5OiAnR2V0IGxvY2F0aW9uIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgbG9jYXRpb24gaW5jbHVkaW5nIHdoZXRoZXIgYSBzeXN0ZW0gZXhpc3RzLCBhbmQgZm9yIGVhY2ggaXRlbTogcHJpY2UsIHN1cHBseSwgcmFyaXR5IG11bHRpcGxpZXIsIGFuZCBsb2NhdGlvbiBtdWx0aXBsaWVyLgCAySYhGrNiCmdldGxvY2RhdGH+Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NkYXRhCnN1bW1hcnk6ICdHZXQgZGVyaXZlZCBsb2NhdGlvbiBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGRlcml2ZWQgbG9jYXRpb24gZGF0YSBpbmNsdWRpbmcgc3RhdGljIHByb3BlcnRpZXMgKHR5cGUsIGRpZmZpY3VsdHksIHNlZWRzKSBmcm9tIHRoZSBnYW1lIHNlZWQgYW5kIGVwb2NoLXNwZWNpZmljIHByb3BlcnRpZXMgKGFjdGl2ZSwgc2VlZHMpIGZyb20gdGhlIGN1cnJlbnQgZXBvY2ggc2VlZC4AAPDnGjWzYglnZXRuZWFyYnneAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRuZWFyYnkKc3VtbWFyeTogJ0dldCBuZWFyYnkgcmVhY2hhYmxlIHN5c3RlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgbmVhcmJ5IHN5c3RlbXMgcmVhY2hhYmxlIGJ5IGFuIGVudGl0eSBmcm9tIGl0cyBwcm9qZWN0ZWQgbG9jYXRpb24uIFJldHVybnMgY3VycmVudCBzdGF0ZSAod2l0aCBjb21wbGV0ZWQgdGFza3MgcmVzb2x2ZWQpLCBwcm9qZWN0ZWQgc3RhdGUgKGFmdGVyIGFsbCBzY2hlZHVsZWQgdGFza3MpLCBhbmQgYSBsaXN0IG9mIHJlYWNoYWJsZSBzeXN0ZW1zIHdpdGggZGlzdGFuY2UsIGVuZXJneSBjb3N0LCBmbGlnaHQgdGltZSwgYW5kIG1hcmtldCBpbmZvcm1hdGlvbi4AALjKm1izYglnZXRwbGF5ZXL9Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRwbGF5ZXIKc3VtbWFyeTogJ0dldCBwbGF5ZXIgaW5mb3JtYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwbGF5ZXIgaW5jbHVkaW5nIGJhbGFuY2UsIGRlYnQsIG5ldHdvcnRoLCBlbnRpdHkgY291bnRzLCBhbmQgcHJpY2luZyBmb3IgbmV4dCBwdXJjaGFzZXMuIFJldHVybnMgaXNfcGxheWVyPWZhbHNlIGlmIHRoZSBhY2NvdW50IGhhcyBub3Qgam9pbmVkIHRoZSBnYW1lLgDAVfmajLNiCmdldHN0YXJ0ZXKFAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdGFydGVyCnN1bW1hcnk6ICdHZXQgc3RhcnRlciBzaGlwIGFuZCBiYWxhbmNlIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHRoZSBzdGFydGVyIHNoaXAgc3RhdHMgYW5kIGluaXRpYWwgYmFsYW5jZSBhIG5ldyBwbGF5ZXIgd291bGQgcmVjZWl2ZSB1cG9uIGpvaW5pbmcuIFVzZWQgZm9yIG9uYm9hcmRpbmcgVUkgdG8gZGlzcGxheSB3aGF0IHBsYXllcnMgd2lsbCBnZXQgYmVmb3JlIHRoZXkgcmVnaXN0ZXIuAIDU2dyMs2IKZ2V0c3RyYXR1bQCAlbtGSo2zYgxnZXRzdW1tYXJpZXPoAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdW1tYXJpZXMKc3VtbWFyeTogJ0dldCBlbnRpdHkgc3VtbWFyaWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBsaWdodHdlaWdodCBzdW1tYXJpZXMgb2YgYWxsIGVudGl0aWVzIG93bmVkIGJ5IGEgcGxheWVyIGluY2x1ZGluZyB0eXBlLCBpZCwgb3duZXIsIG5hbWUsIGxvY2F0aW9uLCBhbmQgaWRsZSBzdGF0dXMuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgCi2ubmqullC2dyb3VwdHJhdmVsmgQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ3JvdXB0cmF2ZWwKc3VtbWFyeTogJ01vdmUgbXVsdGlwbGUgZW50aXRpZXMgdG9nZXRoZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYXRlIGdyb3VwIHRyYXZlbCBmb3IgbXVsdGlwbGUgZW50aXRpZXMgdG8gYSBkZXN0aW5hdGlvbi4gQWxsIGVudGl0aWVzIG11c3QgYmUgYXQgdGhlIHNhbWUgbG9jYXRpb24gYW5kIG93bmVkIGJ5IHRoZSBjYWxsZXIuIEF0IGxlYXN0IG9uZSBlbnRpdHkgd2l0aCBlbmdpbmVzIGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgdGhydXN0LiBGbGlnaHQgZHVyYXRpb24gaXMgY2FsY3VsYXRlZCBmcm9tIGNvbWJpbmVkIHRocnVzdCBhbmQgdG90YWwgbWFzcyBvZiBhbGwgZW50aXRpZXMuIENyZWF0ZXMgYW4gZW50aXR5Z3JvdXAgZm9yIGF0b21pYyByZXNvbHV0aW9uIGFuZCBjYW5jZWxsYXRpb24uAAAAAADQsGkEaGFzaP0BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGhhc2gKc3VtbWFyeTogJ0NhbGN1bGF0ZSBzaGEyNTYgaGFzaCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ2FsY3VsYXRlcyB0aGUgc2hhMjU2IGhhc2ggb2YgYSBzdHJpbmcgYmFzZWQgdXNpbmcgdGhlIGdhbWUgc2VlZC4KCi0tLQAAAECE0rBpB2hhc2g1MTL7AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBoYXNoNTEyCnN1bW1hcnk6ICdDYWxjdWxhdGUgc2hhNTEyIGhhc2gnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbGN1bGF0ZXMgdGhlIHNoYTUxMiBoYXNoIG9mIGEgc3RyaW5nIGJhc2VkIHVzaW5nIHRoZSBnYW1lIHNlZWQuAAAAAACQ3XQEaW5pdPoBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGluaXQKc3VtbWFyeTogJ0luaXRpYWxpemUgZ2FtZSBzZWVkJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbml0aWFsaXplIGEgdGhlIGdhbWVzIHNlZWQgYW5kIHNlZWQgdmFsdWVzIHRvIGJvb3RzdHJhcCBnYW1lIHN0YXRlLgAAAAAAMB19BGpvaW7JAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBqb2luCnN1bW1hcnk6ICdKb2luIGEgZ2FtZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSm9pbiBhIGdhbWUgb2YgU2hpcGxvYWQKCi0tLQAAAAD45TKdBm5vdGlmeYoDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IG5vdGlmeQpzdW1tYXJ5OiAnVGFzayBsaWZlY3ljbGUgbm90aWZpY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnRlcm5hbCBhY3Rpb24gdGhhdCBub3RpZmllcyBlbnRpdHkgb3duZXJzIG9mIHRhc2sgbGlmZWN5Y2xlIGV2ZW50cyAocmVzb2x2ZWQsIGNhbmNlbGxlZCkuIENhbGxlZCBpbmxpbmUgd2hlbiB0YXNrcyBjaGFuZ2Ugc3RhdGUuIFVzZXMgcmVxdWlyZV9yZWNpcGllbnQgdG8gZW5hYmxlIG9mZi1jaGFpbiBtb25pdG9yaW5nIHZpYSBhY3Rpb24gdHJhY2VzLgAAAGAaGr2pB3BheWxvYW6vAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBwYXlsb2FuCnN1bW1hcnk6ICdMb2FuIFBheW1lbnQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AfKxVY8WurgtwdXJnZXN1cHBseekBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHB1cmdlc3VwcGx5CnN1bW1hcnk6ICdVcGRhdGUgR2FtZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUHVyZ2Ugb2xkIHN1cHBseSByZWNvcmRzIGFuZCBoZWxwIGNsZWFudXAgZ2FtZSBzdGF0ZS4AAACKXdOQughyZWNoYXJnZdICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJlY2hhcmdlCnN1bW1hcnk6ICdSZWNoYXJnZSBzaGlwIGVuZXJneScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2NoZWR1bGUgYSByZWNoYXJnZSB0YXNrIGZvciBhbiBlbnRpdHkgdG8gcmVzdG9yZSBlbmVyZ3kgdG8gZnVsbCBjYXBhY2l0eS4gVGhlIHJlY2hhcmdlIGR1cmF0aW9uIGRlcGVuZHMgb24gY3VycmVudCBlbmVyZ3kgbGV2ZWwgYW5kIHJlY2hhcmdlIHJhdGUuCgotLS0AAABA7UixugdyZXNvbHZl1QMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcmVzb2x2ZQpzdW1tYXJ5OiAnQ29tcGxldGUgc2NoZWR1bGVkIHRhc2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZXNvbHZlIGNvbXBsZXRlZCB0YXNrcyBpbiBhbiBlbnRpdHkncyBzY2hlZHVsZSwgYXBwbHlpbmcgdGhlaXIgZWZmZWN0cyAocmVjaGFyZ2UgZW5lcmd5LCB1cGRhdGUgbG9jYXRpb24sIGxvYWQvdW5sb2FkIGNhcmdvKS4gSWYgY291bnQgaXMgc3BlY2lmaWVkLCByZXNvbHZlIGV4YWN0bHkgdGhhdCBtYW55IHRhc2tzOyBvdGhlcndpc2UgcmVzb2x2ZSBhbGwgY29tcGxldGVkIHRhc2tzLiBGYWlscyBpZiBjb3VudCBleGNlZWRzIHRoZSBudW1iZXIgb2YgY29tcGxldGVkIHRhc2tzLgoKLS0tAAAAAACQo8EEc2FsdN0BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNhbHQKc3VtbWFyeTogJ0FwcGVuZCBTYWx0JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpBZGQgYWRkaXRpb25hbCBzYWx0IHRvIHRoZSBuZXh0IGVwb2NoIHNlZWQuCgotLS0AAMBSZRejwglzZWxsaXRlbXPVAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzZWxsaXRlbXMKc3VtbWFyeTogJ1NlbGwgaXRlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClNlbGwgaXRlbXMgZnJvbSBhIHNoaXAncyBjYXJnby4KCi0tLQAAANPQqKDJCHRha2Vsb2Fu6gEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdGFrZWxvYW4Kc3VtbWFyeTogJ0NyZWRpdCBMb2FuJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpCb3Jyb3cgY3JlZGl0cyBmcm9tIHRoZSBiYW5rIHRoYXQgd2lsbCBuZWVkIHRvIGJlIHJlcGFpZC4AAABXLTzNzQh0cmFuc2ZlcsgDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHRyYW5zZmVyCnN1bW1hcnk6ICdUcmFuc2ZlciBjYXJnbyBiZXR3ZWVuIGVudGl0aWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUcmFuc2ZlciBjYXJnbyBiZXR3ZWVuIHR3byBlbnRpdGllcyBhdCB0aGUgc2FtZSBsb2NhdGlvbi4gQm90aCBlbnRpdGllcyBtdXN0IGJlIG93bmVkIGJ5IHRoZSBjYWxsZXIgYW5kIGF0IGxlYXN0IG9uZSBtdXN0IGhhdmUgbG9hZGVycy4gQ3JlYXRlcyBsb2FkIGFuZCB1bmxvYWQgdGFza3Mgb24gYm90aCBlbnRpdGllcyB3aXRoIGR1cmF0aW9uIGJhc2VkIG9uIGNvbWJpbmVkIGxvYWRlciBjYXBhY2l0eSBhbmQgWi1kaXN0YW5jZSBiZXR3ZWVuIHRoZW0uAAAAAES1zc0GdHJhdmVsywItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdHJhdmVsCnN1bW1hcnk6ICdNb3ZlIGEgc2hpcCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5pdGlhdGUgdHJhdmVsIG9mIGFuIGVudGl0eSBmcm9tIGl0cyBjdXJyZW50IGxvY2F0aW9uIHRvIGEgbmV3IGRlc3RpbmF0aW9uLgoKLS0tCgpUaGlzIGFjdGlvbiBkZXRlcm1pbmVzIHRoZSBtYXJrZXQgcHJpY2Ugb2YgYWxsIGl0ZW1zIGF0IGEgZ2l2ZW4gbG9jYXRpb24ukF1SF6lsUtUMdXBkYXRlY3JlZGl0wgEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdXBkYXRlY3JlZGl0CnN1bW1hcnk6ICdERUJVRzogdXBkYXRlY3JlZGl0IGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQBAPiqpbFLVCnVwZGF0ZWRlYnS+AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB1cGRhdGVkZWJ0CnN1bW1hcnk6ICdERUJVRzogdXBkYXRlZGVidCBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AAAAAAFCv4QR3YXJwAAAAAAAAoKrjBHdpcGWyAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3aXBlCnN1bW1hcnk6ICdERUJVRzogd2lwZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS2g0FTaKqyq4wx3aXBlc2VxdWVuY2XCAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3aXBlc2VxdWVuY2UKc3VtbWFyeTogJ0RFQlVHOiB3aXBlc2VxdWVuY2UgYWN0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tDAAAAAAAyq5BA2k2NAAACWNhcmdvX3JvdwAAuGo6kydFA2k2NAAADWNvbnRhaW5lcl9yb3cAqqaX+ezyVANpNjQAAA9lbnRpdHlncm91cF9yb3cAAACTumwQjQNpNjQAAAxsb2NhdGlvbl9yb3cAAAAAXOVNrANpNjQAAApwbGF5ZXJfcm93AAAAQO2rsLoDaTY0AAALcmVzZXJ2ZV9yb3cAAAAKTaWtwgNpNjQAAAxzZXF1ZW5jZV9yb3cAAAAAAFBdwwNpNjQAAAhzaGlwX3JvdwAAAAAAlU3GA2k2NAAACXN0YXRlX3JvdwAAAAD4WKvGA2k2NAAACnN1cHBseV9yb3cAAAAAAKyqzwNpNjQAAAl0eXBlc19yb3cAAFBY06au4QNpNjQAAA13YXJlaG91c2Vfcm93ARFTaGlwbG9hZCAoU2VydmVyKRFTaGlwbG9hZCAoU2VydmVyKQAAABcAAABYquy8Pgx0YXNrX3Jlc3VsdHMAAAAARIWmQQ5jYW5jZWxfcmVzdWx0cwAAACAjc3NXDHRhc2tfcmVzdWx0cwAAYG5NirJiC2dhbWVfY29uZmlnALBy2eWpsmINZW50aXR5X2luZm9bXQAA8NnlqbJiC2VudGl0eV9pbmZvAAAAWKrssmIKaXRlbXNfaW5mbwAmddkgGrNiDWxvY2F0aW9uX2luZm8AgMkmIRqzYhBsb2NhdGlvbl9kZXJpdmVkAADw5xo1s2ILbmVhcmJ5X2luZm8AALjKm1izYgtwbGF5ZXJfaW5mbwDAVfmajLNiDHN0YXJ0ZXJfaW5mbwCA1NncjLNiDHN0cmF0dW1fZGF0YYCVu0ZKjbNiEGVudGl0eV9zdW1tYXJ5W10Aotrm5qrpZQx0YXNrX3Jlc3VsdHMAAAAAANCwaQtjaGVja3N1bTI1NgAAAECE0rBpC2NoZWNrc3VtNTEyAAAAil3TkLoMdGFza19yZXN1bHRzAAAAQO1IsboPcmVzb2x2ZV9yZXN1bHRzAADAUmUXo8IMdGFza19yZXN1bHRzAAAAVy08zc0MdGFza19yZXN1bHRzAAAAAES1zc0MdGFza19yZXN1bHRzAAAAAABQr+EMdGFza19yZXN1bHRz');
208
+ const abiBlob = Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDhSB2FkdmFuY2UAAgZyZXZlYWwGc3RyaW5nBmNvbW1pdAtjaGVja3N1bTI1NgZjYW5jZWwAAwtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAVjb3VudAZ1aW50NjQOY2FuY2VsX3Jlc3VsdHMABgllbnRpdHlfaWQGdWludDY0C2VudGl0eV90eXBlBG5hbWUPY2FuY2VsbGVkX2NvdW50BXVpbnQ4EHNjaGVkdWxlX3N0YXJ0ZWQLdGltZV9wb2ludD8LZW50aXR5Z3JvdXAHdWludDY0Pw1ncm91cF9tZW1iZXJzFkJfdmVjdG9yX2VudGl0eV9yZWZfRT8KY2FyZ29faXRlbQADB2l0ZW1faWQGdWludDE2CHF1YW50aXR5BnVpbnQzMgRzZWVkB3VpbnQ2ND8JY2FyZ29fcm93AAUCaWQGdWludDY0CWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0BHNlZWQGdWludDY0CWNsZWFucnN2cAACBWVwb2NoBnVpbnQ2NAhtYXhfcm93cwZ1aW50NjQKY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/BmNvbW1pdAABBmNvbW1pdAtjaGVja3N1bTI1Ngljb25maWdsb2cAAQZjb25maWcLZ2FtZV9jb25maWcNY29udGFpbmVyX3JvdwAIAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCGh1bGxtYXNzBnVpbnQzMghjYXBhY2l0eQZ1aW50MzIJY2FyZ29tYXNzBnVpbnQzMghzY2hlZHVsZQlzY2hlZHVsZT8LY29vcmRpbmF0ZXMAAwF4BWludDY0AXkFaW50NjQBegd1aW50MTY/BWNyYWZ0AAULZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQJcmVjaXBlX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIGaW5wdXRzDGNhcmdvX2l0ZW1bXQ1jcmFmdGVyX3N0YXRzAAIFc3BlZWQGdWludDE2BWRyYWluBnVpbnQxNgxjcmVhdGVlbnRpdHkABQVvd25lcgRuYW1lC2VudGl0eV90eXBlBG5hbWULZW50aXR5X25hbWUGc3RyaW5nAXgFaW50NjQBeQVpbnQ2NAZkZXBsb3kABQtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NA5wYWNrZWRfaXRlbV9pZAZ1aW50MTYEc2VlZAZ1aW50NjQLZW50aXR5X25hbWUGc3RyaW5nBmVuYWJsZQABB2VuYWJsZWQEYm9vbAxlbmVyZ3lfc3RhdHMAAghjYXBhY2l0eQZ1aW50MTYIcmVjaGFyZ2UGdWludDE2FGVudGl0eV9jdXJyZW50X3N0YXRlAAILY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMGZW5lcmd5BnVpbnQxNg9lbnRpdHlfZGVmYXVsdHMAEA1zaGlwX2h1bGxtYXNzBnVpbnQzMg1zaGlwX2NhcGFjaXR5BnVpbnQzMgtzaGlwX2VuZXJneQZ1aW50MTYGc2hpcF96BnVpbnQxNgxzaGlwX2VuZ2luZXMObW92ZW1lbnRfc3RhdHMOc2hpcF9nZW5lcmF0b3IMZW5lcmd5X3N0YXRzDHNoaXBfbG9hZGVycwxsb2FkZXJfc3RhdHMOc2hpcF9leHRyYWN0b3IPZXh0cmFjdG9yX3N0YXRzCXNoaXBfd2FycAp3YXJwX3N0YXRzDHNoaXBfY3JhZnRlcg1jcmFmdGVyX3N0YXRzEndhcmVob3VzZV9jYXBhY2l0eQZ1aW50MzILd2FyZWhvdXNlX3oGdWludDE2EXdhcmVob3VzZV9sb2FkZXJzDGxvYWRlcl9zdGF0cxJjb250YWluZXJfaHVsbG1hc3MGdWludDMyEmNvbnRhaW5lcl9jYXBhY2l0eQZ1aW50MzILY29udGFpbmVyX3oGdWludDE2C2VudGl0eV9pbmZvABcEdHlwZQRuYW1lAmlkBnVpbnQ2NAVvd25lcgRuYW1lC2VudGl0eV9uYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcwljYXJnb21hc3MGdWludDMyBWNhcmdvDGNhcmdvX2l0ZW1bXQdsb2FkZXJzDWxvYWRlcl9zdGF0cz8GZW5lcmd5B3VpbnQxNj8IaHVsbG1hc3MHdWludDMyPwdlbmdpbmVzD21vdmVtZW50X3N0YXRzPwlnZW5lcmF0b3INZW5lcmd5X3N0YXRzPwhjYXBhY2l0eQd1aW50MzI/CWV4dHJhY3RvchBleHRyYWN0b3Jfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8HY3JhZnRlcg5jcmFmdGVyX3N0YXRzPwdpc19pZGxlBGJvb2wMY3VycmVudF90YXNrBXRhc2s/FGN1cnJlbnRfdGFza19lbGFwc2VkBnVpbnQzMhZjdXJyZW50X3Rhc2tfcmVtYWluaW5nBnVpbnQzMg1wZW5kaW5nX3Rhc2tzBnRhc2tbXQdpZGxlX2F0C3RpbWVfcG9pbnQ/CHNjaGVkdWxlCXNjaGVkdWxlPwplbnRpdHlfcmVmAAILZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0DmVudGl0eV9zdW1tYXJ5AAgEdHlwZQRuYW1lAmlkBnVpbnQ2NAVvd25lcgRuYW1lC2VudGl0eV9uYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcwdpc19pZGxlBGJvb2wOcmVzb2x2ZWRfY291bnQGdWludDMyDXBlbmRpbmdfY291bnQGdWludDMyEGVudGl0eV90YXNrX2luZm8ABAllbnRpdHlfaWQGdWludDY0C2VudGl0eV90eXBlBG5hbWUKdGFza19jb3VudAV1aW50OBBzY2hlZHVsZV9zdGFydGVkCnRpbWVfcG9pbnQPZW50aXR5Z3JvdXBfcm93AAICaWQGdWludDY0DHBhcnRpY2lwYW50cwxlbnRpdHlfcmVmW10HZXh0cmFjdAAEC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0B3N0cmF0dW0GdWludDE2CHF1YW50aXR5BnVpbnQzMg9leHRyYWN0b3Jfc3RhdHMABQRyYXRlBnVpbnQxNgVkcmFpbgZ1aW50MTYKZWZmaWNpZW5jeQZ1aW50MTYFZGVwdGgGdWludDE2BWRyaWxsBnVpbnQxNgtnYW1lX2NvbmZpZwADB3ZlcnNpb24GdWludDMyCGRlZmF1bHRzD2VudGl0eV9kZWZhdWx0cwVpdGVtcwppdGVtX2RlZltdCWdldGNvbmZpZwAAC2dldGVudGl0aWVzAAIFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQVuYW1lPwlnZXRlbnRpdHkAAgtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQIZ2V0aXRlbXMAAAtnZXRsb2NhdGlvbgACAXgFaW50NjQBeQVpbnQ2NApnZXRsb2NkYXRhAAIBeAVpbnQ2NAF5BWludDY0CWdldG5lYXJieQADC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAhyZWNoYXJnZQRib29sCWdldHBsYXllcgABB2FjY291bnQEbmFtZQpnZXRzdGFydGVyAAAKZ2V0c3RyYXR1bQADAXgFaW50NjQBeQVpbnQ2NAdzdHJhdHVtBnVpbnQxNgxnZXRzdW1tYXJpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/C2dyb3VwdHJhdmVsAAQIZW50aXRpZXMMZW50aXR5X3JlZltdAXgFaW50NjQBeQVpbnQ2NAhyZWNoYXJnZQRib29sBGhhc2gAAQV2YWx1ZQZzdHJpbmcHaGFzaDUxMgABBXZhbHVlBnN0cmluZwRpbml0AAEEc2VlZAtjaGVja3N1bTI1NghpdGVtX2RlZgACAmlkBnVpbnQxNgRtYXNzBnVpbnQzMgppdGVtc19pbmZvAAEFaXRlbXMKaXRlbV9kZWZbXQRqb2luAAEHYWNjb3VudARuYW1lDGxvYWRlcl9zdGF0cwADBG1hc3MGdWludDMyBnRocnVzdAZ1aW50MTYIcXVhbnRpdHkFdWludDgQbG9jYXRpb25fZGVyaXZlZAADDHN0YXRpY19wcm9wcw9sb2NhdGlvbl9zdGF0aWMLZXBvY2hfcHJvcHMObG9jYXRpb25fZXBvY2gEc2l6ZQZ1aW50MTYObG9jYXRpb25fZXBvY2gAAwZhY3RpdmUEYm9vbAVzZWVkMAV1aW50OAVzZWVkMQV1aW50OA1sb2NhdGlvbl9pbmZvAAIGY29vcmRzC2Nvb3JkaW5hdGVzCWlzX3N5c3RlbQRib29sDGxvY2F0aW9uX3JvdwAGAmlkBnVpbnQ2NAVvd25lcgRuYW1lC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCWNhcmdvbWFzcwZ1aW50MzIFY2FyZ28MY2FyZ29faXRlbVtdCHNjaGVkdWxlCXNjaGVkdWxlPw9sb2NhdGlvbl9zdGF0aWMABQZjb29yZHMLY29vcmRpbmF0ZXMEdHlwZQ1sb2NhdGlvbl90eXBlB3N1YnR5cGUFdWludDgFc2VlZDAFdWludDgFc2VlZDEFdWludDgObW92ZW1lbnRfc3RhdHMAAgZ0aHJ1c3QGdWludDMyBWRyYWluBnVpbnQxNgtuZWFyYnlfaW5mbwAFCmNhbl90cmF2ZWwEYm9vbAdjdXJyZW50FGVudGl0eV9jdXJyZW50X3N0YXRlCXByb2plY3RlZBRlbnRpdHlfY3VycmVudF9zdGF0ZQptYXhfZW5lcmd5BnVpbnQxNgdzeXN0ZW1zD25lYXJieV9zeXN0ZW1bXQ1uZWFyYnlfc3lzdGVtAAQIZGlzdGFuY2UGdWludDY0C2VuZXJneV9jb3N0BnVpbnQ2NAtmbGlnaHRfdGltZQZ1aW50MzIIbG9jYXRpb24NbG9jYXRpb25faW5mbwZub3RpZnkAAQVldmVudAp0YXNrX2V2ZW50C3BsYXllcl9pbmZvAAYFb3duZXIEbmFtZQlpc19wbGF5ZXIEYm9vbAxjb21wYW55X25hbWUGc3RyaW5nCnNoaXBfY291bnQGdWludDY0D3dhcmVob3VzZV9jb3VudAZ1aW50NjQPY29udGFpbmVyX2NvdW50BnVpbnQ2NApwbGF5ZXJfcm93AAEFb3duZXIEbmFtZQhyZWNoYXJnZQACC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0C3Jlc2VydmVfcm93AAICaWQGdWludDY0CXJlbWFpbmluZwZ1aW50MzIHcmVzb2x2ZQADC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0BWNvdW50B3VpbnQ2ND8PcmVzb2x2ZV9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lDnJlc29sdmVkX2NvdW50BXVpbnQ4FG5ld19zY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/DnJlc291cmNlX3N0YXRzAAMFc3RhdDEGdWludDE2BXN0YXQyBnVpbnQxNgVzdGF0MwZ1aW50MTYEc2FsdAABBHNhbHQGdWludDY0CHNjaGVkdWxlAAIHc3RhcnRlZAp0aW1lX3BvaW50BXRhc2tzBnRhc2tbXQxzZXF1ZW5jZV9yb3cAAgNrZXkEbmFtZQV2YWx1ZQZ1aW50NjQIc2hpcF9yb3cADwJpZAZ1aW50NjQFb3duZXIEbmFtZQRuYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcwhodWxsbWFzcwZ1aW50MzIIY2FwYWNpdHkGdWludDMyBmVuZXJneQZ1aW50MTYJY2FyZ29tYXNzBnVpbnQzMgdlbmdpbmVzDm1vdmVtZW50X3N0YXRzCWdlbmVyYXRvcgxlbmVyZ3lfc3RhdHMHbG9hZGVycwxsb2FkZXJfc3RhdHMJZXh0cmFjdG9yEGV4dHJhY3Rvcl9zdGF0cz8Ed2FycAt3YXJwX3N0YXRzPwdjcmFmdGVyDmNyYWZ0ZXJfc3RhdHM/CHNjaGVkdWxlCXNjaGVkdWxlPwpzcGF3bmNhcmdvAAMJZW50aXR5X2lkBnVpbnQ2NAdpdGVtX2lkBnVpbnQ2NAhxdWFudGl0eQZ1aW50NjQMc3RhcnRlcl9pbmZvAAEEc2hpcAtlbnRpdHlfaW5mbwlzdGF0ZV9yb3cABgdlbmFibGVkBGJvb2wFZXBvY2gGdWludDMyBHNhbHQGdWludDY0BXNoaXBzBnVpbnQzMgRzZWVkC2NoZWNrc3VtMjU2BmNvbW1pdAtjaGVja3N1bTI1NgxzdHJhdHVtX2RhdGEAAgdzdHJhdHVtDHN0cmF0dW1faW5mbwVzdGF0cw5yZXNvdXJjZV9zdGF0cwxzdHJhdHVtX2luZm8ABAdpdGVtX2lkBnVpbnQxNgRzZWVkBnVpbnQ2NAhyaWNobmVzcwZ1aW50MTYHcmVzZXJ2ZQZ1aW50MzIEdGFzawAIBHR5cGUFdWludDgIZHVyYXRpb24GdWludDMyCmNhbmNlbGFibGUFdWludDgLY29vcmRpbmF0ZXMMY29vcmRpbmF0ZXM/BWNhcmdvDGNhcmdvX2l0ZW1bXQxlbnRpdHl0YXJnZXQLZW50aXR5X3JlZj8LZW50aXR5Z3JvdXAHdWludDY0PwtlbmVyZ3lfY29zdAd1aW50MTY/CnRhc2tfZXZlbnQACQpldmVudF90eXBlBXVpbnQ4BW93bmVyBG5hbWULZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CnRhc2tfaW5kZXgFdWludDgEdGFzawR0YXNrCXN0YXJ0c19hdAp0aW1lX3BvaW50DGNvbXBsZXRlc19hdAp0aW1lX3BvaW50Cm5ld19lbmVyZ3kHdWludDE2Pwx0YXNrX3Jlc3VsdHMAAQhlbnRpdGllcxJlbnRpdHlfdGFza19pbmZvW10IdHJhbnNmZXIABgtzb3VyY2VfdHlwZQRuYW1lCXNvdXJjZV9pZAZ1aW50NjQJZGVzdF90eXBlBG5hbWUHZGVzdF9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50MTYIcXVhbnRpdHkGdWludDMyBnRyYXZlbAAFC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAhyZWNoYXJnZQRib29sCXR5cGVzX3JvdwAEAmlkBnVpbnQ2NBNlbnRpdHlfc3VtbWFyeV90eXBlDmVudGl0eV9zdW1tYXJ5EXN0YXJ0ZXJfaW5mb190eXBlDHN0YXJ0ZXJfaW5mbxBnYW1lX2NvbmZpZ190eXBlC2dhbWVfY29uZmlnDXdhcmVob3VzZV9yb3cACAJpZAZ1aW50NjQFb3duZXIEbmFtZQRuYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcwhjYXBhY2l0eQZ1aW50MzIJY2FyZ29tYXNzBnVpbnQzMgdsb2FkZXJzDGxvYWRlcl9zdGF0cwhzY2hlZHVsZQlzY2hlZHVsZT8Ed2FycAAEC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAp3YXJwX3N0YXRzAAEFcmFuZ2UGdWludDMyBHdpcGUAAAx3aXBlc2VxdWVuY2UAACUAAABAoWl2MgdhZHZhbmNl0wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWR2YW5jZQpzdW1tYXJ5OiAnQWR2YW5jZSB0dXJuJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpBZHZhbmNlIHRoZSBnYW1lIHRvIHRoZSBuZXh0IHR1cm4uAAAAAESFpkEGY2FuY2VsxwItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2FuY2VsCnN1bW1hcnk6ICdDYW5jZWwgc2NoZWR1bGVkIHRhc2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDYW5jZWwgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGFza3MgZnJvbSB0aGUgZW5kIG9mIGFuIGVudGl0eSdzIHNjaGVkdWxlLiBUYXNrcyB0aGF0IGFyZSBpbW11dGFibGUgYW5kIGluIHByb2dyZXNzIGNhbm5vdCBiZSBjYW5jZWxsZWQuCgotLS0AAKgb32lURAljbGVhbnJzdnAAAICKx+RrVEQKY2xlYXJ0YWJsZb4BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsZWFydGFibGUKc3VtbWFyeTogJ0RFQlVHOiBjbGVhcnRhYmxlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAABkJyVFBmNvbW1pdPEBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNvbW1pdApzdW1tYXJ5OiAnU2V0IGNvbW1pdCB2YWx1ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2V0IHRoZSBpbml0aWFsIGNvbW1pdCB2YWx1ZSBkdXJpbmcgZ2FtZSBpbml0aWFsaXphdGlvbi4KCi0tLQAAYDQytyZFCWNvbmZpZ2xvZwAAAAAAgLzMRQVjcmFmdADgs8tTqWzURQxjcmVhdGVlbnRpdHkAAAAAAHgaq0oGZGVwbG95AAAAAACoeMxUBmVuYWJsZeIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZQpzdW1tYXJ5OiAnU2V0IGVuYWJsZWQgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZ2FtZSBvZiBTaGlwbG9hZC4KCi0tLQAAACAjc3NXB2V4dHJhY3ShAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBleHRyYWN0CnN1bW1hcnk6ICdFeHRyYWN0IHJlc291cmNlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKRXh0cmFjdCByZXNvdXJjZXMgYXQgdGhlIHNoaXAncyBjdXJyZW50IGxvY2F0aW9uLiBPbmx5IHdvcmtzIGF0IGV4dHJhY3RhYmxlIGxvY2F0aW9uIHR5cGVzLiBTY2hlZHVsZXMgYW4gZXh0cmFjdGlvbiB0YXNrIHRoYXQgY29uc3VtZXMgZW5lcmd5IGFuZCB5aWVsZHMgY2FyZ28gYmFzZWQgb24gdGhlIHNoaXAncyBleHRyYWN0b3Igc3RhdHMgYW5kIHRoZSBsb2NhdGlvbidzIHJlc291cmNlIGNvbXBvc2l0aW9uLgAAYG5NirJiCWdldGNvbmZpZwAAsHLZ5amyYgtnZXRlbnRpdGllc6QCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0aWVzCnN1bW1hcnk6ICdHZXQgYWxsIGVudGl0aWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBmdWxsIGVudGl0eSBpbmZvIGZvciBhbGwgZW50aXRpZXMgb3duZWQgYnkgYSBwbGF5ZXIuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgAA8NnlqbJiCWdldGVudGl0eaICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0eQpzdW1tYXJ5OiAnR2V0IGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbiBlbnRpdHkgaW5jbHVkaW5nIGlkZW50aXR5LCBjYXJnbywgc2NoZWR1bGUgc3RhdGUsIGFuZCB0eXBlLXNwZWNpZmljIGZpZWxkcy4AAABYquyyYghnZXRpdGVtc5oCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1zCnN1bW1hcnk6ICdHZXQgYWxsIGF2YWlsYWJsZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGl0ZW1zIGluIHRoZSBnYW1lIGluY2x1ZGluZyB0aGVpciBpZCwgYmFzZSBwcmljZSwgYW5kIG1hc3MuACZ12SAas2ILZ2V0bG9jYXRpb27iAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NhdGlvbgpzdW1tYXJ5OiAnR2V0IGxvY2F0aW9uIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgbG9jYXRpb24gaW5jbHVkaW5nIHdoZXRoZXIgYSBzeXN0ZW0gZXhpc3RzLCBhbmQgZm9yIGVhY2ggaXRlbTogcHJpY2UsIHN1cHBseSwgcmFyaXR5IG11bHRpcGxpZXIsIGFuZCBsb2NhdGlvbiBtdWx0aXBsaWVyLgCAySYhGrNiCmdldGxvY2RhdGH+Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NkYXRhCnN1bW1hcnk6ICdHZXQgZGVyaXZlZCBsb2NhdGlvbiBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGRlcml2ZWQgbG9jYXRpb24gZGF0YSBpbmNsdWRpbmcgc3RhdGljIHByb3BlcnRpZXMgKHR5cGUsIGRpZmZpY3VsdHksIHNlZWRzKSBmcm9tIHRoZSBnYW1lIHNlZWQgYW5kIGVwb2NoLXNwZWNpZmljIHByb3BlcnRpZXMgKGFjdGl2ZSwgc2VlZHMpIGZyb20gdGhlIGN1cnJlbnQgZXBvY2ggc2VlZC4AAPDnGjWzYglnZXRuZWFyYnneAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRuZWFyYnkKc3VtbWFyeTogJ0dldCBuZWFyYnkgcmVhY2hhYmxlIHN5c3RlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgbmVhcmJ5IHN5c3RlbXMgcmVhY2hhYmxlIGJ5IGFuIGVudGl0eSBmcm9tIGl0cyBwcm9qZWN0ZWQgbG9jYXRpb24uIFJldHVybnMgY3VycmVudCBzdGF0ZSAod2l0aCBjb21wbGV0ZWQgdGFza3MgcmVzb2x2ZWQpLCBwcm9qZWN0ZWQgc3RhdGUgKGFmdGVyIGFsbCBzY2hlZHVsZWQgdGFza3MpLCBhbmQgYSBsaXN0IG9mIHJlYWNoYWJsZSBzeXN0ZW1zIHdpdGggZGlzdGFuY2UsIGVuZXJneSBjb3N0LCBmbGlnaHQgdGltZSwgYW5kIG1hcmtldCBpbmZvcm1hdGlvbi4AALjKm1izYglnZXRwbGF5ZXL9Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRwbGF5ZXIKc3VtbWFyeTogJ0dldCBwbGF5ZXIgaW5mb3JtYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwbGF5ZXIgaW5jbHVkaW5nIGJhbGFuY2UsIGRlYnQsIG5ldHdvcnRoLCBlbnRpdHkgY291bnRzLCBhbmQgcHJpY2luZyBmb3IgbmV4dCBwdXJjaGFzZXMuIFJldHVybnMgaXNfcGxheWVyPWZhbHNlIGlmIHRoZSBhY2NvdW50IGhhcyBub3Qgam9pbmVkIHRoZSBnYW1lLgDAVfmajLNiCmdldHN0YXJ0ZXKFAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdGFydGVyCnN1bW1hcnk6ICdHZXQgc3RhcnRlciBzaGlwIGFuZCBiYWxhbmNlIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHRoZSBzdGFydGVyIHNoaXAgc3RhdHMgYW5kIGluaXRpYWwgYmFsYW5jZSBhIG5ldyBwbGF5ZXIgd291bGQgcmVjZWl2ZSB1cG9uIGpvaW5pbmcuIFVzZWQgZm9yIG9uYm9hcmRpbmcgVUkgdG8gZGlzcGxheSB3aGF0IHBsYXllcnMgd2lsbCBnZXQgYmVmb3JlIHRoZXkgcmVnaXN0ZXIuAIDU2dyMs2IKZ2V0c3RyYXR1bQCAlbtGSo2zYgxnZXRzdW1tYXJpZXPoAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdW1tYXJpZXMKc3VtbWFyeTogJ0dldCBlbnRpdHkgc3VtbWFyaWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBsaWdodHdlaWdodCBzdW1tYXJpZXMgb2YgYWxsIGVudGl0aWVzIG93bmVkIGJ5IGEgcGxheWVyIGluY2x1ZGluZyB0eXBlLCBpZCwgb3duZXIsIG5hbWUsIGxvY2F0aW9uLCBhbmQgaWRsZSBzdGF0dXMuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgCi2ubmqullC2dyb3VwdHJhdmVsmgQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ3JvdXB0cmF2ZWwKc3VtbWFyeTogJ01vdmUgbXVsdGlwbGUgZW50aXRpZXMgdG9nZXRoZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYXRlIGdyb3VwIHRyYXZlbCBmb3IgbXVsdGlwbGUgZW50aXRpZXMgdG8gYSBkZXN0aW5hdGlvbi4gQWxsIGVudGl0aWVzIG11c3QgYmUgYXQgdGhlIHNhbWUgbG9jYXRpb24gYW5kIG93bmVkIGJ5IHRoZSBjYWxsZXIuIEF0IGxlYXN0IG9uZSBlbnRpdHkgd2l0aCBlbmdpbmVzIGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgdGhydXN0LiBGbGlnaHQgZHVyYXRpb24gaXMgY2FsY3VsYXRlZCBmcm9tIGNvbWJpbmVkIHRocnVzdCBhbmQgdG90YWwgbWFzcyBvZiBhbGwgZW50aXRpZXMuIENyZWF0ZXMgYW4gZW50aXR5Z3JvdXAgZm9yIGF0b21pYyByZXNvbHV0aW9uIGFuZCBjYW5jZWxsYXRpb24uAAAAAADQsGkEaGFzaP0BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGhhc2gKc3VtbWFyeTogJ0NhbGN1bGF0ZSBzaGEyNTYgaGFzaCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ2FsY3VsYXRlcyB0aGUgc2hhMjU2IGhhc2ggb2YgYSBzdHJpbmcgYmFzZWQgdXNpbmcgdGhlIGdhbWUgc2VlZC4KCi0tLQAAAECE0rBpB2hhc2g1MTL7AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBoYXNoNTEyCnN1bW1hcnk6ICdDYWxjdWxhdGUgc2hhNTEyIGhhc2gnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbGN1bGF0ZXMgdGhlIHNoYTUxMiBoYXNoIG9mIGEgc3RyaW5nIGJhc2VkIHVzaW5nIHRoZSBnYW1lIHNlZWQuAAAAAACQ3XQEaW5pdPoBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGluaXQKc3VtbWFyeTogJ0luaXRpYWxpemUgZ2FtZSBzZWVkJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbml0aWFsaXplIGEgdGhlIGdhbWVzIHNlZWQgYW5kIHNlZWQgdmFsdWVzIHRvIGJvb3RzdHJhcCBnYW1lIHN0YXRlLgAAAAAAMB19BGpvaW7JAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBqb2luCnN1bW1hcnk6ICdKb2luIGEgZ2FtZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSm9pbiBhIGdhbWUgb2YgU2hpcGxvYWQKCi0tLQAAAAD45TKdBm5vdGlmeYoDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IG5vdGlmeQpzdW1tYXJ5OiAnVGFzayBsaWZlY3ljbGUgbm90aWZpY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnRlcm5hbCBhY3Rpb24gdGhhdCBub3RpZmllcyBlbnRpdHkgb3duZXJzIG9mIHRhc2sgbGlmZWN5Y2xlIGV2ZW50cyAocmVzb2x2ZWQsIGNhbmNlbGxlZCkuIENhbGxlZCBpbmxpbmUgd2hlbiB0YXNrcyBjaGFuZ2Ugc3RhdGUuIFVzZXMgcmVxdWlyZV9yZWNpcGllbnQgdG8gZW5hYmxlIG9mZi1jaGFpbiBtb25pdG9yaW5nIHZpYSBhY3Rpb24gdHJhY2VzLgAAAIpd05C6CHJlY2hhcmdl0gItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcmVjaGFyZ2UKc3VtbWFyeTogJ1JlY2hhcmdlIHNoaXAgZW5lcmd5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpTY2hlZHVsZSBhIHJlY2hhcmdlIHRhc2sgZm9yIGFuIGVudGl0eSB0byByZXN0b3JlIGVuZXJneSB0byBmdWxsIGNhcGFjaXR5LiBUaGUgcmVjaGFyZ2UgZHVyYXRpb24gZGVwZW5kcyBvbiBjdXJyZW50IGVuZXJneSBsZXZlbCBhbmQgcmVjaGFyZ2UgcmF0ZS4KCi0tLQAAAEDtSLG6B3Jlc29sdmXVAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiByZXNvbHZlCnN1bW1hcnk6ICdDb21wbGV0ZSBzY2hlZHVsZWQgdGFza3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlc29sdmUgY29tcGxldGVkIHRhc2tzIGluIGFuIGVudGl0eSdzIHNjaGVkdWxlLCBhcHBseWluZyB0aGVpciBlZmZlY3RzIChyZWNoYXJnZSBlbmVyZ3ksIHVwZGF0ZSBsb2NhdGlvbiwgbG9hZC91bmxvYWQgY2FyZ28pLiBJZiBjb3VudCBpcyBzcGVjaWZpZWQsIHJlc29sdmUgZXhhY3RseSB0aGF0IG1hbnkgdGFza3M7IG90aGVyd2lzZSByZXNvbHZlIGFsbCBjb21wbGV0ZWQgdGFza3MuIEZhaWxzIGlmIGNvdW50IGV4Y2VlZHMgdGhlIG51bWJlciBvZiBjb21wbGV0ZWQgdGFza3MuCgotLS0AAAAAAJCjwQRzYWx03QEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc2FsdApzdW1tYXJ5OiAnQXBwZW5kIFNhbHQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkFkZCBhZGRpdGlvbmFsIHNhbHQgdG8gdGhlIG5leHQgZXBvY2ggc2VlZC4KCi0tLQAAZdegyU3FCnNwYXduY2FyZ28AAAAAVy08zc0IdHJhbnNmZXLIAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB0cmFuc2ZlcgpzdW1tYXJ5OiAnVHJhbnNmZXIgY2FyZ28gYmV0d2VlbiBlbnRpdGllcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVHJhbnNmZXIgY2FyZ28gYmV0d2VlbiB0d28gZW50aXRpZXMgYXQgdGhlIHNhbWUgbG9jYXRpb24uIEJvdGggZW50aXRpZXMgbXVzdCBiZSBvd25lZCBieSB0aGUgY2FsbGVyIGFuZCBhdCBsZWFzdCBvbmUgbXVzdCBoYXZlIGxvYWRlcnMuIENyZWF0ZXMgbG9hZCBhbmQgdW5sb2FkIHRhc2tzIG9uIGJvdGggZW50aXRpZXMgd2l0aCBkdXJhdGlvbiBiYXNlZCBvbiBjb21iaW5lZCBsb2FkZXIgY2FwYWNpdHkgYW5kIFotZGlzdGFuY2UgYmV0d2VlbiB0aGVtLgAAAABEtc3NBnRyYXZlbMsCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHRyYXZlbApzdW1tYXJ5OiAnTW92ZSBhIHNoaXAnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYXRlIHRyYXZlbCBvZiBhbiBlbnRpdHkgZnJvbSBpdHMgY3VycmVudCBsb2NhdGlvbiB0byBhIG5ldyBkZXN0aW5hdGlvbi4KCi0tLQoKVGhpcyBhY3Rpb24gZGV0ZXJtaW5lcyB0aGUgbWFya2V0IHByaWNlIG9mIGFsbCBpdGVtcyBhdCBhIGdpdmVuIGxvY2F0aW9uLgAAAAAAUK/hBHdhcnAAAAAAAACgquMEd2lwZbIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdpcGUKc3VtbWFyeTogJ0RFQlVHOiB3aXBlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLaDQVNoqrKrjDHdpcGVzZXF1ZW5jZcIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdpcGVzZXF1ZW5jZQpzdW1tYXJ5OiAnREVCVUc6IHdpcGVzZXF1ZW5jZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0LAAAAAADKrkEDaTY0AAAJY2FyZ29fcm93AAC4ajqTJ0UDaTY0AAANY29udGFpbmVyX3JvdwCqppf57PJUA2k2NAAAD2VudGl0eWdyb3VwX3JvdwAAAJO6bBCNA2k2NAAADGxvY2F0aW9uX3JvdwAAAABc5U2sA2k2NAAACnBsYXllcl9yb3cAAABA7auwugNpNjQAAAtyZXNlcnZlX3JvdwAAAApNpa3CA2k2NAAADHNlcXVlbmNlX3JvdwAAAAAAUF3DA2k2NAAACHNoaXBfcm93AAAAAACVTcYDaTY0AAAJc3RhdGVfcm93AAAAAACsqs8DaTY0AAAJdHlwZXNfcm93AABQWNOmruEDaTY0AAANd2FyZWhvdXNlX3JvdwERU2hpcGxvYWQgKFNlcnZlcikRU2hpcGxvYWQgKFNlcnZlcikAAAAXAAAAAESFpkEOY2FuY2VsX3Jlc3VsdHMAAAAAgLzMRQx0YXNrX3Jlc3VsdHMAAAAAeBqrSgx0YXNrX3Jlc3VsdHMAAAAgI3NzVwx0YXNrX3Jlc3VsdHMAAGBuTYqyYgtnYW1lX2NvbmZpZwCwctnlqbJiDWVudGl0eV9pbmZvW10AAPDZ5amyYgtlbnRpdHlfaW5mbwAAAFiq7LJiCml0ZW1zX2luZm8AJnXZIBqzYg1sb2NhdGlvbl9pbmZvAIDJJiEas2IQbG9jYXRpb25fZGVyaXZlZAAA8OcaNbNiC25lYXJieV9pbmZvAAC4yptYs2ILcGxheWVyX2luZm8AwFX5moyzYgxzdGFydGVyX2luZm8AgNTZ3IyzYgxzdHJhdHVtX2RhdGGAlbtGSo2zYhBlbnRpdHlfc3VtbWFyeVtdAKLa5uaq6WUMdGFza19yZXN1bHRzAAAAAADQsGkLY2hlY2tzdW0yNTYAAABAhNKwaQtjaGVja3N1bTUxMgAAAIpd05C6DHRhc2tfcmVzdWx0cwAAAEDtSLG6D3Jlc29sdmVfcmVzdWx0cwAAAFctPM3NDHRhc2tfcmVzdWx0cwAAAABEtc3NDHRhc2tfcmVzdWx0cwAAAAAAUK/hDHRhc2tfcmVzdWx0cw==');
209
209
  const abi = ABI.from(abiBlob);
210
210
  var Types;
211
211
  (function (Types) {
@@ -221,66 +221,6 @@ var Types;
221
221
  Struct.type('advance')
222
222
  ], advance);
223
223
  Types.advance = advance;
224
- let buycontainer = class buycontainer extends Struct {
225
- };
226
- __decorate([
227
- Struct.field(Name)
228
- ], buycontainer.prototype, "account", void 0);
229
- __decorate([
230
- Struct.field(UInt64)
231
- ], buycontainer.prototype, "ship_id", void 0);
232
- __decorate([
233
- Struct.field('string')
234
- ], buycontainer.prototype, "name", void 0);
235
- buycontainer = __decorate([
236
- Struct.type('buycontainer')
237
- ], buycontainer);
238
- Types.buycontainer = buycontainer;
239
- let buyitems = class buyitems extends Struct {
240
- };
241
- __decorate([
242
- Struct.field(Name)
243
- ], buyitems.prototype, "entity_type", void 0);
244
- __decorate([
245
- Struct.field(UInt64)
246
- ], buyitems.prototype, "id", void 0);
247
- __decorate([
248
- Struct.field(UInt16)
249
- ], buyitems.prototype, "item_id", void 0);
250
- __decorate([
251
- Struct.field(UInt32)
252
- ], buyitems.prototype, "quantity", void 0);
253
- buyitems = __decorate([
254
- Struct.type('buyitems')
255
- ], buyitems);
256
- Types.buyitems = buyitems;
257
- let buyship = class buyship extends Struct {
258
- };
259
- __decorate([
260
- Struct.field(Name)
261
- ], buyship.prototype, "account", void 0);
262
- __decorate([
263
- Struct.field('string')
264
- ], buyship.prototype, "name", void 0);
265
- buyship = __decorate([
266
- Struct.type('buyship')
267
- ], buyship);
268
- Types.buyship = buyship;
269
- let buywarehouse = class buywarehouse extends Struct {
270
- };
271
- __decorate([
272
- Struct.field(Name)
273
- ], buywarehouse.prototype, "account", void 0);
274
- __decorate([
275
- Struct.field(UInt64)
276
- ], buywarehouse.prototype, "ship_id", void 0);
277
- __decorate([
278
- Struct.field('string')
279
- ], buywarehouse.prototype, "name", void 0);
280
- buywarehouse = __decorate([
281
- Struct.type('buywarehouse')
282
- ], buywarehouse);
283
- Types.buywarehouse = buywarehouse;
284
224
  let cancel = class cancel extends Struct {
285
225
  };
286
226
  __decorate([
@@ -340,9 +280,6 @@ var Types;
340
280
  __decorate([
341
281
  Struct.field(UInt32)
342
282
  ], cargo_item.prototype, "quantity", void 0);
343
- __decorate([
344
- Struct.field(UInt64)
345
- ], cargo_item.prototype, "unit_cost", void 0);
346
283
  __decorate([
347
284
  Struct.field(UInt64, { optional: true })
348
285
  ], cargo_item.prototype, "seed", void 0);
@@ -364,9 +301,6 @@ var Types;
364
301
  __decorate([
365
302
  Struct.field(UInt64)
366
303
  ], cargo_row.prototype, "quantity", void 0);
367
- __decorate([
368
- Struct.field(UInt64)
369
- ], cargo_row.prototype, "unit_cost", void 0);
370
304
  __decorate([
371
305
  Struct.field(UInt64)
372
306
  ], cargo_row.prototype, "seed", void 0);
@@ -449,15 +383,6 @@ var Types;
449
383
  Struct.type('loader_stats')
450
384
  ], loader_stats);
451
385
  Types.loader_stats = loader_stats;
452
- let trade_stats = class trade_stats extends Struct {
453
- };
454
- __decorate([
455
- Struct.field(UInt16)
456
- ], trade_stats.prototype, "margin", void 0);
457
- trade_stats = __decorate([
458
- Struct.type('trade_stats')
459
- ], trade_stats);
460
- Types.trade_stats = trade_stats;
461
386
  let extractor_stats = class extractor_stats extends Struct {
462
387
  };
463
388
  __decorate([
@@ -488,6 +413,18 @@ var Types;
488
413
  Struct.type('warp_stats')
489
414
  ], warp_stats);
490
415
  Types.warp_stats = warp_stats;
416
+ let crafter_stats = class crafter_stats extends Struct {
417
+ };
418
+ __decorate([
419
+ Struct.field(UInt16)
420
+ ], crafter_stats.prototype, "speed", void 0);
421
+ __decorate([
422
+ Struct.field(UInt16)
423
+ ], crafter_stats.prototype, "drain", void 0);
424
+ crafter_stats = __decorate([
425
+ Struct.type('crafter_stats')
426
+ ], crafter_stats);
427
+ Types.crafter_stats = crafter_stats;
491
428
  let entity_defaults = class entity_defaults extends Struct {
492
429
  };
493
430
  __decorate([
@@ -511,15 +448,15 @@ var Types;
511
448
  __decorate([
512
449
  Struct.field(loader_stats)
513
450
  ], entity_defaults.prototype, "ship_loaders", void 0);
514
- __decorate([
515
- Struct.field(trade_stats)
516
- ], entity_defaults.prototype, "ship_trade", void 0);
517
451
  __decorate([
518
452
  Struct.field(extractor_stats)
519
453
  ], entity_defaults.prototype, "ship_extractor", void 0);
520
454
  __decorate([
521
455
  Struct.field(warp_stats)
522
456
  ], entity_defaults.prototype, "ship_warp", void 0);
457
+ __decorate([
458
+ Struct.field(crafter_stats)
459
+ ], entity_defaults.prototype, "ship_crafter", void 0);
523
460
  __decorate([
524
461
  Struct.field(UInt32)
525
462
  ], entity_defaults.prototype, "warehouse_capacity", void 0);
@@ -547,9 +484,6 @@ var Types;
547
484
  __decorate([
548
485
  Struct.field(UInt16)
549
486
  ], item_def.prototype, "id", void 0);
550
- __decorate([
551
- Struct.field(UInt32)
552
- ], item_def.prototype, "base_price", void 0);
553
487
  __decorate([
554
488
  Struct.field(UInt32)
555
489
  ], item_def.prototype, "mass", void 0);
@@ -619,9 +553,6 @@ var Types;
619
553
  __decorate([
620
554
  Struct.field(UInt64, { optional: true })
621
555
  ], task.prototype, "entitygroup", void 0);
622
- __decorate([
623
- Struct.field(Int64, { optional: true })
624
- ], task.prototype, "credits", void 0);
625
556
  __decorate([
626
557
  Struct.field(UInt16, { optional: true })
627
558
  ], task.prototype, "energy_cost", void 0);
@@ -671,6 +602,69 @@ var Types;
671
602
  Struct.type('container_row')
672
603
  ], container_row);
673
604
  Types.container_row = container_row;
605
+ let craft = class craft extends Struct {
606
+ };
607
+ __decorate([
608
+ Struct.field(Name)
609
+ ], craft.prototype, "entity_type", void 0);
610
+ __decorate([
611
+ Struct.field(UInt64)
612
+ ], craft.prototype, "id", void 0);
613
+ __decorate([
614
+ Struct.field(UInt16)
615
+ ], craft.prototype, "recipe_id", void 0);
616
+ __decorate([
617
+ Struct.field(UInt32)
618
+ ], craft.prototype, "quantity", void 0);
619
+ __decorate([
620
+ Struct.field(cargo_item, { array: true })
621
+ ], craft.prototype, "inputs", void 0);
622
+ craft = __decorate([
623
+ Struct.type('craft')
624
+ ], craft);
625
+ Types.craft = craft;
626
+ let createentity = class createentity extends Struct {
627
+ };
628
+ __decorate([
629
+ Struct.field(Name)
630
+ ], createentity.prototype, "owner", void 0);
631
+ __decorate([
632
+ Struct.field(Name)
633
+ ], createentity.prototype, "entity_type", void 0);
634
+ __decorate([
635
+ Struct.field('string')
636
+ ], createentity.prototype, "entity_name", void 0);
637
+ __decorate([
638
+ Struct.field(Int64)
639
+ ], createentity.prototype, "x", void 0);
640
+ __decorate([
641
+ Struct.field(Int64)
642
+ ], createentity.prototype, "y", void 0);
643
+ createentity = __decorate([
644
+ Struct.type('createentity')
645
+ ], createentity);
646
+ Types.createentity = createentity;
647
+ let deploy = class deploy extends Struct {
648
+ };
649
+ __decorate([
650
+ Struct.field(Name)
651
+ ], deploy.prototype, "entity_type", void 0);
652
+ __decorate([
653
+ Struct.field(UInt64)
654
+ ], deploy.prototype, "id", void 0);
655
+ __decorate([
656
+ Struct.field(UInt16)
657
+ ], deploy.prototype, "packed_item_id", void 0);
658
+ __decorate([
659
+ Struct.field(UInt64)
660
+ ], deploy.prototype, "seed", void 0);
661
+ __decorate([
662
+ Struct.field('string')
663
+ ], deploy.prototype, "entity_name", void 0);
664
+ deploy = __decorate([
665
+ Struct.type('deploy')
666
+ ], deploy);
667
+ Types.deploy = deploy;
674
668
  let enable = class enable extends Struct {
675
669
  };
676
670
  __decorate([
@@ -739,6 +733,9 @@ var Types;
739
733
  __decorate([
740
734
  Struct.field(warp_stats, { optional: true })
741
735
  ], entity_info.prototype, "warp", void 0);
736
+ __decorate([
737
+ Struct.field(crafter_stats, { optional: true })
738
+ ], entity_info.prototype, "crafter", void 0);
742
739
  __decorate([
743
740
  Struct.field('bool')
744
741
  ], entity_info.prototype, "is_idle", void 0);
@@ -1073,27 +1070,6 @@ var Types;
1073
1070
  Struct.type('location_derived')
1074
1071
  ], location_derived);
1075
1072
  Types.location_derived = location_derived;
1076
- let location_item = class location_item extends Struct {
1077
- };
1078
- __decorate([
1079
- Struct.field(UInt16)
1080
- ], location_item.prototype, "id", void 0);
1081
- __decorate([
1082
- Struct.field(UInt32)
1083
- ], location_item.prototype, "price", void 0);
1084
- __decorate([
1085
- Struct.field(UInt16)
1086
- ], location_item.prototype, "supply", void 0);
1087
- __decorate([
1088
- Struct.field(UInt32)
1089
- ], location_item.prototype, "rarity_multiplier", void 0);
1090
- __decorate([
1091
- Struct.field(UInt32)
1092
- ], location_item.prototype, "location_multiplier", void 0);
1093
- location_item = __decorate([
1094
- Struct.type('location_item')
1095
- ], location_item);
1096
- Types.location_item = location_item;
1097
1073
  let location_info = class location_info extends Struct {
1098
1074
  };
1099
1075
  __decorate([
@@ -1102,9 +1078,6 @@ var Types;
1102
1078
  __decorate([
1103
1079
  Struct.field('bool')
1104
1080
  ], location_info.prototype, "is_system", void 0);
1105
- __decorate([
1106
- Struct.field(location_item, { array: true })
1107
- ], location_info.prototype, "items", void 0);
1108
1081
  location_info = __decorate([
1109
1082
  Struct.type('location_info')
1110
1083
  ], location_info);
@@ -1214,18 +1187,6 @@ var Types;
1214
1187
  Struct.type('notify')
1215
1188
  ], notify);
1216
1189
  Types.notify = notify;
1217
- let payloan = class payloan extends Struct {
1218
- };
1219
- __decorate([
1220
- Struct.field(Name)
1221
- ], payloan.prototype, "account", void 0);
1222
- __decorate([
1223
- Struct.field(UInt64)
1224
- ], payloan.prototype, "amount", void 0);
1225
- payloan = __decorate([
1226
- Struct.type('payloan')
1227
- ], payloan);
1228
- Types.payloan = payloan;
1229
1190
  let player_info = class player_info extends Struct {
1230
1191
  };
1231
1192
  __decorate([
@@ -1237,27 +1198,6 @@ var Types;
1237
1198
  __decorate([
1238
1199
  Struct.field('string')
1239
1200
  ], player_info.prototype, "company_name", void 0);
1240
- __decorate([
1241
- Struct.field(UInt64)
1242
- ], player_info.prototype, "balance", void 0);
1243
- __decorate([
1244
- Struct.field(UInt32)
1245
- ], player_info.prototype, "debt", void 0);
1246
- __decorate([
1247
- Struct.field(Int64)
1248
- ], player_info.prototype, "networth", void 0);
1249
- __decorate([
1250
- Struct.field(UInt64)
1251
- ], player_info.prototype, "available_loan", void 0);
1252
- __decorate([
1253
- Struct.field(UInt64)
1254
- ], player_info.prototype, "next_ship_price", void 0);
1255
- __decorate([
1256
- Struct.field(UInt64)
1257
- ], player_info.prototype, "next_warehouse_price", void 0);
1258
- __decorate([
1259
- Struct.field(UInt64)
1260
- ], player_info.prototype, "next_container_price", void 0);
1261
1201
  __decorate([
1262
1202
  Struct.field(UInt64)
1263
1203
  ], player_info.prototype, "ship_count", void 0);
@@ -1276,28 +1216,10 @@ var Types;
1276
1216
  __decorate([
1277
1217
  Struct.field(Name)
1278
1218
  ], player_row.prototype, "owner", void 0);
1279
- __decorate([
1280
- Struct.field(UInt64)
1281
- ], player_row.prototype, "balance", void 0);
1282
- __decorate([
1283
- Struct.field(UInt32)
1284
- ], player_row.prototype, "debt", void 0);
1285
- __decorate([
1286
- Struct.field(Int64)
1287
- ], player_row.prototype, "networth", void 0);
1288
1219
  player_row = __decorate([
1289
1220
  Struct.type('player_row')
1290
1221
  ], player_row);
1291
1222
  Types.player_row = player_row;
1292
- let purgesupply = class purgesupply extends Struct {
1293
- };
1294
- __decorate([
1295
- Struct.field(UInt64, { optional: true })
1296
- ], purgesupply.prototype, "max_rows", void 0);
1297
- purgesupply = __decorate([
1298
- Struct.type('purgesupply')
1299
- ], purgesupply);
1300
- Types.purgesupply = purgesupply;
1301
1223
  let recharge = class recharge extends Struct {
1302
1224
  };
1303
1225
  __decorate([
@@ -1365,16 +1287,13 @@ var Types;
1365
1287
  };
1366
1288
  __decorate([
1367
1289
  Struct.field(UInt16)
1368
- ], resource_stats.prototype, "purity", void 0);
1369
- __decorate([
1370
- Struct.field(UInt16)
1371
- ], resource_stats.prototype, "density", void 0);
1290
+ ], resource_stats.prototype, "stat1", void 0);
1372
1291
  __decorate([
1373
1292
  Struct.field(UInt16)
1374
- ], resource_stats.prototype, "reactivity", void 0);
1293
+ ], resource_stats.prototype, "stat2", void 0);
1375
1294
  __decorate([
1376
1295
  Struct.field(UInt16)
1377
- ], resource_stats.prototype, "resonance", void 0);
1296
+ ], resource_stats.prototype, "stat3", void 0);
1378
1297
  resource_stats = __decorate([
1379
1298
  Struct.type('resource_stats')
1380
1299
  ], resource_stats);
@@ -1388,24 +1307,6 @@ var Types;
1388
1307
  Struct.type('salt')
1389
1308
  ], salt);
1390
1309
  Types.salt = salt;
1391
- let sellitems = class sellitems extends Struct {
1392
- };
1393
- __decorate([
1394
- Struct.field(Name)
1395
- ], sellitems.prototype, "entity_type", void 0);
1396
- __decorate([
1397
- Struct.field(UInt64)
1398
- ], sellitems.prototype, "id", void 0);
1399
- __decorate([
1400
- Struct.field(UInt16)
1401
- ], sellitems.prototype, "item_id", void 0);
1402
- __decorate([
1403
- Struct.field(UInt32)
1404
- ], sellitems.prototype, "quantity", void 0);
1405
- sellitems = __decorate([
1406
- Struct.type('sellitems')
1407
- ], sellitems);
1408
- Types.sellitems = sellitems;
1409
1310
  let sequence_row = class sequence_row extends Struct {
1410
1311
  };
1411
1312
  __decorate([
@@ -1453,15 +1354,15 @@ var Types;
1453
1354
  __decorate([
1454
1355
  Struct.field(loader_stats)
1455
1356
  ], ship_row.prototype, "loaders", void 0);
1456
- __decorate([
1457
- Struct.field(trade_stats, { optional: true })
1458
- ], ship_row.prototype, "trade", void 0);
1459
1357
  __decorate([
1460
1358
  Struct.field(extractor_stats, { optional: true })
1461
1359
  ], ship_row.prototype, "extractor", void 0);
1462
1360
  __decorate([
1463
1361
  Struct.field(warp_stats, { optional: true })
1464
1362
  ], ship_row.prototype, "warp", void 0);
1363
+ __decorate([
1364
+ Struct.field(crafter_stats, { optional: true })
1365
+ ], ship_row.prototype, "crafter", void 0);
1465
1366
  __decorate([
1466
1367
  Struct.field(schedule, { optional: true })
1467
1368
  ], ship_row.prototype, "schedule", void 0);
@@ -1469,14 +1370,23 @@ var Types;
1469
1370
  Struct.type('ship_row')
1470
1371
  ], ship_row);
1471
1372
  Types.ship_row = ship_row;
1472
- let starter_info = class starter_info extends Struct {
1373
+ let spawncargo = class spawncargo extends Struct {
1473
1374
  };
1474
1375
  __decorate([
1475
1376
  Struct.field(UInt64)
1476
- ], starter_info.prototype, "balance", void 0);
1377
+ ], spawncargo.prototype, "entity_id", void 0);
1378
+ __decorate([
1379
+ Struct.field(UInt64)
1380
+ ], spawncargo.prototype, "item_id", void 0);
1477
1381
  __decorate([
1478
1382
  Struct.field(UInt64)
1479
- ], starter_info.prototype, "debt", void 0);
1383
+ ], spawncargo.prototype, "quantity", void 0);
1384
+ spawncargo = __decorate([
1385
+ Struct.type('spawncargo')
1386
+ ], spawncargo);
1387
+ Types.spawncargo = spawncargo;
1388
+ let starter_info = class starter_info extends Struct {
1389
+ };
1480
1390
  __decorate([
1481
1391
  Struct.field(entity_info)
1482
1392
  ], starter_info.prototype, "ship", void 0);
@@ -1538,39 +1448,6 @@ var Types;
1538
1448
  Struct.type('stratum_data')
1539
1449
  ], stratum_data);
1540
1450
  Types.stratum_data = stratum_data;
1541
- let supply_row = class supply_row extends Struct {
1542
- };
1543
- __decorate([
1544
- Struct.field(UInt64)
1545
- ], supply_row.prototype, "id", void 0);
1546
- __decorate([
1547
- Struct.field(coordinates)
1548
- ], supply_row.prototype, "coordinates", void 0);
1549
- __decorate([
1550
- Struct.field(UInt64)
1551
- ], supply_row.prototype, "epoch", void 0);
1552
- __decorate([
1553
- Struct.field(UInt16)
1554
- ], supply_row.prototype, "item_id", void 0);
1555
- __decorate([
1556
- Struct.field(UInt16)
1557
- ], supply_row.prototype, "supply", void 0);
1558
- supply_row = __decorate([
1559
- Struct.type('supply_row')
1560
- ], supply_row);
1561
- Types.supply_row = supply_row;
1562
- let takeloan = class takeloan extends Struct {
1563
- };
1564
- __decorate([
1565
- Struct.field(Name)
1566
- ], takeloan.prototype, "account", void 0);
1567
- __decorate([
1568
- Struct.field(UInt64)
1569
- ], takeloan.prototype, "amount", void 0);
1570
- takeloan = __decorate([
1571
- Struct.type('takeloan')
1572
- ], takeloan);
1573
- Types.takeloan = takeloan;
1574
1451
  let task_results = class task_results extends Struct {
1575
1452
  };
1576
1453
  __decorate([
@@ -1643,30 +1520,6 @@ var Types;
1643
1520
  Struct.type('types_row')
1644
1521
  ], types_row);
1645
1522
  Types.types_row = types_row;
1646
- let updatecredit = class updatecredit extends Struct {
1647
- };
1648
- __decorate([
1649
- Struct.field(Name)
1650
- ], updatecredit.prototype, "account", void 0);
1651
- __decorate([
1652
- Struct.field(Int64)
1653
- ], updatecredit.prototype, "amount", void 0);
1654
- updatecredit = __decorate([
1655
- Struct.type('updatecredit')
1656
- ], updatecredit);
1657
- Types.updatecredit = updatecredit;
1658
- let updatedebt = class updatedebt extends Struct {
1659
- };
1660
- __decorate([
1661
- Struct.field(Name)
1662
- ], updatedebt.prototype, "account", void 0);
1663
- __decorate([
1664
- Struct.field(Int64)
1665
- ], updatedebt.prototype, "amount", void 0);
1666
- updatedebt = __decorate([
1667
- Struct.type('updatedebt')
1668
- ], updatedebt);
1669
- Types.updatedebt = updatedebt;
1670
1523
  let warehouse_row = class warehouse_row extends Struct {
1671
1524
  };
1672
1525
  __decorate([
@@ -1738,7 +1591,6 @@ const TableMap = {
1738
1591
  sequence: Types.sequence_row,
1739
1592
  ship: Types.ship_row,
1740
1593
  state: Types.state_row,
1741
- supply: Types.supply_row,
1742
1594
  types: Types.types_row,
1743
1595
  warehouse: Types.warehouse_row,
1744
1596
  };
@@ -1847,6 +1699,8 @@ var TaskType;
1847
1699
  TaskType[TaskType["UNLOAD"] = 4] = "UNLOAD";
1848
1700
  TaskType[TaskType["EXTRACT"] = 5] = "EXTRACT";
1849
1701
  TaskType[TaskType["WARP"] = 6] = "WARP";
1702
+ TaskType[TaskType["CRAFT"] = 7] = "CRAFT";
1703
+ TaskType[TaskType["DEPLOY"] = 8] = "DEPLOY";
1850
1704
  })(TaskType || (TaskType = {}));
1851
1705
  var LocationType;
1852
1706
  (function (LocationType) {
@@ -1897,9 +1751,6 @@ __decorate([
1897
1751
  __decorate([
1898
1752
  Struct.field('string')
1899
1753
  ], Item.prototype, "description", void 0);
1900
- __decorate([
1901
- Struct.field(UInt32)
1902
- ], Item.prototype, "base_price", void 0);
1903
1754
  __decorate([
1904
1755
  Struct.field(UInt32)
1905
1756
  ], Item.prototype, "mass", void 0);
@@ -1908,30 +1759,13 @@ __decorate([
1908
1759
  ], Item.prototype, "category", void 0);
1909
1760
  __decorate([
1910
1761
  Struct.field('string')
1911
- ], Item.prototype, "rarity", void 0);
1762
+ ], Item.prototype, "tier", void 0);
1912
1763
  __decorate([
1913
1764
  Struct.field('string')
1914
1765
  ], Item.prototype, "color", void 0);
1915
1766
  Item = __decorate([
1916
1767
  Struct.type('item')
1917
1768
  ], Item);
1918
- let ItemPrice = class ItemPrice extends Struct {
1919
- };
1920
- __decorate([
1921
- Struct.field(UInt16)
1922
- ], ItemPrice.prototype, "id", void 0);
1923
- __decorate([
1924
- Struct.field(Item)
1925
- ], ItemPrice.prototype, "item", void 0);
1926
- __decorate([
1927
- Struct.field(UInt32)
1928
- ], ItemPrice.prototype, "price", void 0);
1929
- __decorate([
1930
- Struct.field(UInt16)
1931
- ], ItemPrice.prototype, "supply", void 0);
1932
- ItemPrice = __decorate([
1933
- Struct.type('ItemPrice')
1934
- ], ItemPrice);
1935
1769
 
1936
1770
  function getCurrentEpoch(game) {
1937
1771
  const current = new Date().getTime();
@@ -1960,89 +1794,231 @@ function hash512(seed, string) {
1960
1794
  return Checksum512.hash(bytes);
1961
1795
  }
1962
1796
 
1963
- var syllables = [
1964
- "A",
1965
- "Ab",
1966
- "Abl",
1967
- "Abr",
1968
- "Ach",
1969
- "Acr",
1970
- "Ad",
1971
- "Ae",
1972
- "Aed",
1973
- "Aeg",
1974
- "Aek",
1975
- "Ael",
1976
- "Aem",
1977
- "Aen",
1978
- "Aeon",
1979
- "Aep",
1980
- "Aer",
1981
- "Aes",
1982
- "Aesk",
1983
- "Aet",
1984
- "Aev",
1985
- "Ag",
1986
- "Agr",
1987
- "Ahl",
1988
- "Ai",
1989
- "Ail",
1990
- "Ain",
1991
- "Ais",
1992
- "Ak",
1993
- "Aka",
1994
- "Al",
1995
- "Alb",
1996
- "Ald",
1997
- "Alg",
1998
- "Alk",
1999
- "Alm",
2000
- "Alt",
2001
- "Alv",
2002
- "Am",
2003
- "Amb",
2004
- "Ami",
2005
- "Amp",
2006
- "An",
2007
- "Anc",
2008
- "Ang",
2009
- "Ank",
2010
- "Ann",
2011
- "Ant",
2012
- "Ap",
2013
- "Aph",
2014
- "Aqu",
2015
- "Ar",
2016
- "Ara",
2017
- "Arb",
2018
- "Arc",
2019
- "Ard",
2020
- "Arg",
2021
- "Ari",
2022
- "Arl",
2023
- "Arm",
2024
- "Arn",
2025
- "Arr",
2026
- "Ars",
2027
- "Art",
2028
- "As",
2029
- "Asa",
2030
- "Ash",
2031
- "Asp",
2032
- "Ast",
2033
- "Astr",
2034
- "At",
2035
- "Ath",
2036
- "Atr",
2037
- "Aud",
2038
- "Aug",
2039
- "Aul",
2040
- "Aum",
2041
- "Aun",
2042
- "Aur",
2043
- "Aus",
2044
- "Av",
2045
- "Avn",
1797
+ const DEPTH_THRESHOLD_T1 = 0;
1798
+ const DEPTH_THRESHOLD_T2 = 2000;
1799
+ const DEPTH_THRESHOLD_T3 = 10000;
1800
+ const DEPTH_THRESHOLD_T4 = 30000;
1801
+ const DEPTH_THRESHOLD_T5 = 55000;
1802
+ const LOCATION_MIN_DEPTH = 500;
1803
+ const LOCATION_MAX_DEPTH = 65535;
1804
+ const YIELD_THRESHOLD = Math.floor(0.003 * 0xffffffff);
1805
+ const PLANET_SUBTYPE_GAS_GIANT = 0;
1806
+ const PLANET_SUBTYPE_ROCKY = 1;
1807
+ const PLANET_SUBTYPE_TERRESTRIAL = 2;
1808
+ const PLANET_SUBTYPE_ICY = 3;
1809
+ const PLANET_SUBTYPE_OCEAN = 4;
1810
+ const PLANET_SUBTYPE_INDUSTRIAL = 5;
1811
+ const RESOURCE_CATALOG = [
1812
+ { id: 26, tier: 't1' },
1813
+ { id: 13, tier: 't2' },
1814
+ { id: 24, tier: 't3' },
1815
+ { id: 29, tier: 't1' },
1816
+ { id: 47, tier: 't2' },
1817
+ { id: 79, tier: 't3' },
1818
+ { id: 1, tier: 't1' },
1819
+ { id: 2, tier: 't2' },
1820
+ { id: 18, tier: 't3' },
1821
+ { id: 14, tier: 't1' },
1822
+ { id: 1000, tier: 't2' },
1823
+ { id: 1001, tier: 't3' },
1824
+ { id: 6, tier: 't1' },
1825
+ { id: 1003, tier: 't2' },
1826
+ { id: 1002, tier: 't3' },
1827
+ ];
1828
+ function getDepthThreshold(tier) {
1829
+ switch (tier) {
1830
+ case 't1':
1831
+ return DEPTH_THRESHOLD_T1;
1832
+ case 't2':
1833
+ return DEPTH_THRESHOLD_T2;
1834
+ case 't3':
1835
+ return DEPTH_THRESHOLD_T3;
1836
+ case 't4':
1837
+ return DEPTH_THRESHOLD_T4;
1838
+ case 't5':
1839
+ return DEPTH_THRESHOLD_T5;
1840
+ }
1841
+ }
1842
+ function getResourceTier(itemId) {
1843
+ const entry = RESOURCE_CATALOG.find((r) => r.id === itemId);
1844
+ return entry ? entry.tier : 't5';
1845
+ }
1846
+ function getResourceWeight(itemId, stratum) {
1847
+ const tier = getResourceTier(itemId);
1848
+ const threshold = getDepthThreshold(tier);
1849
+ if (stratum < threshold)
1850
+ return 0;
1851
+ const depthAbove = stratum - threshold;
1852
+ switch (tier) {
1853
+ case 't1':
1854
+ if (stratum < 2000)
1855
+ return 100;
1856
+ if (stratum < 10000)
1857
+ return 80;
1858
+ if (stratum < 30000)
1859
+ return 50;
1860
+ return 30;
1861
+ case 't2':
1862
+ if (depthAbove < 3000)
1863
+ return 40;
1864
+ if (depthAbove < 8000)
1865
+ return 60;
1866
+ return 50;
1867
+ case 't3':
1868
+ if (depthAbove < 5000)
1869
+ return 20;
1870
+ if (depthAbove < 15000)
1871
+ return 35;
1872
+ return 40;
1873
+ case 't4':
1874
+ if (depthAbove < 10000)
1875
+ return 10;
1876
+ if (depthAbove < 25000)
1877
+ return 20;
1878
+ return 30;
1879
+ case 't5':
1880
+ return 10;
1881
+ }
1882
+ }
1883
+ const ASTEROID_RESOURCES = [26, 13, 24, 29, 47];
1884
+ const NEBULA_RESOURCES = [47, 79, 1, 2, 18];
1885
+ const GAS_GIANT_RESOURCES = [1, 2, 18, 14, 6];
1886
+ const ROCKY_RESOURCES = [26, 13, 24, 14, 1000, 1001, 1002];
1887
+ const TERRESTRIAL_RESOURCES = [29, 47, 14, 1000, 6, 1003, 1002];
1888
+ const ICY_RESOURCES = [26, 1, 2, 14, 1001, 6, 1003];
1889
+ const OCEAN_RESOURCES = [29, 79, 1, 18, 6, 1003, 1002];
1890
+ const INDUSTRIAL_RESOURCES = [26, 13, 24, 29, 79, 1000, 1001];
1891
+ function getLocationCandidates(locationType, subtype) {
1892
+ if (locationType === 2)
1893
+ return ASTEROID_RESOURCES;
1894
+ if (locationType === 3)
1895
+ return NEBULA_RESOURCES;
1896
+ if (locationType === 1) {
1897
+ switch (subtype) {
1898
+ case PLANET_SUBTYPE_GAS_GIANT:
1899
+ return GAS_GIANT_RESOURCES;
1900
+ case PLANET_SUBTYPE_ROCKY:
1901
+ return ROCKY_RESOURCES;
1902
+ case PLANET_SUBTYPE_TERRESTRIAL:
1903
+ return TERRESTRIAL_RESOURCES;
1904
+ case PLANET_SUBTYPE_ICY:
1905
+ return ICY_RESOURCES;
1906
+ case PLANET_SUBTYPE_OCEAN:
1907
+ return OCEAN_RESOURCES;
1908
+ case PLANET_SUBTYPE_INDUSTRIAL:
1909
+ return INDUSTRIAL_RESOURCES;
1910
+ }
1911
+ }
1912
+ return [];
1913
+ }
1914
+ function getEligibleResources(locationType, subtype, stratum) {
1915
+ const candidates = getLocationCandidates(locationType, subtype);
1916
+ return candidates.filter((itemId) => {
1917
+ const tier = getResourceTier(itemId);
1918
+ const threshold = getDepthThreshold(tier);
1919
+ return stratum >= threshold;
1920
+ });
1921
+ }
1922
+ function depthScaleFactor(stratum) {
1923
+ if (stratum <= 1)
1924
+ return 1.0;
1925
+ const logScale = Math.log(stratum) / Math.log(65535);
1926
+ return 1.0 + logScale * 2.0;
1927
+ }
1928
+
1929
+ function deriveLocationSize(loc) {
1930
+ if (loc.type.toNumber() === LocationType.EMPTY)
1931
+ return 0;
1932
+ const raw = (loc.seed0.toNumber() << 8) | loc.seed1.toNumber();
1933
+ const normalized = raw / 65535;
1934
+ const curved = Math.pow(normalized, 3.0);
1935
+ const range = LOCATION_MAX_DEPTH - LOCATION_MIN_DEPTH;
1936
+ return Math.floor(LOCATION_MIN_DEPTH + curved * range);
1937
+ }
1938
+
1939
+ var syllables = [
1940
+ "A",
1941
+ "Ab",
1942
+ "Abl",
1943
+ "Abr",
1944
+ "Ach",
1945
+ "Acr",
1946
+ "Ad",
1947
+ "Ae",
1948
+ "Aed",
1949
+ "Aeg",
1950
+ "Aek",
1951
+ "Ael",
1952
+ "Aem",
1953
+ "Aen",
1954
+ "Aeon",
1955
+ "Aep",
1956
+ "Aer",
1957
+ "Aes",
1958
+ "Aesk",
1959
+ "Aet",
1960
+ "Aev",
1961
+ "Ag",
1962
+ "Agr",
1963
+ "Ahl",
1964
+ "Ai",
1965
+ "Ail",
1966
+ "Ain",
1967
+ "Ais",
1968
+ "Ak",
1969
+ "Aka",
1970
+ "Al",
1971
+ "Alb",
1972
+ "Ald",
1973
+ "Alg",
1974
+ "Alk",
1975
+ "Alm",
1976
+ "Alt",
1977
+ "Alv",
1978
+ "Am",
1979
+ "Amb",
1980
+ "Ami",
1981
+ "Amp",
1982
+ "An",
1983
+ "Anc",
1984
+ "Ang",
1985
+ "Ank",
1986
+ "Ann",
1987
+ "Ant",
1988
+ "Ap",
1989
+ "Aph",
1990
+ "Aqu",
1991
+ "Ar",
1992
+ "Ara",
1993
+ "Arb",
1994
+ "Arc",
1995
+ "Ard",
1996
+ "Arg",
1997
+ "Ari",
1998
+ "Arl",
1999
+ "Arm",
2000
+ "Arn",
2001
+ "Arr",
2002
+ "Ars",
2003
+ "Art",
2004
+ "As",
2005
+ "Asa",
2006
+ "Ash",
2007
+ "Asp",
2008
+ "Ast",
2009
+ "Astr",
2010
+ "At",
2011
+ "Ath",
2012
+ "Atr",
2013
+ "Aud",
2014
+ "Aug",
2015
+ "Aul",
2016
+ "Aum",
2017
+ "Aun",
2018
+ "Aur",
2019
+ "Aus",
2020
+ "Av",
2021
+ "Avn",
2046
2022
  "Ax",
2047
2023
  "Ayn",
2048
2024
  "Az",
@@ -4206,9 +4182,7 @@ function deriveLocationStatic(gameSeed, coordinates) {
4206
4182
  else {
4207
4183
  loc.type = UInt8.from(LocationType.NEBULA);
4208
4184
  }
4209
- loc.subtype = UInt8.from(Number(loc.type) === LocationType.PLANET
4210
- ? hashResult.array[2] % 6
4211
- : hashResult.array[2]);
4185
+ loc.subtype = UInt8.from(Number(loc.type) === LocationType.PLANET ? hashResult.array[2] % 6 : hashResult.array[2]);
4212
4186
  loc.seed0 = UInt8.from(hashResult.array[3]);
4213
4187
  loc.seed1 = UInt8.from(hashResult.array[4]);
4214
4188
  return loc;
@@ -4225,9 +4199,11 @@ function deriveLocationEpoch(epochSeed, coordinates) {
4225
4199
  });
4226
4200
  }
4227
4201
  function deriveLocation(gameSeed, epochSeed, coordinates) {
4202
+ const staticProps = deriveLocationStatic(gameSeed, coordinates);
4228
4203
  return Types.location_derived.from({
4229
- static_props: deriveLocationStatic(gameSeed, coordinates),
4204
+ static_props: staticProps,
4230
4205
  epoch_props: deriveLocationEpoch(epochSeed, coordinates),
4206
+ size: deriveLocationSize(staticProps),
4231
4207
  });
4232
4208
  }
4233
4209
 
@@ -4325,145 +4301,140 @@ class BaseManager {
4325
4301
  }
4326
4302
 
4327
4303
  var itemsData = [
4304
+ {
4305
+ id: 26,
4306
+ name: "Iron",
4307
+ description: "A versatile metal used in hulls and structures.",
4308
+ mass: 40000,
4309
+ category: "metal",
4310
+ tier: "t1",
4311
+ color: "#B7410E"
4312
+ },
4313
+ {
4314
+ id: 13,
4315
+ name: "Aluminum",
4316
+ description: "A lightweight metal for structural components.",
4317
+ mass: 27000,
4318
+ category: "metal",
4319
+ tier: "t2",
4320
+ color: "#A8B5C2"
4321
+ },
4322
+ {
4323
+ id: 24,
4324
+ name: "Chromium",
4325
+ description: "A hard, corrosion-resistant alloy metal.",
4326
+ mass: 52000,
4327
+ category: "metal",
4328
+ tier: "t3",
4329
+ color: "#D4E6F1"
4330
+ },
4331
+ {
4332
+ id: 29,
4333
+ name: "Copper",
4334
+ description: "A conductive metal for electronics and wiring.",
4335
+ mass: 60000,
4336
+ category: "precious",
4337
+ tier: "t1",
4338
+ color: "#B87333"
4339
+ },
4340
+ {
4341
+ id: 47,
4342
+ name: "Silver",
4343
+ description: "A high-conductivity metal for precision components.",
4344
+ mass: 55000,
4345
+ category: "precious",
4346
+ tier: "t2",
4347
+ color: "#C0C0C0"
4348
+ },
4349
+ {
4350
+ id: 79,
4351
+ name: "Gold",
4352
+ description: "A corrosion-proof metal for advanced electronics.",
4353
+ mass: 70000,
4354
+ category: "precious",
4355
+ tier: "t3",
4356
+ color: "#FFD700"
4357
+ },
4328
4358
  {
4329
4359
  id: 1,
4330
4360
  name: "Hydrogen",
4331
4361
  description: "A lightweight gas used for fuel cells and propulsion.",
4332
- base_price: 50,
4333
4362
  mass: 15000,
4334
4363
  category: "gas",
4335
- rarity: "common",
4364
+ tier: "t1",
4336
4365
  color: "#7EC8E3"
4337
4366
  },
4338
4367
  {
4339
4368
  id: 2,
4340
4369
  name: "Helium",
4341
4370
  description: "An inert noble gas used in energy systems.",
4342
- base_price: 75,
4343
4371
  mass: 2000,
4344
4372
  category: "gas",
4345
- rarity: "uncommon",
4373
+ tier: "t2",
4346
4374
  color: "#F5E6CC"
4347
4375
  },
4348
- {
4349
- id: 6,
4350
- name: "Carbon",
4351
- description: "A versatile element for life support and coatings.",
4352
- base_price: 100,
4353
- mass: 12000,
4354
- category: "organic",
4355
- rarity: "common",
4356
- color: "#4A4A4A"
4357
- },
4358
- {
4359
- id: 14,
4360
- name: "Silicon",
4361
- description: "A semiconductor used in sensors and computing.",
4362
- base_price: 150,
4363
- mass: 28000,
4364
- category: "mineral",
4365
- rarity: "common",
4366
- color: "#B8A9C9"
4367
- },
4368
4376
  {
4369
4377
  id: 18,
4370
4378
  name: "Argon",
4371
4379
  description: "A noble gas used in industrial and energy applications.",
4372
- base_price: 60,
4373
4380
  mass: 8000,
4374
4381
  category: "gas",
4375
- rarity: "rare",
4382
+ tier: "t3",
4376
4383
  color: "#9B59B6"
4377
4384
  },
4378
4385
  {
4379
- id: 22,
4380
- name: "Titanium",
4381
- description: "A strong, lightweight metal for ship construction.",
4382
- base_price: 300,
4383
- mass: 48000,
4384
- category: "metal",
4385
- rarity: "rare",
4386
- color: "#C0C0C0"
4387
- },
4388
- {
4389
- id: 26,
4390
- name: "Iron",
4391
- description: "A versatile metal used in hulls and structures.",
4392
- base_price: 125,
4393
- mass: 40000,
4394
- category: "metal",
4395
- rarity: "common",
4396
- color: "#B7410E"
4397
- },
4398
- {
4399
- id: 29,
4400
- name: "Copper",
4401
- description: "A conductive metal for electronics and wiring.",
4402
- base_price: 200,
4403
- mass: 60000,
4404
- category: "metal",
4405
- rarity: "uncommon",
4406
- color: "#B87333"
4407
- },
4408
- {
4409
- id: 54,
4410
- name: "Xenon",
4411
- description: "A rare noble gas for advanced propulsion systems.",
4412
- base_price: 175,
4413
- mass: 20000,
4414
- category: "gas",
4415
- rarity: "epic",
4416
- color: "#5B2C6F"
4417
- },
4418
- {
4419
- id: 74,
4420
- name: "Tungsten",
4421
- description: "An extremely dense metal for heavy-duty applications.",
4422
- base_price: 500,
4423
- mass: 80000,
4424
- category: "metal",
4425
- rarity: "epic",
4426
- color: "#708090"
4386
+ id: 14,
4387
+ name: "Silicon",
4388
+ description: "A semiconductor used in sensors and computing.",
4389
+ mass: 28000,
4390
+ category: "mineral",
4391
+ tier: "t1",
4392
+ color: "#B8A9C9"
4427
4393
  },
4428
4394
  {
4429
4395
  id: 1000,
4430
4396
  name: "Quartz",
4431
4397
  description: "A crystalline mineral for sensors and optics.",
4432
- base_price: 200,
4433
4398
  mass: 35000,
4434
4399
  category: "mineral",
4435
- rarity: "uncommon",
4400
+ tier: "t2",
4436
4401
  color: "#E8D5B7"
4437
4402
  },
4438
4403
  {
4439
4404
  id: 1001,
4440
4405
  name: "Sapphire",
4441
4406
  description: "A precious crystal for precision instruments.",
4442
- base_price: 400,
4443
4407
  mass: 45000,
4444
4408
  category: "mineral",
4445
- rarity: "rare",
4409
+ tier: "t3",
4446
4410
  color: "#0F52BA"
4447
4411
  },
4448
4412
  {
4449
- id: 1002,
4450
- name: "Polymers",
4451
- description: "Synthetic materials for coatings and consumables.",
4452
- base_price: 150,
4453
- mass: 25000,
4413
+ id: 6,
4414
+ name: "Carbon",
4415
+ description: "A versatile element for life support and coatings.",
4416
+ mass: 12000,
4454
4417
  category: "organic",
4455
- rarity: "rare",
4456
- color: "#2ECC71"
4418
+ tier: "t1",
4419
+ color: "#4A4A4A"
4457
4420
  },
4458
4421
  {
4459
4422
  id: 1003,
4460
4423
  name: "Biomass",
4461
4424
  description: "Organic matter for life support systems.",
4462
- base_price: 100,
4463
4425
  mass: 30000,
4464
4426
  category: "organic",
4465
- rarity: "uncommon",
4427
+ tier: "t2",
4466
4428
  color: "#8B4513"
4429
+ },
4430
+ {
4431
+ id: 1002,
4432
+ name: "Resin",
4433
+ description: "A fossilized organic compound for coatings and sealants.",
4434
+ mass: 25000,
4435
+ category: "organic",
4436
+ tier: "t3",
4437
+ color: "#DAA520"
4467
4438
  }
4468
4439
  ];
4469
4440
 
@@ -4471,10 +4442,9 @@ const items = itemsData.map((g) => Item.from({
4471
4442
  id: g.id,
4472
4443
  name: g.name,
4473
4444
  description: g.description,
4474
- base_price: g.base_price,
4475
4445
  mass: g.mass,
4476
4446
  category: g.category,
4477
- rarity: g.rarity,
4447
+ tier: g.tier,
4478
4448
  color: g.color,
4479
4449
  }));
4480
4450
  const itemIds = items.map((i) => i.id);
@@ -4782,9 +4752,6 @@ function capsHasStorage(caps) {
4782
4752
  function capsHasLoaders(caps) {
4783
4753
  return caps.loaders !== undefined;
4784
4754
  }
4785
- function capsHasTrade(caps) {
4786
- return caps.trade !== undefined;
4787
- }
4788
4755
  function capsHasExtractor(caps) {
4789
4756
  return caps.extractor !== undefined;
4790
4757
  }
@@ -4800,13 +4767,6 @@ function calcCargoMass(entity) {
4800
4767
  }
4801
4768
  return mass;
4802
4769
  }
4803
- function calcCargoValue(entity) {
4804
- let value = UInt64.from(0);
4805
- for (const item of entity.cargo) {
4806
- value = value.adding(item.unit_cost.multiplying(item.quantity));
4807
- }
4808
- return value;
4809
- }
4810
4770
  function availableCapacity$1(entity) {
4811
4771
  const cargoMass = calcCargoMass(entity);
4812
4772
  return entity.capacity.gt(cargoMass)
@@ -5003,7 +4963,6 @@ function createProjectedEntity(entity) {
5003
4963
  const loaders = entity.loaders;
5004
4964
  const engines = entity.engines;
5005
4965
  const generator = entity.generator;
5006
- const trade = entity.trade;
5007
4966
  const capacity = entity.capacity;
5008
4967
  const projected = {
5009
4968
  location: Coordinates.from(entity.coordinates),
@@ -5014,7 +4973,6 @@ function createProjectedEntity(entity) {
5014
4973
  engines,
5015
4974
  generator,
5016
4975
  loaders,
5017
- trade,
5018
4976
  get totalMass() {
5019
4977
  let mass = UInt64.from(this.shipMass).adding(this.cargoMass);
5020
4978
  if (this.loaders) {
@@ -5031,9 +4989,6 @@ function createProjectedEntity(entity) {
5031
4989
  hasLoaders() {
5032
4990
  return capsHasLoaders(this.capabilities());
5033
4991
  },
5034
- hasTrade() {
5035
- return this.trade !== undefined;
5036
- },
5037
4992
  capabilities() {
5038
4993
  return {
5039
4994
  hullmass: this.shipMass,
@@ -5041,7 +4996,6 @@ function createProjectedEntity(entity) {
5041
4996
  engines: this.engines,
5042
4997
  generator: this.generator,
5043
4998
  loaders: this.loaders,
5044
- trade: this.trade,
5045
4999
  };
5046
5000
  },
5047
5001
  state() {
@@ -5216,17 +5170,6 @@ class Location {
5216
5170
  isExtractableAt(gameSeed) {
5217
5171
  return isExtractableLocation(this.getLocationTypeAt(gameSeed));
5218
5172
  }
5219
- setMarketPrices(prices) {
5220
- this._marketPrices = prices;
5221
- }
5222
- get marketPrices() {
5223
- return this._marketPrices;
5224
- }
5225
- getPrice(goodId) {
5226
- if (!this._marketPrices)
5227
- return undefined;
5228
- return this._marketPrices.find((p) => p.id.equals(goodId));
5229
- }
5230
5173
  findNearby(gameSeed, maxDistance = 20) {
5231
5174
  return findNearbyPlanets(Checksum256.from(gameSeed), this.coordinates, maxDistance);
5232
5175
  }
@@ -5234,90 +5177,12 @@ class Location {
5234
5177
  const otherCoords = other instanceof Location ? other.coordinates : Coordinates.from(other);
5235
5178
  return this.coordinates.equals(otherCoords);
5236
5179
  }
5237
- setLocationRows(rows, epoch) {
5238
- this._locationRows = rows;
5239
- this._epoch = epoch;
5240
- }
5241
- get locationRows() {
5242
- return this._locationRows;
5243
- }
5244
- getSupply(goodId) {
5245
- if (!this._locationRows)
5246
- return undefined;
5247
- const row = this._locationRows.find((r) => r.item_id.equals(goodId) && this._epoch && r.epoch.equals(this._epoch));
5248
- return row ? row.supply : undefined;
5249
- }
5250
- get availableGoods() {
5251
- if (!this._locationRows)
5252
- return undefined;
5253
- return this._locationRows.filter((r) => this._epoch && r.epoch.equals(this._epoch) && r.supply.gt(UInt16.from(0)));
5254
- }
5255
- hasGood(goodId) {
5256
- const supply = this.getSupply(goodId);
5257
- return supply !== undefined && supply.gt(UInt16.from(0));
5258
- }
5259
5180
  get epoch() {
5260
5181
  return this._epoch;
5261
5182
  }
5262
- get hasCachedData() {
5263
- return this._marketPrices !== undefined || this._locationRows !== undefined;
5264
- }
5265
- get hasSupplyData() {
5266
- return this._locationRows !== undefined;
5267
- }
5268
5183
  clearCache() {
5269
- this._marketPrices = undefined;
5270
- this._locationRows = undefined;
5271
5184
  this._epoch = undefined;
5272
5185
  }
5273
- withUpdatedSupply(goodId, quantityDelta) {
5274
- const newLocation = Location.from(this.coordinates);
5275
- if (this._marketPrices) {
5276
- newLocation._marketPrices = this._marketPrices.map((price) => {
5277
- if (price.id.equals(goodId)) {
5278
- const currentSupply = UInt16.from(price.supply);
5279
- const delta = UInt16.from(Math.abs(quantityDelta));
5280
- const newSupply = quantityDelta < 0
5281
- ? currentSupply.gte(delta)
5282
- ? currentSupply.subtracting(delta)
5283
- : UInt16.from(0)
5284
- : currentSupply.adding(quantityDelta);
5285
- return ItemPrice.from({
5286
- id: price.id,
5287
- item: price.item,
5288
- price: price.price,
5289
- supply: newSupply,
5290
- });
5291
- }
5292
- return price;
5293
- });
5294
- }
5295
- if (this._locationRows && this._epoch) {
5296
- newLocation._locationRows = this._locationRows.map((row) => {
5297
- if (row.item_id.equals(goodId) && row.epoch.equals(this._epoch)) {
5298
- const currentSupply = UInt16.from(row.supply);
5299
- const delta = UInt16.from(Math.abs(quantityDelta));
5300
- const newSupply = quantityDelta < 0
5301
- ? currentSupply.gte(delta)
5302
- ? currentSupply.subtracting(delta)
5303
- : UInt16.from(0)
5304
- : currentSupply.adding(quantityDelta);
5305
- return Types.supply_row.from({
5306
- id: row.id,
5307
- coordinates: row.coordinates,
5308
- epoch: row.epoch,
5309
- item_id: row.item_id,
5310
- supply: newSupply,
5311
- });
5312
- }
5313
- return row;
5314
- });
5315
- newLocation._epoch = this._epoch;
5316
- }
5317
- newLocation._gameSeed = this._gameSeed;
5318
- newLocation._hasSystem = this._hasSystem;
5319
- return newLocation;
5320
- }
5321
5186
  }
5322
5187
  function toLocation(coords) {
5323
5188
  if (coords instanceof Location) {
@@ -5405,9 +5270,6 @@ class EntityInventory extends Types.cargo_item {
5405
5270
  get totalMass() {
5406
5271
  return UInt64.from(this.unitMass).multiplying(this.quantity);
5407
5272
  }
5408
- get totalCost() {
5409
- return this.unit_cost.multiplying(this.quantity);
5410
- }
5411
5273
  get hasCargo() {
5412
5274
  return UInt32.from(this.quantity).gt(UInt32.from(0));
5413
5275
  }
@@ -5429,9 +5291,6 @@ class InventoryAccessor {
5429
5291
  get totalMass() {
5430
5292
  return this.items.reduce((sum, c) => sum.adding(c.totalMass), UInt64.from(0));
5431
5293
  }
5432
- get totalValue() {
5433
- return this.items.reduce((sum, c) => sum.adding(c.totalCost), UInt64.from(0));
5434
- }
5435
5294
  forItem(goodId) {
5436
5295
  return this.items.find((c) => c.item_id.equals(goodId));
5437
5296
  }
@@ -5468,106 +5327,6 @@ function needsRecharge(entity) {
5468
5327
  return UInt64.from(entity.energy).lt(entity.generator.capacity);
5469
5328
  }
5470
5329
 
5471
- function totalCargoMass(cargo) {
5472
- return cargo.reduce((sum, c) => {
5473
- return sum.adding(c.totalMass);
5474
- }, UInt64.from(0));
5475
- }
5476
- function cargoValue(cargo) {
5477
- return cargo.reduce((sum, c) => {
5478
- return sum.adding(c.totalCost);
5479
- }, UInt64.from(0));
5480
- }
5481
- function getCargoForItem(cargo, goodId) {
5482
- return cargo.find((c) => c.item_id.equals(goodId));
5483
- }
5484
- function hasSpace(currentMass, maxCapacity, goodMass, quantity) {
5485
- const additionalMass = goodMass.multiplying(quantity);
5486
- const totalMass = currentMass.adding(additionalMass);
5487
- return totalMass.lte(maxCapacity);
5488
- }
5489
- function availableCapacity(currentMass, maxCapacity) {
5490
- if (currentMass.gte(maxCapacity)) {
5491
- return UInt64.from(0);
5492
- }
5493
- return maxCapacity.subtracting(currentMass);
5494
- }
5495
- function isFull(currentMass, maxCapacity) {
5496
- return currentMass.gte(maxCapacity);
5497
- }
5498
- function calculateSaleValue(cargo, prices) {
5499
- if (cargo.length === 0) {
5500
- return { revenue: UInt64.from(0), profit: UInt64.from(0), cost: UInt64.from(0) };
5501
- }
5502
- let revenue = UInt64.from(0);
5503
- let cost = UInt64.from(0);
5504
- for (const item of cargo) {
5505
- if (UInt32.from(item.quantity).equals(UInt32.from(0)))
5506
- continue;
5507
- const goodId = Number(item.item_id);
5508
- const salePrice = prices.get(goodId);
5509
- if (salePrice) {
5510
- revenue = revenue.adding(salePrice.multiplying(item.quantity));
5511
- }
5512
- cost = cost.adding(item.unit_cost.multiplying(item.quantity));
5513
- }
5514
- const profit = revenue.gte(cost) ? revenue.subtracting(cost) : UInt64.from(0);
5515
- return {
5516
- revenue,
5517
- profit,
5518
- cost,
5519
- };
5520
- }
5521
- function calculateSaleValueFromArray(cargo, prices) {
5522
- const priceMap = new Map();
5523
- prices.forEach((price, index) => {
5524
- priceMap.set(index, price);
5525
- });
5526
- return calculateSaleValue(cargo, priceMap);
5527
- }
5528
- function afterSellItems(cargo, goodsToSell) {
5529
- if (cargo.length === 0) {
5530
- return [];
5531
- }
5532
- return cargo.map((item) => {
5533
- const saleItem = goodsToSell.find((s) => Number(item.item_id) === s.goodId);
5534
- if (!saleItem) {
5535
- return new EntityInventory(item);
5536
- }
5537
- const currentQty = Number(item.quantity);
5538
- const newQty = Math.max(0, currentQty - saleItem.quantity);
5539
- return new EntityInventory(Types.cargo_item.from({
5540
- item_id: item.item_id,
5541
- quantity: UInt32.from(newQty),
5542
- unit_cost: item.unit_cost,
5543
- }));
5544
- });
5545
- }
5546
- function afterSellAllItems(cargo) {
5547
- if (cargo.length === 0) {
5548
- return [];
5549
- }
5550
- return cargo.map((item) => new EntityInventory(Types.cargo_item.from({
5551
- item_id: item.item_id,
5552
- quantity: UInt32.from(0),
5553
- unit_cost: item.unit_cost,
5554
- })));
5555
- }
5556
-
5557
- var cargoUtils = /*#__PURE__*/Object.freeze({
5558
- __proto__: null,
5559
- totalCargoMass: totalCargoMass,
5560
- cargoValue: cargoValue,
5561
- getCargoForItem: getCargoForItem,
5562
- hasSpace: hasSpace,
5563
- availableCapacity: availableCapacity,
5564
- isFull: isFull,
5565
- calculateSaleValue: calculateSaleValue,
5566
- calculateSaleValueFromArray: calculateSaleValueFromArray,
5567
- afterSellItems: afterSellItems,
5568
- afterSellAllItems: afterSellAllItems
5569
- });
5570
-
5571
5330
  class Ship extends Types.entity_info {
5572
5331
  get name() {
5573
5332
  return this.entity_name;
@@ -5634,9 +5393,6 @@ class Ship extends Types.entity_info {
5634
5393
  get totalCargoMass() {
5635
5394
  return this.inv.totalMass;
5636
5395
  }
5637
- get cargoValue() {
5638
- return this.inv.totalValue;
5639
- }
5640
5396
  get totalMass() {
5641
5397
  let mass = UInt64.from(this.hullmass ?? 0).adding(this.totalCargoMass);
5642
5398
  if (this.loaders) {
@@ -5685,18 +5441,6 @@ class Ship extends Types.entity_info {
5685
5441
  return false;
5686
5442
  return hasEnergyForDistance(this, distance);
5687
5443
  }
5688
- calculateSaleValue(prices) {
5689
- return calculateSaleValue(this.cargo, prices);
5690
- }
5691
- calculateSaleValueFromArray(prices) {
5692
- return calculateSaleValueFromArray(this.cargo, prices);
5693
- }
5694
- afterSellItems(goodsToSell) {
5695
- return afterSellItems(this.cargo, goodsToSell);
5696
- }
5697
- afterSellAllItems() {
5698
- return afterSellAllItems(this.cargo);
5699
- }
5700
5444
  }
5701
5445
 
5702
5446
  class Warehouse extends Types.entity_info {
@@ -5727,9 +5471,6 @@ class Warehouse extends Types.entity_info {
5727
5471
  get totalCargoMass() {
5728
5472
  return this.inv.totalMass;
5729
5473
  }
5730
- get cargoValue() {
5731
- return this.inv.totalValue;
5732
- }
5733
5474
  get maxCapacity() {
5734
5475
  return UInt64.from(this.capacity);
5735
5476
  }
@@ -5790,6 +5531,17 @@ class Container extends Types.entity_info {
5790
5531
  return this.coordinates.z?.toNumber() || 0;
5791
5532
  }
5792
5533
  }
5534
+ function computeContainerCapabilities(stats) {
5535
+ const density = stats['density'] ?? 500;
5536
+ const strength = stats['strength'] ?? 500;
5537
+ const ductility = stats['ductility'] ?? 500;
5538
+ const purity = stats['purity'] ?? 500;
5539
+ const hullmass = 25000 + 75 * density;
5540
+ const statSum = strength + ductility + purity;
5541
+ const exponent = statSum / 2997;
5542
+ const capacity = Math.floor(1000000 * Math.pow(10, exponent));
5543
+ return { hullmass, capacity };
5544
+ }
5793
5545
 
5794
5546
  class EntitiesManager extends BaseManager {
5795
5547
  async getEntity(type, id) {
@@ -5867,134 +5619,10 @@ class Player extends Types.player_row {
5867
5619
  static fromState(state) {
5868
5620
  const playerRow = Types.player_row.from({
5869
5621
  owner: Name.from(state.owner),
5870
- balance: UInt64.from(state.balance),
5871
- debt: UInt32.from(state.debt),
5872
- networth: Int64.from(state.networth),
5873
5622
  });
5874
5623
  return new Player(playerRow);
5875
5624
  }
5876
- setShipCount(count) {
5877
- this._shipCount = count;
5878
- }
5879
- get shipCount() {
5880
- return this._shipCount;
5881
- }
5882
- getNextShipCost(shipCount) {
5883
- const count = shipCount ?? this._shipCount ?? 0;
5884
- const cost = Math.pow(Player.SHIP_COST_MULTIPLIER, count) * Player.BASE_SHIP_COST;
5885
- return UInt64.from(Math.floor(cost));
5886
- }
5887
- get nextShipCost() {
5888
- return this.getNextShipCost();
5889
- }
5890
- canBuyShip(shipCount) {
5891
- return UInt64.from(this.balance).gte(this.getNextShipCost(shipCount));
5892
- }
5893
- get availableLoan() {
5894
- const maxLoan = UInt64.from(Player.MAX_LOAN);
5895
- if (UInt64.from(this.debt).gte(maxLoan)) {
5896
- return UInt64.from(0);
5897
- }
5898
- return maxLoan.subtracting(this.debt);
5899
- }
5900
- get canTakeLoan() {
5901
- return this.availableLoan.gt(UInt64.zero);
5902
- }
5903
- get canPayLoan() {
5904
- return UInt64.from(this.debt).gt(UInt64.zero) && UInt64.from(this.balance).gt(UInt64.zero);
5905
- }
5906
- get maxPayback() {
5907
- return UInt64.from(this.debt).lt(this.balance) ? this.debt : this.balance;
5908
- }
5909
- static get MAX_LOAN_LIMIT() {
5910
- return Player.MAX_LOAN;
5911
- }
5912
- get hasDebt() {
5913
- return UInt64.from(this.debt).gt(UInt64.zero);
5914
- }
5915
- get isSolvent() {
5916
- return this.networth.gte(Int64.zero);
5917
- }
5918
- withBalanceChange(delta) {
5919
- const newPlayer = Player.from(this);
5920
- const amount = typeof delta === 'number' ? UInt64.from(Math.abs(delta)) : delta;
5921
- if (typeof delta === 'number' && delta < 0) {
5922
- newPlayer.balance = UInt64.from(this.balance).gte(amount)
5923
- ? this.balance.subtracting(amount)
5924
- : UInt64.from(0);
5925
- }
5926
- else {
5927
- newPlayer.balance = this.balance.adding(amount);
5928
- }
5929
- const balanceInt = Int64.from(newPlayer.balance);
5930
- const debtInt = Int64.from(newPlayer.debt);
5931
- newPlayer.networth = balanceInt.subtracting(debtInt);
5932
- return newPlayer;
5933
- }
5934
- withDebtChange(delta) {
5935
- const newPlayer = Player.from(this);
5936
- const amount = typeof delta === 'number' ? UInt64.from(Math.abs(delta)) : delta;
5937
- if (typeof delta === 'number' && delta < 0) {
5938
- newPlayer.debt = UInt64.from(this.debt).gte(amount)
5939
- ? this.debt.subtracting(amount)
5940
- : UInt64.from(0);
5941
- }
5942
- else {
5943
- newPlayer.debt = this.debt.adding(amount);
5944
- }
5945
- const balanceInt = Int64.from(newPlayer.balance);
5946
- const debtInt = Int64.from(newPlayer.debt);
5947
- newPlayer.networth = balanceInt.subtracting(debtInt);
5948
- return newPlayer;
5949
- }
5950
- withLoan(amount) {
5951
- const newPlayer = Player.from(this);
5952
- newPlayer.balance = this.balance.adding(amount);
5953
- newPlayer.debt = this.debt.adding(amount);
5954
- const balanceInt = Int64.from(newPlayer.balance);
5955
- const debtInt = Int64.from(newPlayer.debt);
5956
- newPlayer.networth = balanceInt.subtracting(debtInt);
5957
- return newPlayer;
5958
- }
5959
- withLoanPayment(amount) {
5960
- const actualPayment = this.maxPayback.lt(amount) ? this.maxPayback : amount;
5961
- const newPlayer = Player.from(this);
5962
- newPlayer.balance = this.balance.subtracting(actualPayment);
5963
- newPlayer.debt = this.debt.subtracting(actualPayment);
5964
- const balanceInt = Int64.from(newPlayer.balance);
5965
- const debtInt = Int64.from(newPlayer.debt);
5966
- newPlayer.networth = balanceInt.subtracting(debtInt);
5967
- return newPlayer;
5968
- }
5969
- withSaleNetworth(sellPrice, paidPerUnit, quantity) {
5970
- const cost = paidPerUnit.multiplying(quantity);
5971
- const profit = sellPrice.gte(cost) ? sellPrice.subtracting(cost) : Int64.from(0);
5972
- const newPlayer = Player.from(this);
5973
- newPlayer.networth = Int64.from(this.networth).adding(profit);
5974
- return newPlayer;
5975
- }
5976
- withSellGoods(sellPrice, paidPerUnit, quantity) {
5977
- const cost = paidPerUnit.multiplying(quantity);
5978
- const profit = sellPrice.gte(cost) ? sellPrice.subtracting(cost) : Int64.from(0);
5979
- const newPlayer = Player.from(this);
5980
- newPlayer.balance = this.balance.adding(sellPrice);
5981
- newPlayer.networth = Int64.from(this.networth).adding(profit);
5982
- return newPlayer;
5983
- }
5984
- withBuyGoods(purchaseCost) {
5985
- const newPlayer = Player.from(this);
5986
- newPlayer.balance = UInt64.from(this.balance).gte(purchaseCost)
5987
- ? this.balance.subtracting(purchaseCost)
5988
- : UInt64.from(0);
5989
- const balanceInt = Int64.from(newPlayer.balance);
5990
- const debtInt = Int64.from(newPlayer.debt);
5991
- newPlayer.networth = balanceInt.subtracting(debtInt);
5992
- return newPlayer;
5993
- }
5994
5625
  }
5995
- Player.MAX_LOAN = 1000000;
5996
- Player.BASE_SHIP_COST = 500;
5997
- Player.SHIP_COST_MULTIPLIER = 5;
5998
5626
 
5999
5627
  class PlayersManager extends BaseManager {
6000
5628
  async getPlayer(account) {
@@ -6006,211 +5634,7 @@ class PlayersManager extends BaseManager {
6006
5634
  }
6007
5635
  }
6008
5636
 
6009
- function roll(gameSeed, rollSeed) {
6010
- const hash = hash512(gameSeed, rollSeed);
6011
- return (hash.array[0] << 8) | hash.array[1];
6012
- }
6013
-
6014
- var Rarities;
6015
- (function (Rarities) {
6016
- Rarities["legendary"] = "LEGENDARY";
6017
- Rarities["epic"] = "EPIC";
6018
- Rarities["rare"] = "RARE";
6019
- Rarities["uncommon"] = "UNCOMMON";
6020
- Rarities["common"] = "COMMON";
6021
- Rarities["trash"] = "TRASH";
6022
- })(Rarities || (Rarities = {}));
6023
- function getRarity(gameSeed, epochSeed, location, goodId) {
6024
- const seed = `${epochSeed}${location.x}${location.y}${goodId}rarity`;
6025
- const rarityRoll = roll(gameSeed, seed);
6026
- if (rarityRoll < 13) {
6027
- return {
6028
- rarity: Rarities.legendary,
6029
- minMultiplier: 2.25,
6030
- maxMultiplier: 3.0,
6031
- };
6032
- }
6033
- else if (rarityRoll < 176) {
6034
- return {
6035
- rarity: Rarities.epic,
6036
- minMultiplier: 1.75,
6037
- maxMultiplier: 2.25,
6038
- };
6039
- }
6040
- else if (rarityRoll < 996) {
6041
- return {
6042
- rarity: Rarities.rare,
6043
- minMultiplier: 1.4,
6044
- maxMultiplier: 1.75,
6045
- };
6046
- }
6047
- else if (rarityRoll < 2966) {
6048
- return {
6049
- rarity: Rarities.uncommon,
6050
- minMultiplier: 1.225,
6051
- maxMultiplier: 1.4,
6052
- };
6053
- }
6054
- else if (rarityRoll < 19568) {
6055
- return {
6056
- rarity: Rarities.common,
6057
- minMultiplier: 1.07,
6058
- maxMultiplier: 1.225,
6059
- };
6060
- }
6061
- else if (rarityRoll < 45988) {
6062
- return {
6063
- rarity: Rarities.trash,
6064
- minMultiplier: 1,
6065
- maxMultiplier: 1.07,
6066
- };
6067
- }
6068
- else if (rarityRoll < 62508) {
6069
- return {
6070
- rarity: Rarities.common,
6071
- minMultiplier: 0.925,
6072
- maxMultiplier: 1,
6073
- };
6074
- }
6075
- else if (rarityRoll < 64518) {
6076
- return {
6077
- rarity: Rarities.uncommon,
6078
- minMultiplier: 0.77,
6079
- maxMultiplier: 0.925,
6080
- };
6081
- }
6082
- else if (rarityRoll < 65437) {
6083
- return {
6084
- rarity: Rarities.rare,
6085
- minMultiplier: 0.595,
6086
- maxMultiplier: 0.77,
6087
- };
6088
- }
6089
- else if (rarityRoll < 65523) {
6090
- return {
6091
- rarity: Rarities.epic,
6092
- minMultiplier: 0.41,
6093
- maxMultiplier: 0.595,
6094
- };
6095
- }
6096
- else {
6097
- return {
6098
- rarity: Rarities.legendary,
6099
- minMultiplier: 0.285,
6100
- maxMultiplier: 0.41,
6101
- };
6102
- }
6103
- }
6104
- function getRarityMultiplier(gameSeed, epochSeed, location, goodId) {
6105
- const rarity = getRarity(gameSeed, epochSeed, location, goodId);
6106
- const range = rarity.maxMultiplier - rarity.minMultiplier;
6107
- const seed = `${epochSeed}${location.x}${location.y}${goodId}raritymultiplier`;
6108
- const r = roll(gameSeed, seed);
6109
- return rarity.minMultiplier + (r / 65535) * range;
6110
- }
6111
- function getLocationMultiplier(gameSeed, location, goodId) {
6112
- const seed = `${location.x}${location.y}${goodId}locationmultiplier`;
6113
- const r = roll(gameSeed, seed);
6114
- if (r < 13) {
6115
- return 0.75;
6116
- }
6117
- else if (r < 176) {
6118
- return 0.8;
6119
- }
6120
- else if (r < 996) {
6121
- return 0.85;
6122
- }
6123
- else if (r < 2966) {
6124
- return 0.9;
6125
- }
6126
- else if (r < 19568) {
6127
- return 0.95;
6128
- }
6129
- else if (r < 45988) {
6130
- return 1;
6131
- }
6132
- else if (r < 62508) {
6133
- return 1.05;
6134
- }
6135
- else if (r < 64518) {
6136
- return 1.1;
6137
- }
6138
- else if (r < 65437) {
6139
- return 1.15;
6140
- }
6141
- else if (r < 65523) {
6142
- return 1.2;
6143
- }
6144
- else {
6145
- return 1.25;
6146
- }
6147
- }
6148
- function getSupply(gameSeed, state, location, goodId) {
6149
- const seed = `${state.seed}${location.x}${location.y}${goodId}supply`;
6150
- const r = roll(gameSeed, seed);
6151
- const percent = r / 65535;
6152
- const epoch = 1 + Number(state.epoch) / 90;
6153
- const ship = 1;
6154
- const goodIdNum = Number(goodId);
6155
- const base = Math.floor(128 / goodIdNum);
6156
- return Math.floor(base * percent * ship * epoch);
6157
- }
6158
- function marketPrice(location, goodId, gameSeed, state) {
6159
- const item = getItem(goodId);
6160
- let price = Number(item.base_price);
6161
- const rarityMultiplier = getRarityMultiplier(gameSeed, state.seed, location, goodId);
6162
- price *= rarityMultiplier;
6163
- const locationMultiplier = getLocationMultiplier(gameSeed, location, goodId);
6164
- price *= locationMultiplier;
6165
- const supply = getSupply(gameSeed, state, location, goodId);
6166
- return ItemPrice.from({
6167
- id: goodId,
6168
- item,
6169
- price: UInt32.from(price),
6170
- supply: UInt16.from(supply),
6171
- });
6172
- }
6173
- function marketPrices(location, gameSeed, state) {
6174
- return getItems().map((item) => marketPrice(location, item.id, gameSeed, state));
6175
- }
6176
-
6177
5637
  class LocationsManager extends BaseManager {
6178
- async getMarketPrice(location, goodId) {
6179
- const game = await this.getGame();
6180
- const state = await this.getState();
6181
- return marketPrice(location, goodId, game.config.seed, state);
6182
- }
6183
- async getMarketPrices(location) {
6184
- const game = await this.getGame();
6185
- const state = await this.getState();
6186
- return marketPrices(location, game.config.seed, state);
6187
- }
6188
- async getMarketPricesWithSupply(location) {
6189
- const [game, state, supplyRows] = await Promise.all([
6190
- this.getGame(),
6191
- this.getState(),
6192
- this.getSupplyRows(location),
6193
- ]);
6194
- const prices = marketPrices(location, game.config.seed, state);
6195
- const supplyMap = new Map();
6196
- for (const row of supplyRows) {
6197
- if (UInt64.from(row.epoch).equals(state.epoch)) {
6198
- supplyMap.set(Number(row.item_id), Number(row.supply));
6199
- }
6200
- }
6201
- return prices.map((price) => {
6202
- const actualSupply = supplyMap.get(Number(price.id));
6203
- if (actualSupply !== undefined) {
6204
- return ItemPrice.from({
6205
- id: price.id,
6206
- item: price.item,
6207
- price: price.price,
6208
- supply: UInt64.from(actualSupply),
6209
- });
6210
- }
6211
- return price;
6212
- });
6213
- }
6214
5638
  async hasSystem(location) {
6215
5639
  const game = await this.getGame();
6216
5640
  return hasSystem(game.config.seed, location);
@@ -6219,40 +5643,6 @@ class LocationsManager extends BaseManager {
6219
5643
  const game = await this.getGame();
6220
5644
  return findNearbyPlanets(game.config.seed, origin, maxDistance);
6221
5645
  }
6222
- async getSupplyRows(location) {
6223
- const hash = Checksum256.hash(Bytes.from(`${location.x}-${location.y}`, 'utf8'));
6224
- return this.server.table('supply').all({
6225
- index_position: 'secondary',
6226
- from: hash,
6227
- to: hash,
6228
- });
6229
- }
6230
- async getLocationWithPrices(coords) {
6231
- const location = toLocation(coords);
6232
- const prices = await this.getMarketPrices(location.coordinates);
6233
- location.setMarketPrices(prices);
6234
- return location;
6235
- }
6236
- async getLocationWithSupply(coords) {
6237
- const location = toLocation(coords);
6238
- const [rows, state] = await Promise.all([
6239
- this.getSupplyRows(location.coordinates),
6240
- this.getState(),
6241
- ]);
6242
- location.setLocationRows(rows, state.epoch);
6243
- return location;
6244
- }
6245
- async getLocationComplete(coords) {
6246
- const location = toLocation(coords);
6247
- const [prices, rows, state] = await Promise.all([
6248
- this.getMarketPrices(location.coordinates),
6249
- this.getSupplyRows(location.coordinates),
6250
- this.getState(),
6251
- ]);
6252
- location.setMarketPrices(prices);
6253
- location.setLocationRows(rows, state.epoch);
6254
- return location;
6255
- }
6256
5646
  async getLocationEntity(id) {
6257
5647
  const row = await this.server.table('location').get(UInt64.from(id));
6258
5648
  return row ?? undefined;
@@ -6266,778 +5656,55 @@ class LocationsManager extends BaseManager {
6266
5656
  }
6267
5657
  }
6268
5658
 
6269
- function calculateUpdatedCargoCost(currentPaid, currentOwned, purchaseCost, purchaseQuantity) {
6270
- const numerator = currentPaid.multiplying(currentOwned).adding(purchaseCost);
6271
- const denominator = UInt32.from(currentOwned).adding(purchaseQuantity);
6272
- return numerator.dividing(denominator);
6273
- }
6274
- function calculateMaxTradeQuantity(ship, player, goodPrice) {
6275
- const pricePerUnit = UInt32.from(goodPrice.price);
6276
- const massPerUnit = UInt32.from(goodPrice.item.mass);
6277
- const spaceForQuantity = ship.availableCapacity.dividing(massPerUnit);
6278
- const affordableQuantity = player.balance.dividing(pricePerUnit);
6279
- const maxQuantity = spaceForQuantity.lt(affordableQuantity)
6280
- ? spaceForQuantity
6281
- : affordableQuantity;
6282
- return {
6283
- maxQuantity: Number(maxQuantity),
6284
- totalCost: Number(maxQuantity.multiplying(pricePerUnit)),
6285
- totalMass: UInt64.from(maxQuantity.multiplying(massPerUnit)),
6286
- affordableQuantity: Number(affordableQuantity),
6287
- spaceForQuantity: Number(spaceForQuantity),
6288
- };
6289
- }
6290
- function calculateTradeProfit(quantity, buyPrice, sellPrice) {
6291
- const qty = UInt32.from(quantity);
6292
- const buy = UInt32.from(buyPrice);
6293
- const sell = UInt32.from(sellPrice);
6294
- const cost = UInt64.from(qty).multiplying(buy);
6295
- const revenue = UInt64.from(qty).multiplying(sell);
6296
- const profit = Int64.from(revenue).subtracting(cost);
6297
- const margin = cost.gt(UInt64.zero) ? (Number(profit) / Number(cost)) * 100 : 0;
6298
- return { revenue, cost, profit, margin };
6299
- }
6300
- function calculateProfitPerMass(quantity, buyPrice, sellPrice, massPerUnit) {
6301
- const profit = (sellPrice - buyPrice) * quantity;
6302
- const totalMass = quantity * massPerUnit;
6303
- return totalMass > 0 ? profit / totalMass : 0;
6304
- }
6305
- function calculateProfitPerSecond(profit, travelTimeSeconds) {
6306
- const t = UInt32.from(travelTimeSeconds);
6307
- return t.gt(UInt32.zero) ? Number(profit) / Number(t) : 0;
6308
- }
6309
- function findBestItemToTrade(ship, player, originPrices, destPrices, travelTimeSeconds) {
6310
- let bestTrade = null;
6311
- let bestProfitPerSecond = 0;
6312
- for (const originPrice of originPrices) {
6313
- const destPrice = destPrices.find((p) => p.id.equals(originPrice.id));
6314
- if (!destPrice)
6315
- continue;
6316
- if (!isProfitable(originPrice.price, destPrice.price))
6317
- continue;
6318
- const calc = calculateMaxTradeQuantity(ship, player, originPrice);
6319
- if (calc.maxQuantity === 0)
6320
- continue;
6321
- const tradeResult = calculateTradeProfit(calc.maxQuantity, originPrice.price, destPrice.price);
6322
- const profitPerSecond = calculateProfitPerSecond(tradeResult.profit, travelTimeSeconds);
6323
- if (profitPerSecond > bestProfitPerSecond) {
6324
- bestProfitPerSecond = profitPerSecond;
6325
- bestTrade = {
6326
- item: originPrice,
6327
- quantity: calc.maxQuantity,
6328
- profit: Number(tradeResult.profit),
6329
- profitPerSecond,
6330
- margin: tradeResult.margin,
6331
- };
6332
- }
5659
+ class EpochsManager extends BaseManager {
5660
+ async getCurrentHeight() {
5661
+ const game = await this.getGame();
5662
+ return getCurrentEpoch(game);
6333
5663
  }
6334
- return bestTrade;
6335
- }
6336
- function calculateBreakEvenPrice(costPaid, quantity) {
6337
- return quantity > 0 ? costPaid / quantity : 0;
6338
- }
6339
- function isProfitable(buyPrice, sellPrice) {
6340
- return UInt32.from(sellPrice).gt(UInt32.from(buyPrice));
6341
- }
6342
- function calculateROI(cost, profit) {
6343
- return cost > 0 ? (profit / cost) * 100 : 0;
6344
- }
6345
-
6346
- async function findDealsForShip(ship, originLocation, getNearbyLocations, getMarketPrices, options = {}) {
6347
- const { maxDeals = 10, maxDistance = 20 * PRECISION, playerBalance, minProfitPerSecond = 0, minMarginPercent = 0, availableSpace, } = options;
6348
- const balance = playerBalance !== undefined ? UInt64.from(playerBalance) : undefined;
6349
- const origin = Location.from(originLocation);
6350
- const originPrices = await getMarketPrices(originLocation);
6351
- origin.setMarketPrices(originPrices);
6352
- const nearbyLocations = await getNearbyLocations(originLocation, maxDistance);
6353
- const deals = [];
6354
- const currentMass = ship.totalMass;
6355
- const shipCapacity = ship.maxCapacity;
6356
- const effectiveAvailableMass = availableSpace !== undefined
6357
- ? UInt64.from(availableSpace)
6358
- : currentMass.lt(shipCapacity)
6359
- ? shipCapacity.subtracting(currentMass)
6360
- : UInt64.zero;
6361
- for (const destLocation of nearbyLocations) {
6362
- const destinationPrices = await getMarketPrices(destLocation.coordinates);
6363
- destLocation.setMarketPrices(destinationPrices);
6364
- const distance = distanceBetweenCoordinates(originLocation, destLocation.coordinates);
6365
- for (const originGood of originPrices) {
6366
- const destGood = destinationPrices.find((g) => g.id.equals(originGood.id));
6367
- if (!destGood)
6368
- continue;
6369
- if (!isProfitable(originGood.price, destGood.price) ||
6370
- originGood.supply.equals(UInt16.from(0))) {
6371
- continue;
6372
- }
6373
- const canAfford = balance !== undefined
6374
- ? balance.dividing(originGood.price)
6375
- : UInt64.from(Number.MAX_SAFE_INTEGER);
6376
- const canHaul = effectiveAvailableMass.dividing(originGood.item.mass);
6377
- const supplyLimit = UInt64.from(originGood.supply);
6378
- let maxQuantity = canAfford;
6379
- if (canHaul.lt(maxQuantity))
6380
- maxQuantity = canHaul;
6381
- if (supplyLimit.lt(maxQuantity))
6382
- maxQuantity = supplyLimit;
6383
- if (maxQuantity.equals(UInt64.zero))
6384
- continue;
6385
- const cargoMass = originGood.item.mass.multiplying(maxQuantity);
6386
- const availableSpaceUInt = UInt64.from(availableSpace);
6387
- const baseMass = availableSpace !== undefined
6388
- ? shipCapacity.gte(availableSpaceUInt)
6389
- ? shipCapacity.subtracting(availableSpaceUInt)
6390
- : UInt64.zero
6391
- : currentMass;
6392
- const totalMass = baseMass.adding(cargoMass);
6393
- const needsRecharge = !ship.hasEnergyFor(distance);
6394
- const travelEstimate = estimateTravelTime(ship, totalMass, distance, {
6395
- needsRecharge,
6396
- loadMass: Number(cargoMass),
6397
- });
6398
- const tradeCalc = calculateTradeProfit(maxQuantity, originGood.price, destGood.price);
6399
- const profitPerUnit = destGood.price.subtracting(originGood.price);
6400
- const profitPerSecond = calculateProfitPerSecond(tradeCalc.profit, travelEstimate.total);
6401
- if (profitPerSecond < minProfitPerSecond)
6402
- continue;
6403
- if (tradeCalc.margin < minMarginPercent)
6404
- continue;
6405
- deals.push({
6406
- origin,
6407
- destination: destLocation,
6408
- item: originGood,
6409
- distance,
6410
- supply: originGood.supply,
6411
- buyPrice: originGood.price,
6412
- sellPrice: destGood.price,
6413
- profitPerUnit,
6414
- maxQuantity: UInt32.from(maxQuantity),
6415
- totalProfit: tradeCalc.profit,
6416
- travelTime: travelEstimate.total,
6417
- travelTimeBreakdown: travelEstimate,
6418
- profitPerSecond,
6419
- marginPercent: tradeCalc.margin,
6420
- });
6421
- }
5664
+ async getCurrent() {
5665
+ const game = await this.getGame();
5666
+ const epoch = await this.getCurrentHeight();
5667
+ return getEpochInfo(game, epoch);
6422
5668
  }
6423
- deals.sort((a, b) => b.profitPerSecond - a.profitPerSecond);
6424
- return deals.slice(0, maxDeals);
6425
- }
6426
- async function findBestDeal(ship, originLocation, getNearbyLocations, getMarketPrices, options = {}) {
6427
- const deals = await findDealsForShip(ship, originLocation, getNearbyLocations, getMarketPrices, {
6428
- ...options,
6429
- maxDeals: 1,
6430
- });
6431
- return deals[0];
6432
- }
6433
-
6434
- function calculateCargoMass(cargo) {
6435
- let mass = UInt32.from(0);
6436
- for (const c of cargo) {
6437
- if (UInt64.from(c.quantity).gt(UInt64.zero)) {
6438
- const goodMass = getItem(c.item_id).mass;
6439
- mass = mass.adding(goodMass.multiplying(c.quantity));
6440
- }
5669
+ async getByHeight(height) {
5670
+ const game = await this.getGame();
5671
+ return getEpochInfo(game, UInt64.from(height));
6441
5672
  }
6442
- return mass;
6443
- }
6444
- function calculateUnloadTime(ship, cargo) {
6445
- const unloadMass = calculateCargoMass(cargo);
6446
- if (unloadMass.equals(UInt32.zero) ||
6447
- !ship.loaders ||
6448
- ship.loaders.quantity.equals(UInt32.zero)) {
6449
- return UInt32.zero;
5673
+ async getTimeRemaining() {
5674
+ const epochInfo = await this.getCurrent();
5675
+ const now = Date.now();
5676
+ const endTime = epochInfo.end.getTime();
5677
+ return Math.max(0, endTime - now);
6450
5678
  }
6451
- const totalMass = UInt64.from(unloadMass).adding(ship.loaders.mass);
6452
- return calc_loader_flighttime(ship, totalMass).dividing(ship.loaders.quantity);
6453
- }
6454
- function analyzeCargoSale(cargo, prices) {
6455
- let revenue = UInt64.zero;
6456
- let cost = UInt64.zero;
6457
- for (const c of cargo) {
6458
- if (UInt64.from(c.quantity).equals(UInt64.zero))
6459
- continue;
6460
- const goodId = Number(c.item_id);
6461
- const salePrice = prices.get(goodId);
6462
- if (salePrice) {
6463
- revenue = revenue.adding(UInt64.from(salePrice).multiplying(c.quantity));
6464
- }
6465
- cost = cost.adding(c.unit_cost.multiplying(c.quantity));
5679
+ async getProgress() {
5680
+ const epochInfo = await this.getCurrent();
5681
+ const now = Date.now();
5682
+ const startTime = epochInfo.start.getTime();
5683
+ const endTime = epochInfo.end.getTime();
5684
+ const duration = endTime - startTime;
5685
+ const elapsed = now - startTime;
5686
+ if (elapsed <= 0)
5687
+ return 0;
5688
+ if (elapsed >= duration)
5689
+ return 1;
5690
+ return elapsed / duration;
5691
+ }
5692
+ async fitsInCurrentEpoch(durationMs) {
5693
+ const remaining = await this.getTimeRemaining();
5694
+ return durationMs <= remaining;
6466
5695
  }
6467
- return {
6468
- revenue,
6469
- cost,
6470
- profit: Int64.from(revenue).subtracting(cost),
6471
- };
6472
5696
  }
6473
- function buildCargoSaleItems(cargo, prices) {
6474
- const items = [];
6475
- for (const c of cargo) {
6476
- if (UInt64.from(c.quantity).equals(UInt64.zero))
6477
- continue;
6478
- const goodId = Number(c.item_id);
6479
- const salePrice = prices.get(goodId);
6480
- const pricePerUnit = salePrice ? UInt32.from(salePrice) : UInt32.zero;
6481
- const revenue = UInt64.from(pricePerUnit).multiplying(c.quantity);
6482
- const cost = c.unit_cost.multiplying(c.quantity);
6483
- const profit = Int64.from(revenue).subtracting(cost);
6484
- items.push({
6485
- goodId: c.item_id,
6486
- goodName: c.item?.name ?? `Item #${goodId}`,
6487
- quantity: UInt32.from(c.quantity),
6488
- pricePerUnit,
6489
- revenue,
6490
- costPerUnit: c.unit_cost,
6491
- profit,
6492
- });
6493
- }
6494
- return items;
6495
- }
6496
- function createSellAndTradeOption(saleRevenue, saleCost, deal, cargoSale, unloadTime) {
6497
- const saleProfit = Int64.from(saleRevenue).subtracting(saleCost);
6498
- const totalProfit = saleProfit.adding(deal.totalProfit);
6499
- const profitPerSecond = deal.travelTime.gt(UInt32.zero)
6500
- ? Number(totalProfit) / Number(deal.travelTime)
6501
- : Number(totalProfit);
6502
- const unload = unloadTime ?? UInt32.zero;
6503
- const breakdown = deal.travelTimeBreakdown
6504
- ? {
6505
- unloadTime: unload,
6506
- loadTime: deal.travelTimeBreakdown.loadTime,
6507
- rechargeTime: deal.travelTimeBreakdown.rechargeTime,
6508
- flightTime: deal.travelTimeBreakdown.flightTime,
6509
- total: unload
6510
- .adding(deal.travelTimeBreakdown.loadTime)
6511
- .adding(deal.travelTimeBreakdown.rechargeTime)
6512
- .adding(deal.travelTimeBreakdown.flightTime),
6513
- }
6514
- : undefined;
6515
- return {
6516
- id: `sell-trade-${deal.destination.coordinates.x}-${deal.destination.coordinates.y}-${deal.item.id}`,
6517
- type: 'sell-and-trade',
6518
- title: `Trade ${deal.item.item.name}`,
6519
- description: `Sell cargo, buy ${deal.maxQuantity} ${deal.item.item.name}, deliver to (${deal.destination.coordinates.x}, ${deal.destination.coordinates.y})`,
6520
- reason: `${deal.marginPercent.toFixed(0)}% margin, ${deal.profitPerSecond.toFixed(1)}/s profit rate`,
6521
- recommended: false,
6522
- highestProfit: false,
6523
- estimatedProfit: saleProfit,
6524
- saleRevenue,
6525
- purchaseCost: UInt64.from(deal.buyPrice).multiplying(deal.maxQuantity),
6526
- nextTradeProfit: deal.totalProfit,
6527
- profitPerSecond,
6528
- marginPercent: deal.marginPercent,
6529
- destination: deal.destination,
6530
- deal,
6531
- travelTime: breakdown?.total ?? deal.travelTime,
6532
- travelTimeBreakdown: breakdown,
6533
- cargoSale,
6534
- cargoProfitLoss: saleProfit,
6535
- };
6536
- }
6537
- function createTravelToSellOption(currentRevenue, cargoCost, betterSale, cargo, destPrices) {
6538
- const totalQuantity = cargo.reduce((s, c) => s.adding(UInt64.from(c.quantity)), UInt64.zero);
6539
- const currentPrice = totalQuantity.gt(UInt64.zero)
6540
- ? UInt32.from(currentRevenue.dividing(totalQuantity))
6541
- : UInt32.zero;
6542
- const priceIncrease = betterSale.price.gte(currentPrice)
6543
- ? betterSale.price.subtracting(currentPrice)
6544
- : UInt32.zero;
6545
- const hasDealAfter = !!betterSale.bestDealAfterSale;
6546
- const cargoSale = destPrices ? buildCargoSaleItems(cargo, destPrices) : undefined;
6547
- const cargoProfitLoss = cargoSale?.reduce((sum, item) => sum.adding(item.profit), Int64.zero);
6548
- const saleProfit = Int64.from(betterSale.revenue).subtracting(cargoCost);
6549
- const profitPerSecond = betterSale.travelTime.gt(UInt32.zero)
6550
- ? Number(saleProfit) / Number(betterSale.travelTime)
6551
- : Number(saleProfit);
6552
- return {
6553
- id: `travel-sell-${betterSale.location.coordinates.x}-${betterSale.location.coordinates.y}`,
6554
- type: 'travel-to-sell',
6555
- title: 'Move to Sell Nearby',
6556
- description: `Keep cargo, travel to better market${hasDealAfter ? ', then trade' : ''}`,
6557
- reason: `+${Number(priceIncrease).toLocaleString()}/unit better price${hasDealAfter ? ', good deals available there' : ''}`,
6558
- recommended: false,
6559
- highestProfit: false,
6560
- estimatedProfit: betterSale.improvement,
6561
- saleRevenue: betterSale.revenue,
6562
- profitPerSecond,
6563
- saleLocation: betterSale.location,
6564
- salePrice: betterSale.price,
6565
- currentPrice,
6566
- destination: betterSale.location,
6567
- deal: betterSale.bestDealAfterSale,
6568
- travelTime: betterSale.travelTime,
6569
- travelTimeBreakdown: betterSale.travelTimeBreakdown,
6570
- cargoSale,
6571
- cargoProfitLoss,
6572
- };
6573
- }
6574
- function createSellAndRepositionOption(saleRevenue, saleCost, reposition, cargoSale) {
6575
- const saleProfit = Int64.from(saleRevenue).subtracting(saleCost);
6576
- const deal = reposition.bestDeal;
6577
- return {
6578
- id: `sell-reposition-${reposition.location.coordinates.x}-${reposition.location.coordinates.y}`,
6579
- type: 'sell-and-reposition',
6580
- title: 'Sell & Move',
6581
- description: `Sell cargo here, travel empty to buy ${deal.item.item.name}`,
6582
- reason: `No good trades here — ${deal.marginPercent.toFixed(0)}% margin trade available at destination`,
6583
- recommended: false,
6584
- highestProfit: false,
6585
- estimatedProfit: saleProfit,
6586
- saleRevenue,
6587
- nextTradeProfit: deal.totalProfit,
6588
- profitPerSecond: deal.profitPerSecond,
6589
- marginPercent: deal.marginPercent,
6590
- destination: reposition.location,
6591
- deal: reposition.bestDeal,
6592
- travelTime: reposition.travelTime,
6593
- travelTimeBreakdown: reposition.travelTimeBreakdown,
6594
- cargoSale,
6595
- cargoProfitLoss: saleProfit,
6596
- };
6597
- }
6598
- function createOrbitOption() {
6599
- return {
6600
- id: 'orbit',
6601
- type: 'orbit',
6602
- title: 'Enter Orbit',
6603
- description: 'Arrive at this location, keep cargo',
6604
- reason: 'Keep cargo, decide later',
6605
- recommended: false,
6606
- highestProfit: false,
6607
- estimatedProfit: UInt64.zero,
6608
- };
6609
- }
6610
- function createSellAndStayOption(saleRevenue, saleCost, cargoSale, unloadTime) {
6611
- const saleProfit = Int64.from(saleRevenue).subtracting(saleCost);
6612
- return {
6613
- id: 'sell-stay',
6614
- type: 'sell-and-stay',
6615
- title: 'Sell & Enter Orbit',
6616
- description: `Sell cargo, remain docked at this location`,
6617
- reason: 'Collect profits now, decide next move later',
6618
- recommended: false,
6619
- highestProfit: false,
6620
- estimatedProfit: saleProfit,
6621
- saleRevenue,
6622
- cargoSale,
6623
- cargoProfitLoss: saleProfit,
6624
- travelTimeBreakdown: unloadTime !== undefined
6625
- ? {
6626
- unloadTime,
6627
- loadTime: UInt32.zero,
6628
- rechargeTime: UInt32.zero,
6629
- flightTime: UInt32.zero,
6630
- total: unloadTime,
6631
- }
6632
- : undefined,
6633
- };
6634
- }
6635
- function createExploreOption(destination, travelTime, discountedGood, travelTimeBreakdown, potentialDeals) {
6636
- let description = 'Travel to look for trading opportunities';
6637
- let reason = 'No profitable trades found nearby';
6638
- if (potentialDeals && potentialDeals.length > 0) {
6639
- const bestDeal = potentialDeals[0];
6640
- description = `${potentialDeals.length} deal${potentialDeals.length > 1 ? 's' : ''} available — best: ${bestDeal.goodName}`;
6641
- reason = `${bestDeal.marginPercent.toFixed(0)}% margin, ${bestDeal.profitPerSecond.toFixed(1)}/s`;
6642
- }
6643
- else if (discountedGood) {
6644
- const { name, discountPercent } = discountedGood;
6645
- if (discountPercent >= 60) {
6646
- description = `${name} at ${discountPercent}% off`;
6647
- reason = 'Legendary find — extremely rare opportunity';
6648
- }
6649
- else if (discountPercent >= 40) {
6650
- description = `${name} at ${discountPercent}% off`;
6651
- reason = 'Epic deal — exceptional prices';
6652
- }
6653
- else if (discountPercent >= 23) {
6654
- description = `${name} at ${discountPercent}% off`;
6655
- reason = 'Rare discount — well below market';
6656
- }
6657
- else if (discountPercent >= 8) {
6658
- description = `${name} at ${discountPercent}% off`;
6659
- reason = `Good prices on ${name}`;
6660
- }
6661
- else {
6662
- description = `${name} slightly discounted`;
6663
- reason = 'Minor savings available';
6664
- }
6665
- }
6666
- return {
6667
- id: `explore-${destination.coordinates.x}-${destination.coordinates.y}`,
6668
- type: 'explore',
6669
- title: 'Move',
6670
- description,
6671
- reason,
6672
- recommended: false,
6673
- highestProfit: false,
6674
- estimatedProfit: UInt64.zero,
6675
- destination,
6676
- travelTime,
6677
- travelTimeBreakdown,
6678
- discountedGood,
6679
- potentialDeals,
6680
- };
6681
- }
6682
- async function analyzeCollectOptions(ship, arrivedAt, callbacks, options = {}) {
6683
- const { playerBalance = Infinity, minSaleImprovement = 100 } = options;
6684
- const cargo = ship.sellableCargo;
6685
- const hasCargo = cargo.length > 0;
6686
- const originPrices = await callbacks.getMarketPrices(arrivedAt);
6687
- const priceMap = new Map(originPrices.map((p) => [Number(p.id), p.price]));
6688
- const { revenue: cargoValueHere, cost: cargoCost } = analyzeCargoSale(cargo, priceMap);
6689
- const cargoSaleHere = buildCargoSaleItems(cargo, priceMap);
6690
- const collectOptions = [];
6691
- const maxDistance = options.maxDistance ?? Number(ship.maxDistance);
6692
- const nearbyLocations = await callbacks.getNearbyLocations(arrivedAt, maxDistance);
6693
- const dealsAtOrigin = await findDealsForShip(ship, arrivedAt, callbacks.getNearbyLocations, callbacks.getMarketPrices, {
6694
- maxDeals: 5,
6695
- maxDistance,
6696
- playerBalance: playerBalance + Number(cargoValueHere),
6697
- availableSpace: Number(ship.maxCapacity),
6698
- });
6699
- if (hasCargo && dealsAtOrigin.length > 0) {
6700
- const cargoGoodIds = new Set(cargo.map((c) => Number(c.item_id)));
6701
- for (const deal of dealsAtOrigin.slice(0, 3)) {
6702
- const dealGoodId = Number(deal.item.id);
6703
- if (cargoGoodIds.has(dealGoodId)) {
6704
- continue;
6705
- }
6706
- const unloadTime = calculateUnloadTime(ship, cargo);
6707
- const option = createSellAndTradeOption(cargoValueHere, cargoCost, deal, cargoSaleHere, unloadTime);
6708
- collectOptions.push(option);
6709
- }
6710
- }
6711
- if (hasCargo) {
6712
- const locationsToCheck = nearbyLocations.slice(0, 10);
6713
- const allDestPrices = await Promise.all(locationsToCheck.map((loc) => callbacks.getMarketPrices(loc.coordinates)));
6714
- const candidateLocations = [];
6715
- for (let i = 0; i < locationsToCheck.length; i++) {
6716
- const destLocation = locationsToCheck[i];
6717
- const destPrices = allDestPrices[i];
6718
- const destPriceMap = new Map(destPrices.map((p) => [Number(p.id), p.price]));
6719
- const { revenue: destRevenue } = analyzeCargoSale(cargo, destPriceMap);
6720
- const improvement = Int64.from(destRevenue).subtracting(cargoValueHere);
6721
- if (improvement.gt(Int64.from(minSaleImprovement))) {
6722
- candidateLocations.push({ destLocation, destPriceMap, destRevenue, improvement });
6723
- }
6724
- }
6725
- const betterSaleResults = await Promise.all(candidateLocations.map(async ({ destLocation, destPriceMap, destRevenue, improvement }) => {
6726
- const distance = distanceBetweenCoordinates(arrivedAt, destLocation.coordinates);
6727
- const needsRecharge = !ship.hasEnergyFor(distance);
6728
- const travelEstimate = estimateTravelTime(ship, ship.totalMass, distance, {
6729
- needsRecharge,
6730
- });
6731
- const dealsAfterSale = await findDealsForShip(ship, destLocation.coordinates, callbacks.getNearbyLocations, callbacks.getMarketPrices, {
6732
- maxDeals: 1,
6733
- maxDistance,
6734
- playerBalance: destRevenue,
6735
- availableSpace: Number(ship.maxCapacity),
6736
- });
6737
- return {
6738
- better: {
6739
- location: destLocation,
6740
- price: UInt32.from(destRevenue.dividing(cargo.reduce((s, c) => s.adding(c.quantity), UInt64.zero))),
6741
- revenue: destRevenue,
6742
- improvement,
6743
- bestDealAfterSale: dealsAfterSale[0],
6744
- distance,
6745
- travelTime: travelEstimate.total,
6746
- travelTimeBreakdown: travelEstimate,
6747
- },
6748
- destPriceMap,
6749
- };
6750
- }));
6751
- const betterSaleLocations = betterSaleResults.sort((a, b) => Number(b.better.improvement) - Number(a.better.improvement));
6752
- for (const { better, destPriceMap } of betterSaleLocations.slice(0, 2)) {
6753
- const option = createTravelToSellOption(cargoValueHere, cargoCost, better, cargo, destPriceMap);
6754
- collectOptions.push(option);
6755
- }
6756
- }
6757
- if (hasCargo && dealsAtOrigin.length === 0) {
6758
- const locationsToCheck = nearbyLocations.slice(0, 10);
6759
- const allDealsAtDest = await Promise.all(locationsToCheck.map((destLocation) => findDealsForShip(ship, destLocation.coordinates, callbacks.getNearbyLocations, callbacks.getMarketPrices, {
6760
- maxDeals: 1,
6761
- maxDistance,
6762
- playerBalance: UInt64.from(playerBalance).adding(cargoValueHere),
6763
- availableSpace: Number(ship.maxCapacity),
6764
- })));
6765
- const repositionLocations = [];
6766
- for (let i = 0; i < locationsToCheck.length; i++) {
6767
- const destLocation = locationsToCheck[i];
6768
- const dealsAtDest = allDealsAtDest[i];
6769
- if (dealsAtDest.length > 0) {
6770
- const distance = distanceBetweenCoordinates(arrivedAt, destLocation.coordinates);
6771
- const needsRecharge = !ship.hasEnergyFor(distance);
6772
- const travelEstimate = estimateTravelTime(ship, ship.totalMass, distance, {
6773
- needsRecharge,
6774
- unloadMass: calculateCargoMass(cargo),
6775
- });
6776
- repositionLocations.push({
6777
- location: destLocation,
6778
- bestDeal: dealsAtDest[0],
6779
- distance,
6780
- travelTime: travelEstimate.total,
6781
- travelTimeBreakdown: travelEstimate,
6782
- });
6783
- }
6784
- }
6785
- repositionLocations.sort((a, b) => b.bestDeal.profitPerSecond - a.bestDeal.profitPerSecond);
6786
- for (const reposition of repositionLocations.slice(0, 2)) {
6787
- const option = createSellAndRepositionOption(cargoValueHere, cargoCost, reposition, cargoSaleHere);
6788
- collectOptions.push(option);
6789
- }
6790
- }
6791
- if (hasCargo) {
6792
- const unloadTime = calculateUnloadTime(ship, cargo);
6793
- const sellAndStay = createSellAndStayOption(cargoValueHere, cargoCost, cargoSaleHere, unloadTime);
6794
- collectOptions.push(sellAndStay);
6795
- }
6796
- if (!hasCargo && dealsAtOrigin.length > 0) {
6797
- for (const deal of dealsAtOrigin.slice(0, 3)) {
6798
- const option = {
6799
- id: `trade-${deal.destination.coordinates.x}-${deal.destination.coordinates.y}-${deal.item.id}`,
6800
- type: 'sell-and-trade',
6801
- title: `Trade ${deal.item.item.name}`,
6802
- description: `Buy ${deal.maxQuantity} ${deal.item.item.name}, deliver to (${deal.destination.coordinates.x}, ${deal.destination.coordinates.y})`,
6803
- reason: `${deal.marginPercent.toFixed(0)}% margin, ${deal.profitPerSecond.toFixed(1)}/s profit rate`,
6804
- recommended: false,
6805
- highestProfit: false,
6806
- estimatedProfit: deal.totalProfit,
6807
- purchaseCost: UInt64.from(deal.buyPrice).multiplying(deal.maxQuantity),
6808
- nextTradeProfit: deal.totalProfit,
6809
- profitPerSecond: deal.profitPerSecond,
6810
- marginPercent: deal.marginPercent,
6811
- destination: deal.destination,
6812
- deal,
6813
- travelTime: deal.travelTime,
6814
- travelTimeBreakdown: {
6815
- unloadTime: UInt32.zero,
6816
- loadTime: deal.travelTimeBreakdown.loadTime,
6817
- rechargeTime: deal.travelTimeBreakdown.rechargeTime,
6818
- flightTime: deal.travelTimeBreakdown.flightTime,
6819
- total: deal.travelTimeBreakdown.total,
6820
- },
6821
- };
6822
- collectOptions.push(option);
6823
- }
6824
- }
6825
- if (collectOptions.length === 0) {
6826
- const gameSeed = callbacks.getGameSeed?.();
6827
- const state = callbacks.getState?.();
6828
- const exploreCandidates = [];
6829
- for (const dest of nearbyLocations.slice(0, 10)) {
6830
- const distance = distanceBetweenCoordinates(arrivedAt, dest.coordinates);
6831
- const needsRecharge = !ship.hasEnergyFor(distance);
6832
- const unloadMass = hasCargo ? calculateCargoMass(cargo) : UInt32.zero;
6833
- const travelEstimate = estimateTravelTime(ship, ship.totalMass, distance, {
6834
- needsRecharge,
6835
- unloadMass,
6836
- });
6837
- let discountedGood;
6838
- let bestDiscount = 0;
6839
- if (gameSeed && state) {
6840
- const allGoods = getItems();
6841
- for (const good of allGoods) {
6842
- const rarity = getRarity(gameSeed, state.seed, dest.coordinates, good.id);
6843
- if (rarity.minMultiplier < 1.0) {
6844
- const discountPercent = Math.round((1 - rarity.minMultiplier) * 100);
6845
- if (discountPercent > bestDiscount) {
6846
- bestDiscount = discountPercent;
6847
- const rarityName = rarity.rarity === Rarities.legendary
6848
- ? 'Legendary'
6849
- : rarity.rarity === Rarities.epic
6850
- ? 'Epic'
6851
- : rarity.rarity === Rarities.rare
6852
- ? 'Rare'
6853
- : rarity.rarity === Rarities.uncommon
6854
- ? 'Uncommon'
6855
- : 'Common';
6856
- discountedGood = {
6857
- goodId: Number(good.id),
6858
- name: good.name,
6859
- rarity: rarityName,
6860
- discountPercent,
6861
- };
6862
- }
6863
- }
6864
- }
6865
- }
6866
- const destDeals = await findDealsForShip(ship, dest.coordinates, callbacks.getNearbyLocations, callbacks.getMarketPrices, { maxDeals: 2 });
6867
- const potentialDeals = destDeals.map((d) => ({
6868
- goodId: Number(d.item.id),
6869
- goodName: d.item.item.name,
6870
- destinationCoords: d.destination.coordinates,
6871
- marginPercent: d.marginPercent,
6872
- profitPerSecond: d.profitPerSecond,
6873
- }));
6874
- let score = 0;
6875
- if (potentialDeals.length > 0) {
6876
- score = potentialDeals[0].profitPerSecond;
6877
- }
6878
- else if (bestDiscount > 0) {
6879
- score = bestDiscount * 0.01;
6880
- }
6881
- exploreCandidates.push({
6882
- dest,
6883
- travelTime: travelEstimate.total,
6884
- travelTimeBreakdown: travelEstimate,
6885
- discountedGood,
6886
- bestDiscount,
6887
- potentialDeals: potentialDeals.length > 0 ? potentialDeals : undefined,
6888
- score,
6889
- });
6890
- }
6891
- exploreCandidates.sort((a, b) => b.score - a.score);
6892
- for (const candidate of exploreCandidates.slice(0, 3)) {
6893
- const option = createExploreOption(candidate.dest, candidate.travelTime, candidate.discountedGood, candidate.travelTimeBreakdown, candidate.potentialDeals);
6894
- collectOptions.push(option);
6895
- }
6896
- }
6897
- const orbitOption = createOrbitOption();
6898
- collectOptions.push(orbitOption);
6899
- const MIN_MARGIN_THRESHOLD = 15;
6900
- const MIN_PROFIT_PER_SECOND_THRESHOLD = 0.5;
6901
- collectOptions.sort((a, b) => (b.profitPerSecond ?? 0) - (a.profitPerSecond ?? 0));
6902
- if (collectOptions.length > 0) {
6903
- const bestByProfitPerSecond = collectOptions[0];
6904
- const meetsQualityThreshold = (bestByProfitPerSecond.marginPercent ?? 0) > MIN_MARGIN_THRESHOLD ||
6905
- (bestByProfitPerSecond.profitPerSecond ?? 0) > MIN_PROFIT_PER_SECOND_THRESHOLD;
6906
- if (meetsQualityThreshold) {
6907
- bestByProfitPerSecond.recommended = true;
6908
- }
6909
- const bestByProfit = collectOptions.reduce((best, opt) => opt.estimatedProfit > best.estimatedProfit ? opt : best);
6910
- if (bestByProfit.id !== bestByProfitPerSecond.id || !meetsQualityThreshold) {
6911
- bestByProfit.highestProfit = true;
6912
- }
6913
- }
6914
- return {
6915
- arrivedAt,
6916
- ship,
6917
- cargo,
6918
- cargoValueHere,
6919
- options: collectOptions,
6920
- hasProfitableOptions: collectOptions.some((o) => o.estimatedProfit.gt(UInt64.zero)),
6921
- };
6922
- }
6923
-
6924
- class TradesManager extends BaseManager {
6925
- constructor() {
6926
- super(...arguments);
6927
- this.priceCache = new Map();
6928
- }
6929
- makePriceCacheKey(location) {
6930
- return `${location.x},${location.y}`;
6931
- }
6932
- async createCallbacks() {
6933
- const game = await this.getGame();
6934
- const serverState = await this.getState();
6935
- const currentEpoch = getCurrentEpoch(game);
6936
- if (!this.priceCacheEpoch || !this.priceCacheEpoch.equals(currentEpoch)) {
6937
- this.priceCache.clear();
6938
- this.priceCacheEpoch = currentEpoch;
6939
- }
6940
- const getNearbyLocations = async (origin, maxDistance) => {
6941
- const nearby = findNearbyPlanets(game.config.seed, origin, maxDistance);
6942
- return nearby.map((d) => toLocation(d.destination));
6943
- };
6944
- const getMarketPrices = async (location) => {
6945
- const cacheKey = this.makePriceCacheKey(location);
6946
- const cached = this.priceCache.get(cacheKey);
6947
- if (cached) {
6948
- return cached;
6949
- }
6950
- const locationWithSupply = await this.context.locations.getLocationComplete(location);
6951
- const prices = locationWithSupply.marketPrices || [];
6952
- const result = prices.map((price) => {
6953
- const actualSupply = locationWithSupply.getSupply(price.id);
6954
- if (actualSupply !== undefined) {
6955
- return ItemPrice.from({
6956
- id: price.id,
6957
- item: price.item,
6958
- price: price.price,
6959
- supply: actualSupply,
6960
- });
6961
- }
6962
- return price;
6963
- });
6964
- this.priceCache.set(cacheKey, result);
6965
- return result;
6966
- };
6967
- const getGameSeed = () => game.config.seed;
6968
- const getState = () => serverState;
6969
- return { getNearbyLocations, getMarketPrices, getGameSeed, getState };
6970
- }
6971
- clearPriceCache() {
6972
- this.priceCache.clear();
6973
- this.priceCacheEpoch = undefined;
6974
- }
6975
- async findDeals(ship, originLocation, options = {}) {
6976
- const origin = originLocation || Coordinates.from(ship.coordinates);
6977
- const callbacks = await this.createCallbacks();
6978
- const deals = await findDealsForShip(ship, origin, callbacks.getNearbyLocations, callbacks.getMarketPrices, options);
6979
- return deals;
6980
- }
6981
- async findBestDeal(ship, originLocation, options = {}) {
6982
- const deals = await this.findDeals(ship, originLocation, { ...options, maxDeals: 1 });
6983
- return deals[0];
6984
- }
6985
- async getCollectOptions(ship, arrivedAt, options = {}) {
6986
- const location = arrivedAt || Coordinates.from(ship.coordinates);
6987
- const callbacks = await this.createCallbacks();
6988
- return analyzeCollectOptions(ship, location, callbacks, options);
6989
- }
6990
- }
6991
-
6992
- class EpochsManager extends BaseManager {
6993
- async getCurrentHeight() {
6994
- const game = await this.getGame();
6995
- return getCurrentEpoch(game);
6996
- }
6997
- async getCurrent() {
6998
- const game = await this.getGame();
6999
- const epoch = await this.getCurrentHeight();
7000
- return getEpochInfo(game, epoch);
7001
- }
7002
- async getByHeight(height) {
7003
- const game = await this.getGame();
7004
- return getEpochInfo(game, UInt64.from(height));
7005
- }
7006
- async getTimeRemaining() {
7007
- const epochInfo = await this.getCurrent();
7008
- const now = Date.now();
7009
- const endTime = epochInfo.end.getTime();
7010
- return Math.max(0, endTime - now);
7011
- }
7012
- async getProgress() {
7013
- const epochInfo = await this.getCurrent();
7014
- const now = Date.now();
7015
- const startTime = epochInfo.start.getTime();
7016
- const endTime = epochInfo.end.getTime();
7017
- const duration = endTime - startTime;
7018
- const elapsed = now - startTime;
7019
- if (elapsed <= 0)
7020
- return 0;
7021
- if (elapsed >= duration)
7022
- return 1;
7023
- return elapsed / duration;
7024
- }
7025
- async fitsInCurrentEpoch(durationMs) {
7026
- const remaining = await this.getTimeRemaining();
7027
- return durationMs <= remaining;
7028
- }
7029
- }
7030
-
7031
- class ActionsManager extends BaseManager {
7032
- travel(shipId, destination, recharge = true) {
7033
- const x = Int64.from(destination.x);
7034
- const y = Int64.from(destination.y);
7035
- return this.server.action('travel', {
7036
- entity_type: EntityType.SHIP,
7037
- id: UInt64.from(shipId),
7038
- x,
7039
- y,
7040
- recharge,
5697
+
5698
+ class ActionsManager extends BaseManager {
5699
+ travel(shipId, destination, recharge = true) {
5700
+ const x = Int64.from(destination.x);
5701
+ const y = Int64.from(destination.y);
5702
+ return this.server.action('travel', {
5703
+ entity_type: EntityType.SHIP,
5704
+ id: UInt64.from(shipId),
5705
+ x,
5706
+ y,
5707
+ recharge,
7041
5708
  });
7042
5709
  }
7043
5710
  grouptravel(entities, destination, recharge = true) {
@@ -7083,54 +5750,6 @@ class ActionsManager extends BaseManager {
7083
5750
  quantity: UInt32.from(quantity),
7084
5751
  });
7085
5752
  }
7086
- buyItems(entityId, goodId, quantity, entityType = EntityType.SHIP) {
7087
- return this.server.action('buyitems', {
7088
- entity_type: entityType,
7089
- id: UInt64.from(entityId),
7090
- item_id: UInt16.from(goodId),
7091
- quantity: UInt32.from(quantity),
7092
- });
7093
- }
7094
- sellItems(entityId, goodId, quantity, entityType = EntityType.SHIP) {
7095
- return this.server.action('sellitems', {
7096
- entity_type: entityType,
7097
- id: UInt64.from(entityId),
7098
- item_id: UInt16.from(goodId),
7099
- quantity: UInt32.from(quantity),
7100
- });
7101
- }
7102
- buyShip(account, name) {
7103
- return this.server.action('buyship', {
7104
- account: Name.from(account),
7105
- name,
7106
- });
7107
- }
7108
- buyWarehouse(account, shipId, name) {
7109
- return this.server.action('buywarehouse', {
7110
- account: Name.from(account),
7111
- ship_id: UInt64.from(shipId),
7112
- name,
7113
- });
7114
- }
7115
- buyContainer(account, shipId, name) {
7116
- return this.server.action('buycontainer', {
7117
- account: Name.from(account),
7118
- ship_id: UInt64.from(shipId),
7119
- name,
7120
- });
7121
- }
7122
- takeLoan(account, amount) {
7123
- return this.server.action('takeloan', {
7124
- account: Name.from(account),
7125
- amount: UInt64.from(amount),
7126
- });
7127
- }
7128
- payLoan(account, amount) {
7129
- return this.server.action('payloan', {
7130
- account: Name.from(account),
7131
- amount: UInt64.from(amount),
7132
- });
7133
- }
7134
5753
  foundCompany(account, name) {
7135
5754
  return this.platform.action('foundcompany', {
7136
5755
  account: Name.from(account),
@@ -7157,25 +5776,32 @@ class ActionsManager extends BaseManager {
7157
5776
  y,
7158
5777
  });
7159
5778
  }
5779
+ craft(entityType, entityId, recipeId, quantity, inputs) {
5780
+ const cargoInputs = inputs.map((i) => Types.cargo_item.from({
5781
+ item_id: UInt16.from(i.itemId),
5782
+ quantity: UInt32.from(i.quantity),
5783
+ seed: i.seed !== undefined ? UInt64.from(i.seed) : null,
5784
+ }));
5785
+ return this.server.action('craft', {
5786
+ entity_type: entityType,
5787
+ id: UInt64.from(entityId),
5788
+ recipe_id: UInt16.from(recipeId),
5789
+ quantity: UInt32.from(quantity),
5790
+ inputs: cargoInputs,
5791
+ });
5792
+ }
5793
+ deploy(entityType, entityId, packedItemId, seed, entityName) {
5794
+ return this.server.action('deploy', {
5795
+ entity_type: entityType,
5796
+ id: UInt64.from(entityId),
5797
+ packed_item_id: UInt16.from(packedItemId),
5798
+ seed: UInt64.from(seed),
5799
+ entity_name: entityName,
5800
+ });
5801
+ }
7160
5802
  joinGame(account, companyName) {
7161
5803
  return [this.foundCompany(account, companyName), this.join(account)];
7162
5804
  }
7163
- sellAllCargo(ship, cargo) {
7164
- let shipCargo;
7165
- if (ship instanceof Ship) {
7166
- shipCargo = cargo || ship.inventory;
7167
- }
7168
- else {
7169
- if (!cargo) {
7170
- throw new Error('cargo parameter required when ship is a UInt64Type');
7171
- }
7172
- shipCargo = cargo;
7173
- }
7174
- const shipId = ship instanceof Ship ? ship.id : UInt64.from(ship);
7175
- return shipCargo
7176
- .filter((c) => c.hasCargo)
7177
- .map((c) => this.sellItems(shipId, c.item_id, c.quantity, EntityType.SHIP));
7178
- }
7179
5805
  }
7180
5806
 
7181
5807
  class GameContext {
@@ -7202,12 +5828,6 @@ class GameContext {
7202
5828
  }
7203
5829
  return this._locations;
7204
5830
  }
7205
- get trades() {
7206
- if (!this._trades) {
7207
- this._trades = new TradesManager(this);
7208
- }
7209
- return this._trades;
7210
- }
7211
5831
  get epochs() {
7212
5832
  if (!this._epochs) {
7213
5833
  this._epochs = new EpochsManager(this);
@@ -7304,9 +5924,6 @@ class Shipload {
7304
5924
  get locations() {
7305
5925
  return this._context.locations;
7306
5926
  }
7307
- get trades() {
7308
- return this._context.trades;
7309
- }
7310
5927
  get epochs() {
7311
5928
  return this._context.epochs;
7312
5929
  }
@@ -7383,137 +6000,6 @@ function makeContainer(state) {
7383
6000
  return new Container(entityInfo);
7384
6001
  }
7385
6002
 
7386
- const DEPTH_THRESHOLD_COMMON = 0;
7387
- const DEPTH_THRESHOLD_UNCOMMON = 2000;
7388
- const DEPTH_THRESHOLD_RARE = 10000;
7389
- const DEPTH_THRESHOLD_EPIC = 30000;
7390
- const DEPTH_THRESHOLD_LEGENDARY = 55000;
7391
- const LOCATION_MIN_DEPTH = 500;
7392
- const LOCATION_MAX_DEPTH = 65535;
7393
- const YIELD_THRESHOLD = Math.floor(0.003 * 0xffffffff);
7394
- const PLANET_SUBTYPE_GAS_GIANT = 0;
7395
- const PLANET_SUBTYPE_ROCKY = 1;
7396
- const PLANET_SUBTYPE_TERRESTRIAL = 2;
7397
- const PLANET_SUBTYPE_ICY = 3;
7398
- const PLANET_SUBTYPE_OCEAN = 4;
7399
- const PLANET_SUBTYPE_INDUSTRIAL = 5;
7400
- const RESOURCE_CATALOG = [
7401
- { id: 26, rarity: 'common' },
7402
- { id: 1, rarity: 'common' },
7403
- { id: 14, rarity: 'common' },
7404
- { id: 6, rarity: 'common' },
7405
- { id: 29, rarity: 'uncommon' },
7406
- { id: 2, rarity: 'uncommon' },
7407
- { id: 1000, rarity: 'uncommon' },
7408
- { id: 1003, rarity: 'uncommon' },
7409
- { id: 22, rarity: 'rare' },
7410
- { id: 18, rarity: 'rare' },
7411
- { id: 1001, rarity: 'rare' },
7412
- { id: 1002, rarity: 'rare' },
7413
- { id: 74, rarity: 'epic' },
7414
- { id: 54, rarity: 'epic' },
7415
- ];
7416
- function getDepthThreshold(rarity) {
7417
- switch (rarity) {
7418
- case 'common':
7419
- return DEPTH_THRESHOLD_COMMON;
7420
- case 'uncommon':
7421
- return DEPTH_THRESHOLD_UNCOMMON;
7422
- case 'rare':
7423
- return DEPTH_THRESHOLD_RARE;
7424
- case 'epic':
7425
- return DEPTH_THRESHOLD_EPIC;
7426
- case 'legendary':
7427
- return DEPTH_THRESHOLD_LEGENDARY;
7428
- }
7429
- }
7430
- function getResourceRarity(itemId) {
7431
- const entry = RESOURCE_CATALOG.find((r) => r.id === itemId);
7432
- return entry ? entry.rarity : 'legendary';
7433
- }
7434
- function getResourceWeight(itemId, stratum) {
7435
- const rarity = getResourceRarity(itemId);
7436
- const threshold = getDepthThreshold(rarity);
7437
- if (stratum < threshold)
7438
- return 0;
7439
- const depthAbove = stratum - threshold;
7440
- switch (rarity) {
7441
- case 'common':
7442
- if (stratum < 2000)
7443
- return 100;
7444
- if (stratum < 10000)
7445
- return 80;
7446
- if (stratum < 30000)
7447
- return 50;
7448
- return 30;
7449
- case 'uncommon':
7450
- if (depthAbove < 3000)
7451
- return 40;
7452
- if (depthAbove < 8000)
7453
- return 60;
7454
- return 50;
7455
- case 'rare':
7456
- if (depthAbove < 5000)
7457
- return 20;
7458
- if (depthAbove < 15000)
7459
- return 35;
7460
- return 40;
7461
- case 'epic':
7462
- if (depthAbove < 10000)
7463
- return 10;
7464
- if (depthAbove < 25000)
7465
- return 20;
7466
- return 30;
7467
- case 'legendary':
7468
- return 10;
7469
- }
7470
- }
7471
- const ASTEROID_RESOURCES = [26, 29, 22, 74, 14, 1000, 1001];
7472
- const NEBULA_RESOURCES = [1, 2, 18, 54];
7473
- const GAS_GIANT_RESOURCES = [1, 2, 18, 54];
7474
- const ROCKY_RESOURCES = [26, 29, 22, 74, 6, 1003, 1002];
7475
- const TERRESTRIAL_RESOURCES = [6, 1003, 1002, 1001];
7476
- const ICY_RESOURCES = [6, 14, 1000, 1001, 18];
7477
- const OCEAN_RESOURCES = [1, 2, 1003, 1002];
7478
- const INDUSTRIAL_RESOURCES = [26, 29, 22, 74, 14, 1000, 54];
7479
- function getLocationCandidates(locationType, subtype) {
7480
- if (locationType === 2)
7481
- return ASTEROID_RESOURCES;
7482
- if (locationType === 3)
7483
- return NEBULA_RESOURCES;
7484
- if (locationType === 1) {
7485
- switch (subtype) {
7486
- case PLANET_SUBTYPE_GAS_GIANT:
7487
- return GAS_GIANT_RESOURCES;
7488
- case PLANET_SUBTYPE_ROCKY:
7489
- return ROCKY_RESOURCES;
7490
- case PLANET_SUBTYPE_TERRESTRIAL:
7491
- return TERRESTRIAL_RESOURCES;
7492
- case PLANET_SUBTYPE_ICY:
7493
- return ICY_RESOURCES;
7494
- case PLANET_SUBTYPE_OCEAN:
7495
- return OCEAN_RESOURCES;
7496
- case PLANET_SUBTYPE_INDUSTRIAL:
7497
- return INDUSTRIAL_RESOURCES;
7498
- }
7499
- }
7500
- return [];
7501
- }
7502
- function getEligibleResources(locationType, subtype, stratum) {
7503
- const candidates = getLocationCandidates(locationType, subtype);
7504
- return candidates.filter((itemId) => {
7505
- const rarity = getResourceRarity(itemId);
7506
- const threshold = getDepthThreshold(rarity);
7507
- return stratum >= threshold;
7508
- });
7509
- }
7510
- function depthScaleFactor(stratum) {
7511
- if (stratum <= 1)
7512
- return 1.0;
7513
- const logScale = Math.log(stratum) / Math.log(65535);
7514
- return 1.0 + logScale * 2.0;
7515
- }
7516
-
7517
6003
  function deriveStratum(epochSeed, coords, stratum, locationType, subtype, _maxDepth) {
7518
6004
  const seed = Checksum256.from(epochSeed);
7519
6005
  const c = Coordinates.from(coords);
@@ -7562,19 +6048,21 @@ function deriveStratum(epochSeed, coords, stratum, locationType, subtype, _maxDe
7562
6048
  const baseRichness = Math.floor(normalized * normalized * 999) + 1;
7563
6049
  let depthBonus = 0;
7564
6050
  if (stratum > 1) {
7565
- depthBonus = 50 * Math.log(stratum) / Math.log(65535);
6051
+ depthBonus = (50 * Math.log(stratum)) / Math.log(65535);
7566
6052
  }
7567
6053
  const richness = Math.min(Math.floor(baseRichness + depthBonus), 1000);
7568
6054
  return { itemId: selectedItemId, seed: seedBigInt, richness, reserve };
7569
6055
  }
7570
6056
  function deriveResourceStats(seed) {
7571
- const seedStr = seed.toString();
7572
- const encoder = new TextEncoder();
7573
- const data = encoder.encode(seedStr);
7574
- const hashResult = Checksum256.hash(Bytes.from(data));
6057
+ const seedBytes = new Uint8Array(8);
6058
+ for (let i = 7; i >= 0; i--) {
6059
+ seedBytes[i] = Number(seed & 0xffn);
6060
+ seed >>= 8n;
6061
+ }
6062
+ const hashResult = Checksum256.hash(Bytes.from(seedBytes));
7575
6063
  const hashBytes = hashResult.array;
7576
6064
  const extractU16 = (offset) => (hashBytes[offset] << 8) | hashBytes[offset + 1];
7577
- const weibullStat = (raw) => {
6065
+ const weibull = (raw) => {
7578
6066
  const u = raw / 65536;
7579
6067
  let x = 0.27 * Math.sqrt(-Math.log(1 - u));
7580
6068
  if (x > 1)
@@ -7582,22 +6070,357 @@ function deriveResourceStats(seed) {
7582
6070
  return Math.floor(x * 999) + 1;
7583
6071
  };
7584
6072
  return {
7585
- purity: weibullStat(extractU16(0)),
7586
- density: weibullStat(extractU16(2)),
7587
- reactivity: weibullStat(extractU16(4)),
7588
- resonance: weibullStat(extractU16(6)),
6073
+ stat1: weibull(extractU16(0)),
6074
+ stat2: weibull(extractU16(2)),
6075
+ stat3: weibull(extractU16(4)),
7589
6076
  };
7590
6077
  }
7591
6078
 
7592
- function deriveLocationSize(loc) {
7593
- if (loc.type.toNumber() === LocationType.EMPTY)
6079
+ const METAL_STATS = [
6080
+ {
6081
+ key: 'strength',
6082
+ label: 'Strength',
6083
+ abbreviation: 'STR',
6084
+ purpose: 'Raw structural/mechanical force',
6085
+ },
6086
+ {
6087
+ key: 'tolerance',
6088
+ label: 'Tolerance',
6089
+ abbreviation: 'TOL',
6090
+ purpose: 'Ability to withstand heat, pressure, and stress extremes',
6091
+ },
6092
+ {
6093
+ key: 'density',
6094
+ label: 'Density',
6095
+ abbreviation: 'DEN',
6096
+ purpose: 'Mass per unit',
6097
+ inverted: true,
6098
+ },
6099
+ ];
6100
+ const PRECIOUS_STATS = [
6101
+ {
6102
+ key: 'conductivity',
6103
+ label: 'Conductivity',
6104
+ abbreviation: 'CON',
6105
+ purpose: 'Efficiency of energy/signal transfer',
6106
+ },
6107
+ {
6108
+ key: 'ductility',
6109
+ label: 'Ductility',
6110
+ abbreviation: 'DUC',
6111
+ purpose: 'Ability to be worked into fine, precise shapes',
6112
+ },
6113
+ {
6114
+ key: 'reflectivity',
6115
+ label: 'Reflectivity',
6116
+ abbreviation: 'REF',
6117
+ purpose: 'Surface quality for heat management and precision optics',
6118
+ },
6119
+ ];
6120
+ const GAS_STATS = [
6121
+ {
6122
+ key: 'volatility',
6123
+ label: 'Volatility',
6124
+ abbreviation: 'VOL',
6125
+ purpose: 'Energy release potential for propulsion and force',
6126
+ },
6127
+ {
6128
+ key: 'reactivity',
6129
+ label: 'Reactivity',
6130
+ abbreviation: 'REA',
6131
+ purpose: 'Chemical interaction speed for processing and penetration',
6132
+ },
6133
+ {
6134
+ key: 'thermal',
6135
+ label: 'Thermal',
6136
+ abbreviation: 'THM',
6137
+ purpose: 'Heat capacity for thermal management',
6138
+ },
6139
+ ];
6140
+ const MINERAL_STATS = [
6141
+ {
6142
+ key: 'resonance',
6143
+ label: 'Resonance',
6144
+ abbreviation: 'RES',
6145
+ purpose: 'Energy field interaction — storage, focusing, projection',
6146
+ },
6147
+ {
6148
+ key: 'hardness',
6149
+ label: 'Hardness',
6150
+ abbreviation: 'HRD',
6151
+ purpose: 'Resistance to wear — cutting surfaces, penetration',
6152
+ },
6153
+ {
6154
+ key: 'clarity',
6155
+ label: 'Clarity',
6156
+ abbreviation: 'CLR',
6157
+ purpose: 'Crystalline perfection — precision optics',
6158
+ },
6159
+ ];
6160
+ const ORGANIC_STATS = [
6161
+ {
6162
+ key: 'plasticity',
6163
+ label: 'Plasticity',
6164
+ abbreviation: 'PLA',
6165
+ purpose: 'Ease of reshaping — speeds processing',
6166
+ },
6167
+ {
6168
+ key: 'insulation',
6169
+ label: 'Insulation',
6170
+ abbreviation: 'INS',
6171
+ purpose: 'Energy containment — reduces energy loss',
6172
+ },
6173
+ {
6174
+ key: 'purity',
6175
+ label: 'Purity',
6176
+ abbreviation: 'PUR',
6177
+ purpose: 'Biological cleanliness — better composites and lubricants',
6178
+ },
6179
+ ];
6180
+ const STAT_MAP = {
6181
+ metal: METAL_STATS,
6182
+ precious: PRECIOUS_STATS,
6183
+ gas: GAS_STATS,
6184
+ mineral: MINERAL_STATS,
6185
+ organic: ORGANIC_STATS,
6186
+ };
6187
+ function getStatDefinitions(category) {
6188
+ return STAT_MAP[category];
6189
+ }
6190
+ function getStatName(category, index) {
6191
+ return STAT_MAP[category][index];
6192
+ }
6193
+ function resolveStats(category, stats) {
6194
+ return {
6195
+ definitions: STAT_MAP[category],
6196
+ values: [stats.stat1, stats.stat2, stats.stat3],
6197
+ };
6198
+ }
6199
+
6200
+ const ITEM_HULL_PLATES = 10001;
6201
+ const ITEM_CARGO_LINING = 10002;
6202
+ const ITEM_CONTAINER_PACKED = 10003;
6203
+ const components = [
6204
+ {
6205
+ id: ITEM_HULL_PLATES,
6206
+ name: 'Hull Plates',
6207
+ description: 'Structural plating formed from metal. Used in hulls, containers, and frames.',
6208
+ color: '#7B8D9E',
6209
+ mass: 50000,
6210
+ stats: [
6211
+ { key: 'strength', source: 'metal' },
6212
+ { key: 'density', source: 'metal' },
6213
+ ],
6214
+ recipe: [{ category: 'metal', quantity: 40 }],
6215
+ usedIn: [{ type: 'entity', name: 'Container' }],
6216
+ },
6217
+ {
6218
+ id: ITEM_CARGO_LINING,
6219
+ name: 'Cargo Lining',
6220
+ description: 'Precision-formed composite lining for cargo storage. Combines precious metal shaping with organic sealing.',
6221
+ color: '#D4A843',
6222
+ mass: 30000,
6223
+ stats: [
6224
+ { key: 'ductility', source: 'precious' },
6225
+ { key: 'purity', source: 'organic' },
6226
+ ],
6227
+ recipe: [
6228
+ { category: 'precious', quantity: 10 },
6229
+ { category: 'organic', quantity: 20 },
6230
+ ],
6231
+ usedIn: [{ type: 'entity', name: 'Container' }],
6232
+ },
6233
+ ];
6234
+ const entityRecipes = [
6235
+ {
6236
+ id: 'container',
6237
+ name: 'Container',
6238
+ description: 'Passive floating cargo storage in space. Towed by ships.',
6239
+ color: '#7B8D9E',
6240
+ packedItemId: ITEM_CONTAINER_PACKED,
6241
+ recipe: [
6242
+ { itemId: ITEM_HULL_PLATES, quantity: 6 },
6243
+ { itemId: ITEM_CARGO_LINING, quantity: 2 },
6244
+ ],
6245
+ stats: [
6246
+ { key: 'strength', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'strength' },
6247
+ { key: 'density', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'density' },
6248
+ { key: 'ductility', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'ductility' },
6249
+ { key: 'purity', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'purity' },
6250
+ ],
6251
+ },
6252
+ ];
6253
+ function getComponentById(id) {
6254
+ return components.find((c) => c.id === id);
6255
+ }
6256
+ function getEntityRecipe(id) {
6257
+ return entityRecipes.find((r) => r.id === id);
6258
+ }
6259
+ function getEntityRecipeByItemId(itemId) {
6260
+ return entityRecipes.find((r) => r.packedItemId === itemId);
6261
+ }
6262
+ function getAllCraftableItems() {
6263
+ const items = [];
6264
+ for (const comp of components) {
6265
+ items.push({ type: 'component', id: comp.id, name: comp.name, description: comp.description, color: comp.color });
6266
+ }
6267
+ for (const entity of entityRecipes) {
6268
+ items.push({ type: 'entity', id: entity.id, name: entity.name, description: entity.description, color: entity.color });
6269
+ }
6270
+ return items;
6271
+ }
6272
+ function getComponentsForCategory(category) {
6273
+ return components.filter((c) => c.recipe.some((r) => r.category === category));
6274
+ }
6275
+ function getComponentsForStat(statKey) {
6276
+ return components.filter((c) => c.stats.some((s) => s.key === statKey));
6277
+ }
6278
+
6279
+ function encodeStats(values) {
6280
+ let seed = 0n;
6281
+ for (let i = 0; i < values.length && i < 6; i++) {
6282
+ seed |= BigInt(values[i] & 0x3ff) << BigInt(i * 10);
6283
+ }
6284
+ return seed;
6285
+ }
6286
+ function decodeStats(seed, count) {
6287
+ const stats = [];
6288
+ for (let i = 0; i < count; i++) {
6289
+ stats.push(Number((seed >> BigInt(i * 10)) & 0x3ffn));
6290
+ }
6291
+ return stats;
6292
+ }
6293
+ function decodeCraftedItemStats(itemId, seed) {
6294
+ const comp = getComponentById(itemId);
6295
+ if (comp) {
6296
+ const values = decodeStats(seed, comp.stats.length);
6297
+ const result = {};
6298
+ for (let i = 0; i < comp.stats.length; i++) {
6299
+ result[comp.stats[i].key] = values[i];
6300
+ }
6301
+ return result;
6302
+ }
6303
+ const entityRecipe = entityRecipes.find((r) => r.packedItemId === itemId);
6304
+ if (entityRecipe) {
6305
+ const values = decodeStats(seed, entityRecipe.stats.length);
6306
+ const result = {};
6307
+ for (let i = 0; i < entityRecipe.stats.length; i++) {
6308
+ result[entityRecipe.stats[i].key] = values[i];
6309
+ }
6310
+ return result;
6311
+ }
6312
+ return {};
6313
+ }
6314
+ function blendStacks(stacks, statKey) {
6315
+ let totalQty = 0;
6316
+ let weightedSum = 0;
6317
+ for (const stack of stacks) {
6318
+ const val = stack.stats[statKey] ?? 0;
6319
+ weightedSum += val * stack.quantity;
6320
+ totalQty += stack.quantity;
6321
+ }
6322
+ if (totalQty === 0)
7594
6323
  return 0;
7595
- const raw = (loc.seed0.toNumber() << 8) | loc.seed1.toNumber();
7596
- const normalized = raw / 65535;
7597
- const curved = Math.pow(normalized, 3.0);
7598
- const range = LOCATION_MAX_DEPTH - LOCATION_MIN_DEPTH;
7599
- return Math.floor(LOCATION_MIN_DEPTH + curved * range);
6324
+ return Math.round(weightedSum / totalQty);
6325
+ }
6326
+ function computeComponentStats(componentId, categoryStacks) {
6327
+ const comp = getComponentById(componentId);
6328
+ if (!comp)
6329
+ return [];
6330
+ return comp.stats.map((statDef) => {
6331
+ const matching = categoryStacks.find((cs) => cs.category === statDef.source);
6332
+ const value = matching ? blendStacks(matching.stacks, statDef.key) : 0;
6333
+ return { key: statDef.key, value: Math.max(1, Math.min(999, value)) };
6334
+ });
6335
+ }
6336
+ function blendComponentStacks(stacks) {
6337
+ if (stacks.length === 0)
6338
+ return {};
6339
+ const allKeys = new Set();
6340
+ for (const s of stacks) {
6341
+ for (const k of Object.keys(s.stats))
6342
+ allKeys.add(k);
6343
+ }
6344
+ const result = {};
6345
+ for (const key of allKeys) {
6346
+ result[key] = blendStacks(stacks.map((s) => ({ quantity: s.quantity, stats: s.stats })), key);
6347
+ }
6348
+ return result;
6349
+ }
6350
+ function computeEntityStats(entityRecipeId, componentStacks) {
6351
+ const recipe = getEntityRecipe(entityRecipeId);
6352
+ if (!recipe)
6353
+ return [];
6354
+ const blendedByComponent = {};
6355
+ for (const [compId, stacks] of Object.entries(componentStacks)) {
6356
+ blendedByComponent[Number(compId)] = blendComponentStacks(stacks);
6357
+ }
6358
+ return recipe.stats.map((stat) => {
6359
+ const blended = blendedByComponent[stat.sourceComponentId] ?? {};
6360
+ const value = blended[stat.sourceStatKey] ?? 0;
6361
+ return { key: stat.key, value: Math.max(1, Math.min(999, value)) };
6362
+ });
6363
+ }
6364
+
6365
+ function totalCargoMass(cargo) {
6366
+ return cargo.reduce((sum, c) => {
6367
+ return sum.adding(c.totalMass);
6368
+ }, UInt64.from(0));
6369
+ }
6370
+ function getCargoForItem(cargo, goodId) {
6371
+ return cargo.find((c) => c.item_id.equals(goodId));
6372
+ }
6373
+ function hasSpace(currentMass, maxCapacity, goodMass, quantity) {
6374
+ const additionalMass = goodMass.multiplying(quantity);
6375
+ const totalMass = currentMass.adding(additionalMass);
6376
+ return totalMass.lte(maxCapacity);
6377
+ }
6378
+ function availableCapacity(currentMass, maxCapacity) {
6379
+ if (currentMass.gte(maxCapacity)) {
6380
+ return UInt64.from(0);
6381
+ }
6382
+ return maxCapacity.subtracting(currentMass);
6383
+ }
6384
+ function isFull(currentMass, maxCapacity) {
6385
+ return currentMass.gte(maxCapacity);
6386
+ }
6387
+ function afterRemoveItems(cargo, goodsToRemove) {
6388
+ if (cargo.length === 0) {
6389
+ return [];
6390
+ }
6391
+ return cargo.map((item) => {
6392
+ const removeItem = goodsToRemove.find((s) => Number(item.item_id) === s.goodId);
6393
+ if (!removeItem) {
6394
+ return new EntityInventory(item);
6395
+ }
6396
+ const currentQty = Number(item.quantity);
6397
+ const newQty = Math.max(0, currentQty - removeItem.quantity);
6398
+ return new EntityInventory(Types.cargo_item.from({
6399
+ item_id: item.item_id,
6400
+ quantity: UInt32.from(newQty),
6401
+ }));
6402
+ });
7600
6403
  }
6404
+ function afterRemoveAllItems(cargo) {
6405
+ if (cargo.length === 0) {
6406
+ return [];
6407
+ }
6408
+ return cargo.map((item) => new EntityInventory(Types.cargo_item.from({
6409
+ item_id: item.item_id,
6410
+ quantity: UInt32.from(0),
6411
+ })));
6412
+ }
6413
+
6414
+ var cargoUtils = /*#__PURE__*/Object.freeze({
6415
+ __proto__: null,
6416
+ totalCargoMass: totalCargoMass,
6417
+ getCargoForItem: getCargoForItem,
6418
+ hasSpace: hasSpace,
6419
+ availableCapacity: availableCapacity,
6420
+ isFull: isFull,
6421
+ afterRemoveItems: afterRemoveItems,
6422
+ afterRemoveAllItems: afterRemoveAllItems
6423
+ });
7601
6424
 
7602
6425
  function canMove(e) {
7603
6426
  return 'engines' in e && 'generator' in e && 'energy' in e;
@@ -7611,9 +6434,6 @@ function hasStorage(e) {
7611
6434
  function hasLoaders(e) {
7612
6435
  return 'loaders' in e && e.loaders !== undefined;
7613
6436
  }
7614
- function hasTrade(e) {
7615
- return 'trade' in e && e.trade !== undefined;
7616
- }
7617
6437
  function hasMass(e) {
7618
6438
  return 'hullmass' in e;
7619
6439
  }
@@ -7647,5 +6467,9 @@ function calc_extraction_energy(extractor, duration) {
7647
6467
  return UInt16.from(energy);
7648
6468
  }
7649
6469
 
7650
- export { ActionsManager, COMMIT_ALREADY_SET, COMMIT_CANNOT_MATCH, COMMIT_NOT_SET, COMPANY_NOT_FOUND, CONTAINER_Z, Container, Coordinates, DEPTH_THRESHOLD_COMMON, DEPTH_THRESHOLD_EPIC, DEPTH_THRESHOLD_LEGENDARY, DEPTH_THRESHOLD_RARE, DEPTH_THRESHOLD_UNCOMMON, EPOCH_NON_ZERO, EPOCH_NOT_READY, ERROR_SYSTEM_ALREADY_INITIALIZED, ERROR_SYSTEM_DISABLED, ERROR_SYSTEM_NOT_INITIALIZED, EntitiesManager, EntityInventory, EntityType, EpochsManager, GAME_NOT_FOUND, GAME_SEED_NOT_SET, GameState, INITIAL_CONTAINER_CAPACITY, INITIAL_CONTAINER_HULLMASS, INITIAL_EXTRACTOR_DRAIN, INITIAL_EXTRACTOR_EFFICIENCY, INITIAL_EXTRACTOR_RATE, INITIAL_LOADER_MASS, INITIAL_LOADER_QUANTITY, INITIAL_LOADER_THRUST, INITIAL_SHIP_CAPACITY, INITIAL_SHIP_DRAIN, INITIAL_SHIP_ENERGY, INITIAL_SHIP_GENERATOR_CAPACITY, INITIAL_SHIP_HULLMASS, INITIAL_SHIP_MASS, INITIAL_SHIP_RECHARGE, INITIAL_SHIP_THRUST, INITIAL_SHIP_Z, INITIAL_WAREHOUSE_CAPACITY, INSUFFICIENT_BALANCE, INSUFFICIENT_ITEM_QUANTITY, INSUFFICIENT_ITEM_SUPPLY, INVALID_AMOUNT, ITEM_DOES_NOT_EXIST, ITEM_NOT_AVAILABLE_AT_LOCATION, InventoryAccessor, Item, ItemPrice, LOCATION_MAX_DEPTH, LOCATION_MIN_DEPTH, Location, LocationType, LocationsManager, MAX_ORBITAL_ALTITUDE, MIN_ORBITAL_ALTITUDE, NO_SCHEDULE, PLANET_SUBTYPE_GAS_GIANT, PLANET_SUBTYPE_ICY, PLANET_SUBTYPE_INDUSTRIAL, PLANET_SUBTYPE_OCEAN, PLANET_SUBTYPE_ROCKY, PLANET_SUBTYPE_TERRESTRIAL, PLAYER_ALREADY_JOINED, PLAYER_NOT_FOUND, PRECISION, platform as PlatformContract, Player, PlayersManager, REQUIRES_MORE_THAN_ONE, REQUIRES_POSITIVE_VALUE, Rarities, SHIP_ALREADY_THERE, SHIP_ALREADY_TRAVELING, SHIP_CANNOT_BUY_TRAVELING, SHIP_CANNOT_CANCEL_TASK, SHIP_CANNOT_UPDATE_TRAVELING, SHIP_CARGO_NOT_LOADED, SHIP_CARGO_NOT_OWNED, SHIP_INVALID_CARGO, SHIP_INVALID_DESTINATION, SHIP_INVALID_TRAVEL_DURATION, SHIP_NOT_ARRIVED, SHIP_NOT_ENOUGH_ENERGY, SHIP_NOT_ENOUGH_ENERGY_CAPACITY, SHIP_NOT_FOUND, SHIP_NOT_IDLE, SHIP_NOT_OWNED, SHIP_NO_COMPLETED_TASKS, SHIP_NO_TASKS_TO_CANCEL, ScheduleAccessor, server as ServerContract, Ship, Shipload, TRAVEL_MAX_DURATION, TaskCancelable, TaskType, TradesManager, WAREHOUSE_ALREADY_AT_LOCATION, WAREHOUSE_CAPACITY_EXCEEDED, WAREHOUSE_NOT_FOUND, WAREHOUSE_Z, Warehouse, analyzeCargoSale, analyzeCollectOptions, availableCapacity$1 as availableCapacity, availableCapacityFromMass, calcCargoMass, calcCargoValue, calcEnergyUsage, calcLoadDuration, calc_acceleration, calc_energyusage, calc_extraction_duration, calc_extraction_energy, calc_flighttime, calc_loader_acceleration, calc_loader_flighttime, calc_orbital_altitude, calc_rechargetime, calc_ship_acceleration, calc_ship_flighttime, calc_ship_mass, calc_ship_rechargetime, calc_transfer_duration, calculateBreakEvenPrice, calculateFlightTime, calculateLoadTimeBreakdown, calculateMaxTradeQuantity, calculateProfitPerMass, calculateProfitPerSecond, calculateROI, calculateRefuelingTime, calculateTradeProfit, calculateTransferTime, calculateUpdatedCargoCost, canMove, capsHasExtractor, capsHasLoaders, capsHasMass, capsHasMovement, capsHasStorage, capsHasTrade, cargoUtils, coordsToLocationId, createExploreOption, createInventoryAccessor, createProjectedEntity, createScheduleAccessor, createSellAndRepositionOption, createSellAndStayOption, createSellAndTradeOption, createTravelToSellOption, Shipload as default, depthScaleFactor, deriveLocation, deriveLocationEpoch, deriveLocationSize, deriveLocationStatic, deriveResourceStats, deriveStratum, distanceBetweenCoordinates, distanceBetweenPoints, energyPercent, estimateDealTravelTime, estimateTravelTime, findBestDeal, findBestItemToTrade, findDealsForShip, findNearbyPlanets, getCurrentEpoch, getDepthThreshold, getDestinationLocation, getEligibleResources, getEpochInfo, getFlightOrigin, getItem, getItems, getLocationCandidates, getLocationType, getPositionAt, getRarity, getResourceRarity, getResourceWeight, getSystemName, hasEnergy, hasEnergyForDistance$1 as hasEnergyForDistance, hasExtractor, hasLoaders, hasMass, hasSchedule, hasSpace$1 as hasSpace, hasSpaceForMass, hasStorage, hasSystem, hasTrade, hash, hash512, isExtractableLocation, isFull$1 as isFull, isFullFromMass, isProfitable, itemIds, lerp, makeContainer, makeShip, makeWarehouse, marketPrice, marketPrices, maxTravelDistance, needsRecharge, projectEntity, projectEntityAt, rotation, schedule, toLocation };
6470
+ function capsHasCrafter(caps) {
6471
+ return caps.crafter !== undefined;
6472
+ }
6473
+
6474
+ export { ActionsManager, COMMIT_ALREADY_SET, COMMIT_CANNOT_MATCH, COMMIT_NOT_SET, COMPANY_NOT_FOUND, CONTAINER_Z, Container, Coordinates, DEPTH_THRESHOLD_T1, DEPTH_THRESHOLD_T2, DEPTH_THRESHOLD_T3, DEPTH_THRESHOLD_T4, DEPTH_THRESHOLD_T5, EPOCH_NON_ZERO, EPOCH_NOT_READY, ERROR_SYSTEM_ALREADY_INITIALIZED, ERROR_SYSTEM_DISABLED, ERROR_SYSTEM_NOT_INITIALIZED, EntitiesManager, EntityInventory, EntityType, EpochsManager, GAME_NOT_FOUND, GAME_SEED_NOT_SET, GameState, INITIAL_CONTAINER_CAPACITY, INITIAL_CONTAINER_HULLMASS, INITIAL_EXTRACTOR_DRAIN, INITIAL_EXTRACTOR_EFFICIENCY, INITIAL_EXTRACTOR_RATE, INITIAL_LOADER_MASS, INITIAL_LOADER_QUANTITY, INITIAL_LOADER_THRUST, INITIAL_SHIP_CAPACITY, INITIAL_SHIP_DRAIN, INITIAL_SHIP_ENERGY, INITIAL_SHIP_GENERATOR_CAPACITY, INITIAL_SHIP_HULLMASS, INITIAL_SHIP_MASS, INITIAL_SHIP_RECHARGE, INITIAL_SHIP_THRUST, INITIAL_SHIP_Z, INITIAL_WAREHOUSE_CAPACITY, INSUFFICIENT_BALANCE, INSUFFICIENT_ITEM_QUANTITY, INSUFFICIENT_ITEM_SUPPLY, INVALID_AMOUNT, ITEM_CARGO_LINING, ITEM_CONTAINER_PACKED, ITEM_DOES_NOT_EXIST, ITEM_HULL_PLATES, ITEM_NOT_AVAILABLE_AT_LOCATION, InventoryAccessor, Item, LOCATION_MAX_DEPTH, LOCATION_MIN_DEPTH, Location, LocationType, LocationsManager, MAX_ORBITAL_ALTITUDE, MIN_ORBITAL_ALTITUDE, NO_SCHEDULE, PLANET_SUBTYPE_GAS_GIANT, PLANET_SUBTYPE_ICY, PLANET_SUBTYPE_INDUSTRIAL, PLANET_SUBTYPE_OCEAN, PLANET_SUBTYPE_ROCKY, PLANET_SUBTYPE_TERRESTRIAL, PLAYER_ALREADY_JOINED, PLAYER_NOT_FOUND, PRECISION, platform as PlatformContract, Player, PlayersManager, REQUIRES_MORE_THAN_ONE, REQUIRES_POSITIVE_VALUE, SHIP_ALREADY_THERE, SHIP_ALREADY_TRAVELING, SHIP_CANNOT_BUY_TRAVELING, SHIP_CANNOT_CANCEL_TASK, SHIP_CANNOT_UPDATE_TRAVELING, SHIP_CARGO_NOT_LOADED, SHIP_CARGO_NOT_OWNED, SHIP_INVALID_CARGO, SHIP_INVALID_DESTINATION, SHIP_INVALID_TRAVEL_DURATION, SHIP_NOT_ARRIVED, SHIP_NOT_ENOUGH_ENERGY, SHIP_NOT_ENOUGH_ENERGY_CAPACITY, SHIP_NOT_FOUND, SHIP_NOT_IDLE, SHIP_NOT_OWNED, SHIP_NO_COMPLETED_TASKS, SHIP_NO_TASKS_TO_CANCEL, ScheduleAccessor, server as ServerContract, Ship, Shipload, TRAVEL_MAX_DURATION, TaskCancelable, TaskType, WAREHOUSE_ALREADY_AT_LOCATION, WAREHOUSE_CAPACITY_EXCEEDED, WAREHOUSE_NOT_FOUND, WAREHOUSE_Z, Warehouse, availableCapacity$1 as availableCapacity, availableCapacityFromMass, blendComponentStacks, blendStacks, calcCargoMass, calcEnergyUsage, calcLoadDuration, calc_acceleration, calc_energyusage, calc_extraction_duration, calc_extraction_energy, calc_flighttime, calc_loader_acceleration, calc_loader_flighttime, calc_orbital_altitude, calc_rechargetime, calc_ship_acceleration, calc_ship_flighttime, calc_ship_mass, calc_ship_rechargetime, calc_transfer_duration, calculateFlightTime, calculateLoadTimeBreakdown, calculateRefuelingTime, calculateTransferTime, canMove, capsHasCrafter, capsHasExtractor, capsHasLoaders, capsHasMass, capsHasMovement, capsHasStorage, cargoUtils, components, computeComponentStats, computeContainerCapabilities, computeEntityStats, coordsToLocationId, createInventoryAccessor, createProjectedEntity, createScheduleAccessor, decodeCraftedItemStats, decodeStats, Shipload as default, depthScaleFactor, deriveLocation, deriveLocationEpoch, deriveLocationSize, deriveLocationStatic, deriveResourceStats, deriveStratum, distanceBetweenCoordinates, distanceBetweenPoints, encodeStats, energyPercent, entityRecipes, estimateDealTravelTime, estimateTravelTime, findNearbyPlanets, getAllCraftableItems, getComponentById, getComponentsForCategory, getComponentsForStat, getCurrentEpoch, getDepthThreshold, getDestinationLocation, getEligibleResources, getEntityRecipe, getEntityRecipeByItemId, getEpochInfo, getFlightOrigin, getItem, getItems, getLocationCandidates, getLocationType, getPositionAt, getResourceTier, getResourceWeight, getStatDefinitions, getStatName, getSystemName, hasEnergy, hasEnergyForDistance$1 as hasEnergyForDistance, hasExtractor, hasLoaders, hasMass, hasSchedule, hasSpace$1 as hasSpace, hasSpaceForMass, hasStorage, hasSystem, hash, hash512, isExtractableLocation, isFull$1 as isFull, isFullFromMass, itemIds, lerp, makeContainer, makeShip, makeWarehouse, maxTravelDistance, needsRecharge, projectEntity, projectEntityAt, resolveStats, rotation, schedule, toLocation };
7651
6475
  //# sourceMappingURL=shipload.m.js.map