@shipload/sdk 1.0.0-next.1 → 1.0.0-next.11

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 (56) hide show
  1. package/lib/shipload.d.ts +618 -353
  2. package/lib/shipload.js +2250 -1059
  3. package/lib/shipload.js.map +1 -1
  4. package/lib/shipload.m.js +2193 -1044
  5. package/lib/shipload.m.js.map +1 -1
  6. package/package.json +2 -2
  7. package/src/capabilities/modules.ts +3 -0
  8. package/src/capabilities/storage.ts +1 -1
  9. package/src/contracts/platform.ts +13 -1
  10. package/src/contracts/server.ts +227 -282
  11. package/src/data/capabilities.ts +5 -330
  12. package/src/data/capability-formulas.ts +70 -0
  13. package/src/data/catalog.ts +0 -5
  14. package/src/data/colors.ts +2 -16
  15. package/src/data/entities.json +46 -10
  16. package/src/data/item-ids.ts +4 -1
  17. package/src/data/items.json +264 -0
  18. package/src/data/metadata.ts +63 -1
  19. package/src/data/recipes-runtime.ts +1 -0
  20. package/src/data/recipes.json +139 -11
  21. package/src/derivation/capability-mappings.ts +122 -0
  22. package/src/derivation/index.ts +1 -0
  23. package/src/derivation/resources.ts +116 -37
  24. package/src/derivation/stats.ts +1 -2
  25. package/src/entities/container.ts +25 -10
  26. package/src/entities/extractor.ts +144 -0
  27. package/src/entities/factory.ts +135 -0
  28. package/src/entities/gamestate.ts +0 -9
  29. package/src/entities/makers.ts +130 -20
  30. package/src/entities/nexus.ts +29 -0
  31. package/src/entities/ship-deploy.ts +114 -56
  32. package/src/entities/ship.ts +17 -0
  33. package/src/entities/slot-multiplier.ts +21 -0
  34. package/src/entities/warehouse.ts +20 -3
  35. package/src/errors.ts +10 -13
  36. package/src/index-module.ts +81 -26
  37. package/src/managers/actions.ts +53 -80
  38. package/src/managers/entities.ts +65 -17
  39. package/src/managers/locations.ts +2 -20
  40. package/src/nft/atomicdata.ts +128 -0
  41. package/src/nft/description.ts +41 -7
  42. package/src/nft/index.ts +1 -0
  43. package/src/resolution/resolve-item.ts +17 -9
  44. package/src/scheduling/accessor.ts +4 -0
  45. package/src/scheduling/projection.ts +10 -2
  46. package/src/scheduling/schedule.ts +15 -1
  47. package/src/scheduling/task-cargo.ts +47 -0
  48. package/src/subscriptions/connection.ts +50 -2
  49. package/src/subscriptions/manager.ts +84 -4
  50. package/src/subscriptions/mappers.ts +5 -1
  51. package/src/subscriptions/types.ts +2 -2
  52. package/src/travel/travel.ts +61 -2
  53. package/src/types/entity-traits.ts +103 -1
  54. package/src/types.ts +11 -1
  55. package/src/utils/cargo.ts +27 -0
  56. package/src/utils/system.ts +25 -24
package/lib/shipload.m.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { __decorate } from 'tslib';
2
- import { Blob, ABI, Struct, Name, UInt64, Checksum256, UInt32, TimePointSec, UInt8, Int64, UInt16, TimePoint, Bytes, Int32, Checksum512, APIClient } from '@wharfkit/antelope';
2
+ import { Blob, ABI, Struct, Name, UInt64, Checksum256, UInt32, TimePointSec, UInt16, UInt8, Int64, TimePoint, Bytes, Int32, Checksum512, APIClient } from '@wharfkit/antelope';
3
3
  import ContractKit, { Contract as Contract$2 } from '@wharfkit/contract';
4
4
 
5
- const abiBlob$1 = Blob.from('DmVvc2lvOjphYmkvMS4yAA0KY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/C2NvbXBhbnlfcm93AAIHYWNjb3VudARuYW1lBG5hbWUGc3RyaW5nBmVuYWJsZQABB2VuYWJsZWQEYm9vbAplbmFibGVnYW1lAAIIY29udHJhY3QEbmFtZQdlbmFibGVkBGJvb2wMZm91bmRjb21wYW55AAIHYWNjb3VudARuYW1lBG5hbWUGc3RyaW5nC2dhbWVfY29uZmlnAAQEc2VlZAtjaGVja3N1bTI1NgllcG9jaHRpbWUGdWludDMyBXN0YXJ0DnRpbWVfcG9pbnRfc2VjA2VuZA50aW1lX3BvaW50X3NlYwlnYW1lX21ldGEABARuYW1lBnN0cmluZwtkZXNjcmlwdGlvbgZzdHJpbmcDdXJsBnN0cmluZwd2ZXJzaW9uBnN0cmluZwhnYW1lX3JvdwAECGNvbnRyYWN0BG5hbWUGY29uZmlnC2dhbWVfY29uZmlnBG1ldGEJZ2FtZV9tZXRhBXN0YXRlCmdhbWVfc3RhdGUKZ2FtZV9zdGF0ZQABB2VuYWJsZWQEYm9vbAlzdGFydGdhbWUABAhjb250cmFjdARuYW1lBmNvbmZpZwtnYW1lX2NvbmZpZwRtZXRhCWdhbWVfbWV0YQVzdGF0ZQpnYW1lX3N0YXRlCXN0YXRlX3JvdwABB2VuYWJsZWQEYm9vbAp1cGRhdGVnYW1lAAIIY29udHJhY3QEbmFtZQRtZXRhCWdhbWVfbWV0YQR3aXBlAAAHAICKx+RrVEQKY2xlYXJ0YWJsZb4BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsZWFydGFibGUKc3VtbWFyeTogJ0RFQlVHOiBjbGVhcnRhYmxlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAACoeMxUBmVuYWJsZfMBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZQpzdW1tYXJ5OiAnRW5hYmxlL2Rpc2FibGUgcGxhdGZvcm0nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpFbmFibGUgb3IgZGlzYWJsZSB0aGUgcGxhdGZvcm0gY29udHJhY3QuAICShql4zFQKZW5hYmxlZ2FtZfwBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZWdhbWUKc3VtbWFyeTogJ0VuYWJsZS9kaXNiYWJsZSBhIGdhbWUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpFbmFibGUgb3IgZGlzYWJsZSB0aGUgc3BlY2lmaWVkIGdhbWUgY29udHJhY3Qu4KepkqI0NV0MZm91bmRjb21wYW55gwItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZm91bmRjb21wYW55CnN1bW1hcnk6ICdGb3VuZCBhIG5ldyBjb21wYW55JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKRm91bmQgYSBuZXcgY29tcGFueSBpbiB0aGUgU2hpcGxvYWQgcGxhdGZvcm0gY29udHJhY3QuAABQ0rB8TcYJc3RhcnRnYW1l/wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc3RhcnRnYW1lCnN1bW1hcnk6ICdTdGFydCBhIG5ldyBnYW1lJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKU3RhcnQgYSBuZXcgZ2FtZSBvZiBTaGlwbG9hZCBkZXBsb3llZCB0byBhIG5ldyBjb250cmFjdC4AgJKGqWxS1Qp1cGRhdGVnYW1ljQItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdXBkYXRlZ2FtZQpzdW1tYXJ5OiAnVXBkYXRlIGdhbWUgaW5mb3JtYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpVcGRhdGUgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgZ2FtZSBjb250cmFjdC4KCi0tLQAAAAAAoKrjBHdpcGWyAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3aXBlCnN1bW1hcnk6ICdERUJVRzogd2lwZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0DAAAAwE9TJUUDaTY0AAALY29tcGFueV9yb3cAAAAAAKykYQNpNjQAAAhnYW1lX3JvdwAAAAAAlU3GA2k2NAAACXN0YXRlX3JvdwETU2hpcGxvYWQgKFBsYXRmb3JtKRNTaGlwbG9hZCAoUGxhdGZvcm0pAAAAAA==');
5
+ const abiBlob$1 = Blob.from('DmVvc2lvOjphYmkvMS4yAA4KY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/C2NvbXBhbnlfcm93AAIHYWNjb3VudARuYW1lBG5hbWUGc3RyaW5nBmVuYWJsZQABB2VuYWJsZWQEYm9vbAplbmFibGVnYW1lAAIIY29udHJhY3QEbmFtZQdlbmFibGVkBGJvb2wMZm91bmRjb21wYW55AAIHYWNjb3VudARuYW1lBG5hbWUGc3RyaW5nC2dhbWVfY29uZmlnAAQEc2VlZAtjaGVja3N1bTI1NgllcG9jaHRpbWUGdWludDMyBXN0YXJ0DnRpbWVfcG9pbnRfc2VjA2VuZA50aW1lX3BvaW50X3NlYwlnYW1lX21ldGEABARuYW1lBnN0cmluZwtkZXNjcmlwdGlvbgZzdHJpbmcDdXJsBnN0cmluZwd2ZXJzaW9uBnN0cmluZwhnYW1lX3JvdwAECGNvbnRyYWN0BG5hbWUGY29uZmlnC2dhbWVfY29uZmlnBG1ldGEJZ2FtZV9tZXRhBXN0YXRlCmdhbWVfc3RhdGUKZ2FtZV9zdGF0ZQABB2VuYWJsZWQEYm9vbAxzZXRlcG9jaHRpbWUAAghjb250cmFjdARuYW1lCWVwb2NodGltZQZ1aW50MzIJc3RhcnRnYW1lAAQIY29udHJhY3QEbmFtZQZjb25maWcLZ2FtZV9jb25maWcEbWV0YQlnYW1lX21ldGEFc3RhdGUKZ2FtZV9zdGF0ZQlzdGF0ZV9yb3cAAQdlbmFibGVkBGJvb2wKdXBkYXRlZ2FtZQACCGNvbnRyYWN0BG5hbWUEbWV0YQlnYW1lX21ldGEEd2lwZQAACACAisfka1RECmNsZWFydGFibGW+AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjbGVhcnRhYmxlCnN1bW1hcnk6ICdERUJVRzogY2xlYXJ0YWJsZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AAAAAqHjMVAZlbmFibGXzAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBlbmFibGUKc3VtbWFyeTogJ0VuYWJsZS9kaXNhYmxlIHBsYXRmb3JtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKRW5hYmxlIG9yIGRpc2FibGUgdGhlIHBsYXRmb3JtIGNvbnRyYWN0LgCAkoapeMxUCmVuYWJsZWdhbWX8AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBlbmFibGVnYW1lCnN1bW1hcnk6ICdFbmFibGUvZGlzYmFibGUgYSBnYW1lJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKRW5hYmxlIG9yIGRpc2FibGUgdGhlIHNwZWNpZmllZCBnYW1lIGNvbnRyYWN0LuCnqZKiNDVdDGZvdW5kY29tcGFueYMCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGZvdW5kY29tcGFueQpzdW1tYXJ5OiAnRm91bmQgYSBuZXcgY29tcGFueScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE1ODExMzc4MiNkM2JmMjkwZmRkZWRkYmI3ZDMyYWE4OTdlOWY3ZTllMTNhMmFlNDQ5NTYxNDJlMjNlYjQ3Yjc3MDk2YTJlYThkCgotLS0KCkZvdW5kIGEgbmV3IGNvbXBhbnkgaW4gdGhlIFNoaXBsb2FkIHBsYXRmb3JtIGNvbnRyYWN0LqCkyw3RqrLCDHNldGVwb2NodGltZQAAAFDSsHxNxglzdGFydGdhbWX/AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzdGFydGdhbWUKc3VtbWFyeTogJ1N0YXJ0IGEgbmV3IGdhbWUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpTdGFydCBhIG5ldyBnYW1lIG9mIFNoaXBsb2FkIGRlcGxveWVkIHRvIGEgbmV3IGNvbnRyYWN0LgCAkoapbFLVCnVwZGF0ZWdhbWWNAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB1cGRhdGVnYW1lCnN1bW1hcnk6ICdVcGRhdGUgZ2FtZSBpbmZvcm1hdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE1ODExMzc4MiNkM2JmMjkwZmRkZWRkYmI3ZDMyYWE4OTdlOWY3ZTllMTNhMmFlNDQ5NTYxNDJlMjNlYjQ3Yjc3MDk2YTJlYThkCgotLS0KClVwZGF0ZSB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBnYW1lIGNvbnRyYWN0LgoKLS0tAAAAAACgquMEd2lwZbIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdpcGUKc3VtbWFyeTogJ0RFQlVHOiB3aXBlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQMAAADAT1MlRQNpNjQAAAtjb21wYW55X3JvdwAAAAAArKRhA2k2NAAACGdhbWVfcm93AAAAAACVTcYDaTY0AAAJc3RhdGVfcm93ARNTaGlwbG9hZCAoUGxhdGZvcm0pE1NoaXBsb2FkIChQbGF0Zm9ybSkAAAAA');
6
6
  const abi$1 = ABI.from(abiBlob$1);
7
7
  var Types$1;
8
8
  (function (Types) {
@@ -129,6 +129,18 @@ var Types$1;
129
129
  Struct.type('game_row')
130
130
  ], game_row);
131
131
  Types.game_row = game_row;
132
+ let setepochtime = class setepochtime extends Struct {
133
+ };
134
+ __decorate([
135
+ Struct.field(Name)
136
+ ], setepochtime.prototype, "contract", void 0);
137
+ __decorate([
138
+ Struct.field(UInt32)
139
+ ], setepochtime.prototype, "epochtime", void 0);
140
+ setepochtime = __decorate([
141
+ Struct.type('setepochtime')
142
+ ], setepochtime);
143
+ Types.setepochtime = setepochtime;
132
144
  let startgame = class startgame extends Struct {
133
145
  };
134
146
  __decorate([
@@ -205,27 +217,63 @@ var platform = /*#__PURE__*/Object.freeze({
205
217
  Contract: Contract$1
206
218
  });
207
219
 
208
- const abiBlob = Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDiDAQlhZGRtb2R1bGUABQtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQMbW9kdWxlX2luZGV4BXVpbnQ4D21vZHVsZV9jYXJnb19pZAZ1aW50NjQPdGFyZ2V0X2NhcmdvX2lkBnVpbnQ2NAhhZGRuZXh1cwADCm5leHVzX25hbWUGc3RyaW5nAXgFaW50NjQBeQVpbnQ2NAdhZHZhbmNlAAIGcmV2ZWFsBnN0cmluZwZjb21taXQLY2hlY2tzdW0yNTYFYmxlbmQAAwtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAZpbnB1dHMMY2FyZ29faXRlbVtdBmNhbmNlbAADC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0BWNvdW50BnVpbnQ2NA5jYW5jZWxfcmVzdWx0cwAGCWVudGl0eV9pZAZ1aW50NjQLZW50aXR5X3R5cGUEbmFtZQ9jYW5jZWxsZWRfY291bnQFdWludDgQc2NoZWR1bGVfc3RhcnRlZAt0aW1lX3BvaW50PwtlbnRpdHlncm91cAd1aW50NjQ/DWdyb3VwX21lbWJlcnMWQl92ZWN0b3JfZW50aXR5X3JlZl9FPwpjYXJnb19pdGVtAAQHaXRlbV9pZAZ1aW50MTYIcXVhbnRpdHkGdWludDMyBXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCWNhcmdvX3JvdwAGAmlkBnVpbnQ2NAllbnRpdHlfaWQGdWludDY0B2l0ZW1faWQGdWludDY0CHF1YW50aXR5BnVpbnQ2NAVzdGF0cwZ1aW50NjQHbW9kdWxlcw5tb2R1bGVfZW50cnlbXQxjbGFpbXN0YXJ0ZXIAAwdhY2NvdW50BG5hbWUBeAVpbnQ2NAF5BWludDY0CWNsZWFucnN2cAACBWVwb2NoBnVpbnQ2NAhtYXhfcm93cwZ1aW50NjQKY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/BmNvbW1pdAABBmNvbW1pdAtjaGVja3N1bTI1Ngljb25maWdsb2cAAQZjb25maWcLZ2FtZV9jb25maWcNY29udGFpbmVyX3JvdwAIAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCGh1bGxtYXNzBnVpbnQzMghjYXBhY2l0eQZ1aW50MzIJY2FyZ29tYXNzBnVpbnQzMghzY2hlZHVsZQlzY2hlZHVsZT8LY29vcmRpbmF0ZXMAAwF4BWludDY0AXkFaW50NjQBegd1aW50MTY/BWNyYWZ0AAULZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQJcmVjaXBlX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIGaW5wdXRzDGNhcmdvX2l0ZW1bXQ1jcmFmdGVyX3N0YXRzAAIFc3BlZWQGdWludDE2BWRyYWluBnVpbnQxNgxjcmVhdGVlbnRpdHkABQVvd25lcgRuYW1lC2VudGl0eV90eXBlBG5hbWULZW50aXR5X25hbWUGc3RyaW5nAXgFaW50NjQBeQVpbnQ2NAZkZXBsb3kABAtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NA5wYWNrZWRfaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0CmRlc2NlbnRpdHkABAdpdGVtX2lkBnVpbnQxNgpodWxsX3N0YXRzBnVpbnQ2NAxtb2R1bGVfaXRlbXMIdWludDE2W10MbW9kdWxlX3N0YXRzCHVpbnQ2NFtdBmVuYWJsZQABB2VuYWJsZWQEYm9vbAxlbmVyZ3lfc3RhdHMAAghjYXBhY2l0eQZ1aW50MTYIcmVjaGFyZ2UGdWludDE2FGVudGl0eV9jdXJyZW50X3N0YXRlAAILY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMGZW5lcmd5BnVpbnQxNg9lbnRpdHlfZGVmYXVsdHMAAgt3YXJlaG91c2VfegZ1aW50MTYLY29udGFpbmVyX3oGdWludDE2C2VudGl0eV9pbmZvABkEdHlwZQRuYW1lAmlkBnVpbnQ2NAVvd25lcgRuYW1lC2VudGl0eV9uYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcwljYXJnb21hc3MGdWludDMyBWNhcmdvDGNhcmdvX2l0ZW1bXQdsb2FkZXJzDWxvYWRlcl9zdGF0cz8HbW9kdWxlcw5tb2R1bGVfZW50cnlbXQZlbmVyZ3kHdWludDE2PwhodWxsbWFzcwd1aW50MzI/B2VuZ2luZXMPbW92ZW1lbnRfc3RhdHM/CWdlbmVyYXRvcg1lbmVyZ3lfc3RhdHM/CGNhcGFjaXR5B3VpbnQzMj8IZ2F0aGVyZXIPZ2F0aGVyZXJfc3RhdHM/BmhhdWxlcg1oYXVsZXJfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8HY3JhZnRlcg5jcmFmdGVyX3N0YXRzPwdpc19pZGxlBGJvb2wMY3VycmVudF90YXNrBXRhc2s/FGN1cnJlbnRfdGFza19lbGFwc2VkBnVpbnQzMhZjdXJyZW50X3Rhc2tfcmVtYWluaW5nBnVpbnQzMg1wZW5kaW5nX3Rhc2tzBnRhc2tbXQdpZGxlX2F0C3RpbWVfcG9pbnQ/CHNjaGVkdWxlCXNjaGVkdWxlPw1lbnRpdHlfbGF5b3V0AAIOZW50aXR5X2l0ZW1faWQGdWludDE2BXNsb3RzCnNsb3RfZGVmW10VZW50aXR5X2xheW91dHNfcmVzdWx0AAEIZW50aXRpZXMPZW50aXR5X2xheW91dFtdCmVudGl0eV9yZWYAAgtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQOZW50aXR5X3N1bW1hcnkACAR0eXBlBG5hbWUCaWQGdWludDY0BW93bmVyBG5hbWULZW50aXR5X25hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzB2lzX2lkbGUEYm9vbA5yZXNvbHZlZF9jb3VudAZ1aW50MzINcGVuZGluZ19jb3VudAZ1aW50MzIQZW50aXR5X3Rhc2tfaW5mbwAECWVudGl0eV9pZAZ1aW50NjQLZW50aXR5X3R5cGUEbmFtZQp0YXNrX2NvdW50BXVpbnQ4EHNjaGVkdWxlX3N0YXJ0ZWQKdGltZV9wb2ludA9lbnRpdHlncm91cF9yb3cAAgJpZAZ1aW50NjQMcGFydGljaXBhbnRzDGVudGl0eV9yZWZbXQtlbnVtX21lbWJlcgACBXZhbHVlBXVpbnQ4BG5hbWUGc3RyaW5nC2VudW1fcmVzdWx0AAEHbWVtYmVycw1lbnVtX21lbWJlcltdC2dhbWVfY29uZmlnAAMHdmVyc2lvbgZ1aW50MzIIZGVmYXVsdHMPZW50aXR5X2RlZmF1bHRzBWl0ZW1zCml0ZW1fZGVmW10GZ2F0aGVyAAQGc291cmNlCmVudGl0eV9yZWYLZGVzdGluYXRpb24KZW50aXR5X3JlZgdzdHJhdHVtBnVpbnQxNghxdWFudGl0eQZ1aW50MzIOZ2F0aGVyZXJfc3RhdHMABAV5aWVsZAZ1aW50MTYFZHJhaW4GdWludDE2BWRlcHRoBnVpbnQxNgVzcGVlZAZ1aW50MTYJZ2V0Y29uZmlnAAALZ2V0ZW50aXRpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/CWdldGVudGl0eQACC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAtnZXRpdGVtZGF0YQAACmdldGl0ZW1pZHMAAAhnZXRpdGVtcwAADGdldGl0ZW10eXBlcwAAC2dldGxvY2F0aW9uAAIBeAVpbnQ2NAF5BWludDY0CmdldGxvY2RhdGEAAgF4BWludDY0AXkFaW50NjQLZ2V0bW9kdHlwZXMAAApnZXRtb2R1bGVzAAAJZ2V0bmVhcmJ5AAMLZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CHJlY2hhcmdlBGJvb2wKZ2V0bmZ0aW5mbwAACWdldHBsYXllcgABB2FjY291bnQEbmFtZQlnZXRyZWNpcGUAAQ5vdXRwdXRfaXRlbV9pZAZ1aW50MTYKZ2V0cmVjaXBlcwACC2xvd2VyX2JvdW5kBnVpbnQxNgVsaW1pdAV1aW50OApnZXRyZXNjYXRzAAALZ2V0cmVzZXJ2ZXMAAgF4BWludDY0AXkFaW50NjQMZ2V0cmVzb3VyY2VzAAAIZ2V0c2xvdHMAAApnZXRzdHJhdHVtAAMBeAVpbnQ2NAF5BWludDY0B3N0cmF0dW0GdWludDE2DGdldHN1bW1hcmllcwACBW93bmVyBG5hbWULZW50aXR5X3R5cGUFbmFtZT8LZ3JvdXB0cmF2ZWwABAhlbnRpdGllcwxlbnRpdHlfcmVmW10BeAVpbnQ2NAF5BWludDY0CHJlY2hhcmdlBGJvb2wEaGFzaAABBXZhbHVlBnN0cmluZwdoYXNoNTEyAAEFdmFsdWUGc3RyaW5nDGhhdWxlcl9zdGF0cwADCGNhcGFjaXR5BXVpbnQ4CmVmZmljaWVuY3kGdWludDE2BWRyYWluBnVpbnQxNgRpbml0AAEEc2VlZAtjaGVja3N1bTI1NghpdGVtX2RlZgAFAmlkBnVpbnQxNgRtYXNzBnVpbnQzMgR0eXBlBXVpbnQ4B3N1YnR5cGUFdWludDgEdGllcgV1aW50OAxpdGVtX2lkX3BhaXIAAgJpZAZ1aW50MTYEbmFtZQZzdHJpbmcPaXRlbV9pZHNfcmVzdWx0AAEFaXRlbXMOaXRlbV9pZF9wYWlyW10PaXRlbWRhdGFfcmVzdWx0AAIFaXRlbXMKaXRlbV9kZWZbXQdyZWNpcGVzDnJlY2lwZXNfcmVzdWx0Cml0ZW1zX2luZm8AAQVpdGVtcwppdGVtX2RlZltdBGpvaW4AAQdhY2NvdW50BG5hbWUMbG9hZGVyX3N0YXRzAAMEbWFzcwZ1aW50MzIGdGhydXN0BnVpbnQxNghxdWFudGl0eQV1aW50OBBsb2NhdGlvbl9kZXJpdmVkAAMMc3RhdGljX3Byb3BzD2xvY2F0aW9uX3N0YXRpYwtlcG9jaF9wcm9wcw5sb2NhdGlvbl9lcG9jaARzaXplBnVpbnQxNg5sb2NhdGlvbl9lcG9jaAADBmFjdGl2ZQRib29sBXNlZWQwBXVpbnQ4BXNlZWQxBXVpbnQ4DWxvY2F0aW9uX2luZm8AAgZjb29yZHMLY29vcmRpbmF0ZXMJaXNfc3lzdGVtBGJvb2wMbG9jYXRpb25fcm93AAYCaWQGdWludDY0BW93bmVyBG5hbWULY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMJY2FyZ29tYXNzBnVpbnQzMgVjYXJnbwxjYXJnb19pdGVtW10Ic2NoZWR1bGUJc2NoZWR1bGU/D2xvY2F0aW9uX3N0YXRpYwAFBmNvb3Jkcwtjb29yZGluYXRlcwR0eXBlDWxvY2F0aW9uX3R5cGUHc3VidHlwZQV1aW50OAVzZWVkMAV1aW50OAVzZWVkMQV1aW50OAxtb2R1bGVfZW50cnkAAgR0eXBlBXVpbnQ4CWluc3RhbGxlZA5wYWNrZWRfbW9kdWxlPwttb2R1bGVfaW5mbwAEAmlkBnVpbnQxNgRtYXNzBnVpbnQzMgttb2R1bGVfdHlwZQV1aW50OAR0aWVyBXVpbnQ4Dm1vZHVsZXNfcmVzdWx0AAEHbW9kdWxlcw1tb2R1bGVfaW5mb1tdDm1vdmVtZW50X3N0YXRzAAIGdGhydXN0BnVpbnQzMgVkcmFpbgZ1aW50MTYLbmVhcmJ5X2luZm8ABQpjYW5fdHJhdmVsBGJvb2wHY3VycmVudBRlbnRpdHlfY3VycmVudF9zdGF0ZQlwcm9qZWN0ZWQUZW50aXR5X2N1cnJlbnRfc3RhdGUKbWF4X2VuZXJneQZ1aW50MTYHc3lzdGVtcw9uZWFyYnlfc3lzdGVtW10NbmVhcmJ5X3N5c3RlbQAECGRpc3RhbmNlBnVpbnQ2NAtlbmVyZ3lfY29zdAZ1aW50NjQLZmxpZ2h0X3RpbWUGdWludDMyCGxvY2F0aW9uDWxvY2F0aW9uX2luZm8JbmV4dXNfcm93AAQCaWQGdWludDY0BW93bmVyBG5hbWUEbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMObmZ0X3NjaGVtYV9kZWYAAgtzY2hlbWFfbmFtZQRuYW1lBmZpZWxkcw5zY2hlbWFfZmllbGRbXRBuZnRfdGVtcGxhdGVfZGVmAAIHaXRlbV9pZAZ1aW50MTYLc2NoZW1hX25hbWUEbmFtZQ1uZnRjb25maWdfcm93AAMHaXRlbV9pZAZ1aW50MTYLdGVtcGxhdGVfaWQFaW50MzILc2NoZW1hX25hbWUEbmFtZQ5uZnRpbmZvX3Jlc3VsdAACB3NjaGVtYXMQbmZ0X3NjaGVtYV9kZWZbXQl0ZW1wbGF0ZXMSbmZ0X3RlbXBsYXRlX2RlZltdBm5vdGlmeQABBWV2ZW50CnRhc2tfZXZlbnQNcGFja2VkX21vZHVsZQACB2l0ZW1faWQGdWludDE2BXN0YXRzBnVpbnQ2NAtwbGF5ZXJfaW5mbwAGBW93bmVyBG5hbWUJaXNfcGxheWVyBGJvb2wMY29tcGFueV9uYW1lBnN0cmluZwpzaGlwX2NvdW50BnVpbnQ2NA93YXJlaG91c2VfY291bnQGdWludDY0D2NvbnRhaW5lcl9jb3VudAZ1aW50NjQKcGxheWVyX3JvdwABBW93bmVyBG5hbWUIcmVjaGFyZ2UAAgtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAxyZWNpcGVfaW5wdXQABAdpdGVtX2lkBnVpbnQxNghjYXRlZ29yeQV1aW50OAR0aWVyBXVpbnQ4CHF1YW50aXR5BnVpbnQzMhByZWNpcGVfaXRlbV9pbmZvAAICaWQGdWludDE2BG1hc3MGdWludDMyD3JlY2lwZV9yZXNwb25zZQAHDm91dHB1dF9pdGVtX2lkBnVpbnQxNgtvdXRwdXRfbWFzcwZ1aW50MzIGaW5wdXRzDnJlY2lwZV9pbnB1dFtdCnN0YXRfc2xvdHMUc3RhdF9zbG90X3Jlc3BvbnNlW10NYmxlbmRfd2VpZ2h0cwVieXRlcwtvdXRwdXRfaXRlbRByZWNpcGVfaXRlbV9pbmZvC2lucHV0X2l0ZW1zEnJlY2lwZV9pdGVtX2luZm9bXQ5yZWNpcGVzX3Jlc3VsdAABB3JlY2lwZXMRcmVjaXBlX3Jlc3BvbnNlW10LcmVzZXJ2ZV9yb3cABAJpZAZ1aW50NjQIY29vcmRfaWQGdWludDY0B3N0cmF0dW0GdWludDE2CXJlbWFpbmluZwZ1aW50MzIHcmVzb2x2ZQADC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0BWNvdW50B3VpbnQ2ND8PcmVzb2x2ZV9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lDnJlc29sdmVkX2NvdW50BXVpbnQ4FG5ld19zY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/DXJlc291cmNlX2luZm8ABAJpZAZ1aW50MTYEbWFzcwZ1aW50MzIIY2F0ZWdvcnkFdWludDgEdGllcgV1aW50OA5yZXNvdXJjZV9zdGF0cwADBXN0YXQxBnVpbnQxNgVzdGF0MgZ1aW50MTYFc3RhdDMGdWludDE2EHJlc291cmNlc19yZXN1bHQAAQlyZXNvdXJjZXMPcmVzb3VyY2VfaW5mb1tdCHJtbW9kdWxlAAQLZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OA90YXJnZXRfY2FyZ29faWQGdWludDY0CHJtbmZ0Y2ZnAAEHaXRlbV9pZAZ1aW50MTYEc2FsdAABBHNhbHQGdWludDY0CHNjaGVkdWxlAAIHc3RhcnRlZAp0aW1lX3BvaW50BXRhc2tzBnRhc2tbXQxzY2hlbWFfZmllbGQAAgRuYW1lBnN0cmluZwpmaWVsZF90eXBlBnN0cmluZwxzZXF1ZW5jZV9yb3cAAgNrZXkEbmFtZQV2YWx1ZQZ1aW50NjQJc2V0bmZ0Y2ZnAAMHaXRlbV9pZAZ1aW50MTYLdGVtcGxhdGVfaWQFaW50MzILc2NoZW1hX25hbWUEbmFtZQhzaGlwX3JvdwASAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nBXN0YXRzBnVpbnQ2NAtjb29yZGluYXRlcwtjb29yZGluYXRlcwhodWxsbWFzcwd1aW50MzI/CGNhcGFjaXR5B3VpbnQzMj8GZW5lcmd5B3VpbnQxNj8JY2FyZ29tYXNzBnVpbnQzMgdlbmdpbmVzD21vdmVtZW50X3N0YXRzPwlnZW5lcmF0b3INZW5lcmd5X3N0YXRzPwdsb2FkZXJzDWxvYWRlcl9zdGF0cz8IZ2F0aGVyZXIPZ2F0aGVyZXJfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8HY3JhZnRlcg5jcmFmdGVyX3N0YXRzPwZoYXVsZXINaGF1bGVyX3N0YXRzPwdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCHNjaGVkdWxlCXNjaGVkdWxlPwhzbG90X2RlZgABBHR5cGUFdWludDgKc3Bhd25jYXJnbwADCWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0C3NwYXducGFja2VkAAQJZW50aXR5X2lkBnVpbnQ2NAdpdGVtX2lkBnVpbnQxNgpodWxsX3N0YXRzBnVpbnQ2NAlpbnN0YWxsZWQPcGFja2VkX21vZHVsZVtdC3NwYXduc2VlZGVkAAQJZW50aXR5X2lkBnVpbnQ2NAdpdGVtX2lkBnVpbnQ2NAhxdWFudGl0eQZ1aW50NjQFc3RhdHMGdWludDY0EnN0YXRfc2xvdF9yZXNwb25zZQABB3NvdXJjZXMNc3RhdF9zb3VyY2VbXQtzdGF0X3NvdXJjZQACC2lucHV0X2luZGV4BXVpbnQ4EGlucHV0X3N0YXRfaW5kZXgFdWludDgJc3RhdGVfcm93AAYHZW5hYmxlZARib29sBWVwb2NoBnVpbnQzMgRzYWx0BnVpbnQ2NAVzaGlwcwZ1aW50MzIEc2VlZAtjaGVja3N1bTI1NgZjb21taXQLY2hlY2tzdW0yNTYMc3RyYXR1bV9kYXRhAAIHc3RyYXR1bQxzdHJhdHVtX2luZm8Fc3RhdHMOcmVzb3VyY2Vfc3RhdHMMc3RyYXR1bV9pbmZvAAUHaXRlbV9pZAZ1aW50MTYEc2VlZAZ1aW50NjQIcmljaG5lc3MGdWludDE2B3Jlc2VydmUGdWludDMyC3Jlc2VydmVfbWF4BnVpbnQzMhFzdHJhdHVtX3JlbWFpbmluZwACB3N0cmF0dW0GdWludDE2CXJlbWFpbmluZwZ1aW50MzIEdGFzawAIBHR5cGUFdWludDgIZHVyYXRpb24GdWludDMyCmNhbmNlbGFibGUFdWludDgLY29vcmRpbmF0ZXMMY29vcmRpbmF0ZXM/BWNhcmdvDGNhcmdvX2l0ZW1bXQxlbnRpdHl0YXJnZXQLZW50aXR5X3JlZj8LZW50aXR5Z3JvdXAHdWludDY0PwtlbmVyZ3lfY29zdAd1aW50MTY/CnRhc2tfZXZlbnQACQpldmVudF90eXBlBXVpbnQ4BW93bmVyBG5hbWULZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CnRhc2tfaW5kZXgFdWludDgEdGFzawR0YXNrCXN0YXJ0c19hdAp0aW1lX3BvaW50DGNvbXBsZXRlc19hdAp0aW1lX3BvaW50Cm5ld19lbmVyZ3kHdWludDE2Pwx0YXNrX3Jlc3VsdHMAAQhlbnRpdGllcxJlbnRpdHlfdGFza19pbmZvW10IdHJhbnNmZXIABwtzb3VyY2VfdHlwZQRuYW1lCXNvdXJjZV9pZAZ1aW50NjQJZGVzdF90eXBlBG5hbWUHZGVzdF9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0CHF1YW50aXR5BnVpbnQzMgZ0cmF2ZWwABQtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAF4BWludDY0AXkFaW50NjQIcmVjaGFyZ2UEYm9vbAl0eXBlc19yb3cABAJpZAZ1aW50NjQTZW50aXR5X3N1bW1hcnlfdHlwZQ5lbnRpdHlfc3VtbWFyeRBnYW1lX2NvbmZpZ190eXBlC2dhbWVfY29uZmlnFnN0cmF0dW1fcmVtYWluaW5nX3R5cGURc3RyYXR1bV9yZW1haW5pbmcNd2FyZWhvdXNlX3JvdwALAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nBXN0YXRzBnVpbnQ2NAtjb29yZGluYXRlcwtjb29yZGluYXRlcwhodWxsbWFzcwd1aW50MzI/CGNhcGFjaXR5B3VpbnQzMj8JY2FyZ29tYXNzBnVpbnQzMgdsb2FkZXJzDWxvYWRlcl9zdGF0cz8HbW9kdWxlcw5tb2R1bGVfZW50cnlbXQhzY2hlZHVsZQlzY2hlZHVsZT8Ed2FycAAEC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAp3YXJwX3N0YXRzAAEFcmFuZ2UGdWludDMyBHdpcGUAAAx3aXBlc2VxdWVuY2UAAAR3cmFwAAUFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQIY2FyZ29faWQGdWludDY0CHF1YW50aXR5BnVpbnQ2NDsAAFBRJypTMglhZGRtb2R1bGXHAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBhZGRtb2R1bGUKc3VtbWFyeTogJ0luc3RhbGwgYSBtb2R1bGUgaW50byBhIHNsb3QnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluc3RhbGwgYSBtb2R1bGUgZnJvbSBjYXJnbyBpbnRvIGEgbW9kdWxlIHNsb3Qgb24gYSBsaXZlIGVudGl0eSBvciBhIHBhY2tlZCBlbnRpdHkgaW4gY2FyZ28uIFRoZSBlbnRpdHkgbXVzdCBiZSBpZGxlIHdpdGggbm8gc2NoZWR1bGVkIHRhc2tzLiBUaGUgbW9kdWxlIHR5cGUgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHRhcmdldCBzbG90IHR5cGUuIFRoZSBtb2R1bGUgaXRlbSBpcyByZW1vdmVkIGZyb20gY2FyZ28gdXBvbiBpbnN0YWxsYXRpb24uAAAAWHc1UzIIYWRkbmV4dXOnAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBhZGRuZXh1cwpzdW1tYXJ5OiAnQWRkIGEgbmV4dXMgbG9jYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNyZWF0ZSBhIG5ldyBuZXh1cyBlbnRpdHkgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGVzLiBOZXh1c2VzIGFyZSBvd25lZCBieSB0aGUgY29udHJhY3QgYW5kIHNlcnZlIGFzIGZpeGVkIGdhdGhlcmluZyBwb2ludHMgd2hlcmUgcGxheWVycyBjYW4gd3JhcCwgdW53cmFwLCBkZXBsb3ksIGFuZCBvdGhlcndpc2UgaW50ZXJhY3Qgd2l0aCBORlQtYmFja2VkIGFzc2V0cy4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAAEChaXYyB2FkdmFuY2XTAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBhZHZhbmNlCnN1bW1hcnk6ICdBZHZhbmNlIHR1cm4nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkFkdmFuY2UgdGhlIGdhbWUgdG8gdGhlIG5leHQgdHVybi4AAAAAgDRVPAVibGVuZPwCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGJsZW5kCnN1bW1hcnk6ICdCbGVuZCBjYXJnbyBzdGFja3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNvbWJpbmUgbXVsdGlwbGUgY2FyZ28gc3RhY2tzIG9mIHRoZSBzYW1lIGl0ZW0gdHlwZSBpbnRvIGEgc2luZ2xlIHN0YWNrIHdpdGggbmV3IGJsZW5kZWQgc3RhdHMuIEFsbCBpbnB1dCBzdGFja3MgbXVzdCBzaGFyZSB0aGUgc2FtZSBpdGVtIGlkLiBUaGUgb3V0cHV0IHN0YWNrIGhhcyB0aGUgY29tYmluZWQgcXVhbnRpdHkgb2YgYWxsIGlucHV0cy4AAAAARIWmQQZjYW5jZWzCAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjYW5jZWwKc3VtbWFyeTogJ0NhbmNlbCBzY2hlZHVsZWQgdGFza3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbmNlbCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0YXNrcyBmcm9tIHRoZSBlbmQgb2YgYW4gZW50aXR5J3Mgc2NoZWR1bGUuIFRhc2tzIHRoYXQgYXJlIGltbXV0YWJsZSBhbmQgaW4gcHJvZ3Jlc3MgY2Fubm90IGJlIGNhbmNlbGxlZC5wVb4mY+lMRAxjbGFpbXN0YXJ0ZXKFBC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjbGFpbXN0YXJ0ZXIKc3VtbWFyeTogJ0RFQlVHOiBjbGFpbSBhIHN0YXJ0ZXIgc2hpcCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU3Bhd24gYSBwcmUta2l0dGVkIFQxIHN0YXJ0ZXIgc2hpcCBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMgZm9yIGEgcmVnaXN0ZXJlZCBwbGF5ZXIuIEF2YWlsYWJsZSBvbmx5IG9uIHRlc3QgZGVwbG95bWVudHMgd2hlcmUgbm8gaW4tZ2FtZSBzaGlwIGVjb25vbXkgeWV0IGV4aXN0cy4gUmVxdWlyZXMgdGhlIGNhbGxlciB0byBiZSBhIGpvaW5lZCBwbGF5ZXIgd2l0aCBubyBleGlzdGluZyBzaGlwczsgdGhlIHJlc3VsdGluZyBzaGlwIGlzIGZpdHRlZCB3aXRoIGEgZ2VuZXJhdG9yLCBlbmdpbmUsIGdhdGhlcmVyLCBjcmFmdGVyLCBhbmQgaGF1bGVyIG1vZHVsZS4AAKgb32lURAljbGVhbnJzdnDsAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjbGVhbnJzdnAKc3VtbWFyeTogJ0NsZWFuIHVwIHBhc3QgZXBvY2ggcmVzZXJ2ZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVyYXNlIHJlc2VydmUgdGFibGUgcm93cyBmcm9tIGEgcGFzdCBlcG9jaC4gQ2Fubm90IGNsZWFuIHRoZSBjdXJyZW50IG9yIGZ1dHVyZSBlcG9jaHMuIFRoZSBtYXhfcm93cyBwYXJhbWV0ZXIgY2FwcyB0aGUgbnVtYmVyIG9mIHJvd3MgZXJhc2VkIHBlciBjYWxsIHRvIGxpbWl0IENQVSB1c2FnZS4AgIrH5GtURApjbGVhcnRhYmxlvgEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xlYXJ0YWJsZQpzdW1tYXJ5OiAnREVCVUc6IGNsZWFydGFibGUgYWN0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAAAGQnJUUGY29tbWl07AEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY29tbWl0CnN1bW1hcnk6ICdTZXQgY29tbWl0IHZhbHVlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpTZXQgdGhlIGluaXRpYWwgY29tbWl0IHZhbHVlIGR1cmluZyBnYW1lIGluaXRpYWxpemF0aW9uLgAAYDQytyZFCWNvbmZpZ2xvZ90CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNvbmZpZ2xvZwpzdW1tYXJ5OiAnTG9nIGdhbWUgY29uZmlndXJhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIHRoYXQgbG9ncyB0aGUgY3VycmVudCBnYW1lIGNvbmZpZ3VyYXRpb24uIENhbGxlZCBpbmxpbmUgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gdG8gYnJvYWRjYXN0IGNvbmZpZyB2aWEgYWN0aW9uIHRyYWNlcy4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAAACAvMxFBWNyYWZ0yAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY3JhZnQKc3VtbWFyeTogJ0NyYWZ0IGl0ZW1zIGZyb20gYSByZWNpcGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRyYW5zZm9ybSBjYXJnbyBpdGVtcyBpbnRvIGEgbmV3IGl0ZW0gdXNpbmcgYSByZWNpcGUuIFRoZSBlbnRpdHkgbXVzdCBoYXZlIGEgY3JhZnRlciBtb2R1bGUgaW5zdGFsbGVkLiBDb25zdW1lcyBlbmVyZ3kgYW5kIHNjaGVkdWxlcyBhIGNyYWZ0aW5nIHRhc2sgd2l0aCBkdXJhdGlvbiBiYXNlZCBvbiB0b3RhbCBpbnB1dCBtYXNzIGFuZCBjcmFmdGVyIHNwZWVkLiBJbnB1dCBxdWFudGl0aWVzIG11c3QgZXhhY3RseSBtYXRjaCB0aGUgcmVjaXBlIHJlcXVpcmVtZW50cy7gs8tTqWzURQxjcmVhdGVlbnRpdHm/AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjcmVhdGVlbnRpdHkKc3VtbWFyeTogJ0RFQlVHOiBjcmVhdGUgYW4gZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAAAHgaq0oGZGVwbG957AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZGVwbG95CnN1bW1hcnk6ICdEZXBsb3kgYSBwYWNrZWQgZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpVbnBhY2sgYSBwYWNrZWQgZW50aXR5IGl0ZW0gKHBhY2tlZCBzaGlwIG9yIHBhY2tlZCBjb250YWluZXIpIGZyb20gY2FyZ28sIHNjaGVkdWxpbmcgYSBkZXBsb3kgdGFzayB0aGF0IGNyZWF0ZXMgdGhlIG5ldyBlbnRpdHkgYXQgdGhlIGRlcGxveWluZyBlbnRpdHkncyBsb2NhdGlvbiB1cG9uIHJlc29sdXRpb24uAIDPLk+FsEoKZGVzY2VudGl0eckDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGRlc2NlbnRpdHkKc3VtbWFyeTogJ0Rlc2NyaWJlIGEgcGFja2VkIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzdHJpbmcgZm9yIGEgcGFja2VkIGVudGl0eSwgZGVyaXZlZCBmcm9tIHRoZSBlbnRpdHkgaXRlbSBpZCwgaHVsbCBzdGF0cywgYW5kIHRoZSBsaXN0IG9mIGluc3RhbGxlZCBtb2R1bGUgaXRlbSBpZHMgYW5kIHN0YXRzLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIGFuZCBORlQgcmVuZGVyZXJzIHRvIGRpc3BsYXkgcGFja2VkIGVudGl0aWVzLgAAAACoeMxUBmVuYWJsZd0BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZQpzdW1tYXJ5OiAnU2V0IGVuYWJsZWQgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZ2FtZSBvZiBTaGlwbG9hZC4AAAAAXNWyYQZnYXRoZXKXAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnYXRoZXIKc3VtbWFyeTogJ0dhdGhlciByZXNvdXJjZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkdhdGhlciByZXNvdXJjZXMgYXQgdGhlIHNoaXAncyBjdXJyZW50IGxvY2F0aW9uLiBPbmx5IHdvcmtzIGF0IGdhdGhlcmFibGUgbG9jYXRpb24gdHlwZXMuIFNjaGVkdWxlcyBhIGdhdGhlciB0YXNrIHRoYXQgY29uc3VtZXMgZW5lcmd5IGFuZCB5aWVsZHMgY2FyZ28gYmFzZWQgb24gdGhlIHNoaXAncyBnYXRoZXJlciBzdGF0cyBhbmQgdGhlIGxvY2F0aW9uJ3MgcmVzb3VyY2UgY29tcG9zaXRpb24uAABgbk2KsmIJZ2V0Y29uZmlnygItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0Y29uZmlnCnN1bW1hcnk6ICdHZXQgZ2FtZSBjb25maWd1cmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHRoZSBnYW1lIGNvbmZpZ3VyYXRpb24gaW5jbHVkaW5nIGRlZmF1bHQgZW50aXR5IHN0YXRzIGZvciB3YXJlaG91c2VzIGFuZCBjb250YWluZXJzLCBhbmQgdGhlIGZ1bGwgaXRlbSBkZWZpbml0aW9ucyB0YWJsZS4AsHLZ5amyYgtnZXRlbnRpdGllc6QCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0aWVzCnN1bW1hcnk6ICdHZXQgYWxsIGVudGl0aWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBmdWxsIGVudGl0eSBpbmZvIGZvciBhbGwgZW50aXRpZXMgb3duZWQgYnkgYSBwbGF5ZXIuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgAA8NnlqbJiCWdldGVudGl0eaICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0eQpzdW1tYXJ5OiAnR2V0IGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbiBlbnRpdHkgaW5jbHVkaW5nIGlkZW50aXR5LCBjYXJnbywgc2NoZWR1bGUgc3RhdGUsIGFuZCB0eXBlLXNwZWNpZmljIGZpZWxkcy4ATDZJquyyYgtnZXRpdGVtZGF0YagDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1kYXRhCnN1bW1hcnk6ICdHZXQgZnVsbCBpdGVtIGNhdGFsb2cnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBjb21wbGV0ZSBpdGVtIGNhdGFsb2cgYXMgdGhlIGNvbnRyYWN0IHNlZXMgaXQsIGluY2x1ZGluZyB0eXBlLCBzdWJ0eXBlLCB0aWVyLCBtYXNzLCBhbmQgb3RoZXIgc3RhdGljIG1ldGFkYXRhLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIGFuZCBjbGllbnRzIHRvIG1pcnJvciB0aGUgY29udHJhY3QncyBpdGVtIGRlZmluaXRpb25zLgAATk6q7LJiCmdldGl0ZW1pZHOGAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRpdGVtaWRzCnN1bW1hcnk6ICdHZXQgaXRlbSBpZCB0byBuYW1lIG1hcHBpbmdzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBtYXBwaW5nIG9mIGl0ZW0gaWQgY29uc3RhbnRzIHRvIHRoZWlyIGNhbm9uaWNhbCBzdHJpbmcgbmFtZXMuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gcmVzb2x2ZSBudW1lcmljIGl0ZW0gaWRzIHRvIGh1bWFuLXJlYWRhYmxlIGlkZW50aWZpZXJzLgAAAFiq7LJiCGdldGl0ZW1zmgItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbXMKc3VtbWFyeTogJ0dldCBhbGwgYXZhaWxhYmxlIGl0ZW1zJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGEgbGlzdCBvZiBhbGwgaXRlbXMgaW4gdGhlIGdhbWUgaW5jbHVkaW5nIHRoZWlyIGlkLCBiYXNlIHByaWNlLCBhbmQgbWFzcy6AVfVZquyyYgxnZXRpdGVtdHlwZXOIAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRpdGVtdHlwZXMKc3VtbWFyeTogJ0dldCBpdGVtIHR5cGUgZW51bSB2YWx1ZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBmdWxsIHNldCBvZiBpdGVtIHR5cGUgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAocmVzb3VyY2UsIGNvbXBvbmVudCwgbW9kdWxlLCBlbnRpdHkpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRlY29kZSBpdGVtIHR5cGUgaWRlbnRpZmllcnMuACZ12SAas2ILZ2V0bG9jYXRpb27iAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NhdGlvbgpzdW1tYXJ5OiAnR2V0IGxvY2F0aW9uIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgbG9jYXRpb24gaW5jbHVkaW5nIHdoZXRoZXIgYSBzeXN0ZW0gZXhpc3RzLCBhbmQgZm9yIGVhY2ggaXRlbTogcHJpY2UsIHN1cHBseSwgcmFyaXR5IG11bHRpcGxpZXIsIGFuZCBsb2NhdGlvbiBtdWx0aXBsaWVyLgCAySYhGrNiCmdldGxvY2RhdGH+Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NkYXRhCnN1bW1hcnk6ICdHZXQgZGVyaXZlZCBsb2NhdGlvbiBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGRlcml2ZWQgbG9jYXRpb24gZGF0YSBpbmNsdWRpbmcgc3RhdGljIHByb3BlcnRpZXMgKHR5cGUsIGRpZmZpY3VsdHksIHNlZWRzKSBmcm9tIHRoZSBnYW1lIHNlZWQgYW5kIGVwb2NoLXNwZWNpZmljIHByb3BlcnRpZXMgKGFjdGl2ZSwgc2VlZHMpIGZyb20gdGhlIGN1cnJlbnQgZXBvY2ggc2VlZC4AsKo+JyqzYgtnZXRtb2R0eXBlc9YDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG1vZHR5cGVzCnN1bW1hcnk6ICdHZXQgbW9kdWxlIHR5cGUgZW51bSB2YWx1ZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBmdWxsIHNldCBvZiBtb2R1bGUgdHlwZSBlbnVtIHZhbHVlcyBhbmQgdGhlaXIgc3RyaW5nIG5hbWVzIChhbnksIGVuZ2luZSwgZ2VuZXJhdG9yLCBnYXRoZXJlciwgbG9hZGVyLCB3YXJwLCBjcmFmdGVyLCBsYXVuY2hlciwgc3RvcmFnZSwgaGF1bGVyKS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgbW9kdWxlIHN1YnR5cGUgaWRlbnRpZmllcnMgYW5kIHNsb3QgY29tcGF0aWJpbGl0eS4AAFZRJyqzYgpnZXRtb2R1bGVzgAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bW9kdWxlcwpzdW1tYXJ5OiAnR2V0IGFsbCBtb2R1bGUgaXRlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBzdWJzZXQgb2YgaXRlbXMgY2xhc3NpZmllZCBhcyBtb2R1bGVzLCBpbmNsdWRpbmcgZWFjaCBtb2R1bGUncyBpZCwgbWFzcywgc3VidHlwZSwgYW5kIHRpZXIuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZW51bWVyYXRlIGluc3RhbGxhYmxlIGVxdWlwbWVudC4AAPDnGjWzYglnZXRuZWFyYnneAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRuZWFyYnkKc3VtbWFyeTogJ0dldCBuZWFyYnkgcmVhY2hhYmxlIHN5c3RlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgbmVhcmJ5IHN5c3RlbXMgcmVhY2hhYmxlIGJ5IGFuIGVudGl0eSBmcm9tIGl0cyBwcm9qZWN0ZWQgbG9jYXRpb24uIFJldHVybnMgY3VycmVudCBzdGF0ZSAod2l0aCBjb21wbGV0ZWQgdGFza3MgcmVzb2x2ZWQpLCBwcm9qZWN0ZWQgc3RhdGUgKGFmdGVyIGFsbCBzY2hlZHVsZWQgdGFza3MpLCBhbmQgYSBsaXN0IG9mIHJlYWNoYWJsZSBzeXN0ZW1zIHdpdGggZGlzdGFuY2UsIGVuZXJneSBjb3N0LCBmbGlnaHQgdGltZSwgYW5kIG1hcmtldCBpbmZvcm1hdGlvbi4AAF3T5TWzYgpnZXRuZnRpbmZv8AMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bmZ0aW5mbwpzdW1tYXJ5OiAnR2V0IE5GVCBzY2hlbWEgYW5kIHRlbXBsYXRlIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBmdWxsIHNldCBvZiBBdG9taWNBc3NldHMgc2NoZW1hcyBhbmQgdGVtcGxhdGVzIHRoZSBnYW1lIGNvbnRyYWN0IGV4cGVjdHMsIHBsdXMgdGhlIGN1cnJlbnQgYGl0ZW1faWQg4oaSICh0ZW1wbGF0ZV9pZCwgc2NoZW1hX25hbWUpYCBtYXBwaW5nIHN0b3JlZCBpbiB0aGUgYG5mdGNvbmZpZ2AgdGFibGUuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gc3luYyBhdG9taWNhc3NldHMgc3RhdGUgd2l0aCB0aGUgY29udHJhY3QuAAC4yptYs2IJZ2V0cGxheWVy/QItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cGxheWVyCnN1bW1hcnk6ICdHZXQgcGxheWVyIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgcGxheWVyIGluY2x1ZGluZyBiYWxhbmNlLCBkZWJ0LCBuZXR3b3J0aCwgZW50aXR5IGNvdW50cywgYW5kIHByaWNpbmcgZm9yIG5leHQgcHVyY2hhc2VzLiBSZXR1cm5zIGlzX3BsYXllcj1mYWxzZSBpZiB0aGUgYWNjb3VudCBoYXMgbm90IGpvaW5lZCB0aGUgZ2FtZS4AAFDVIXWzYglnZXRyZWNpcGWmAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRyZWNpcGUKc3VtbWFyeTogJ0dldCBhIHNpbmdsZSBjcmFmdGluZyByZWNpcGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSByZWNpcGUgd2hvc2Ugb3V0cHV0IG1hdGNoZXMgdGhlIGdpdmVuIGl0ZW0gaWQsIGluY2x1ZGluZyBpdHMgaW5wdXRzLCBibGVuZCB3ZWlnaHRzLCBzdGF0IHNsb3RzLCBhbmQgcmVzb2x2ZWQgaXRlbSBtYXNzIGluZm8uIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZGlzcGxheSBjcmFmdGluZyByZXF1aXJlbWVudHMuAABW1SF1s2IKZ2V0cmVjaXBlc6wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlY2lwZXMKc3VtbWFyeTogJ0xpc3QgY3JhZnRpbmcgcmVjaXBlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBwYWdpbmF0ZWQgbGlzdCBvZiBjcmFmdGluZyByZWNpcGVzIHN0YXJ0aW5nIGF0IHRoZSBwcm92aWRlZCBsb3dlciBib3VuZCBvdXRwdXQgaXRlbSBpZCwgdXAgdG8gdGhlIHNwZWNpZmllZCBsaW1pdC4gRWFjaCBlbnRyeSBpbmNsdWRlcyBpbnB1dHMsIGJsZW5kIHdlaWdodHMsIHN0YXQgc2xvdHMsIGFuZCByZXNvbHZlZCBpdGVtIG1hc3MgaW5mby4AAM4GYXWzYgpnZXRyZXNjYXRzngMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cmVzY2F0cwpzdW1tYXJ5OiAnR2V0IHJlc291cmNlIGNhdGVnb3J5IGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgcmVzb3VyY2UgY2F0ZWdvcnkgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAob3JlLCBnYXMsIHJlZ29saXRoLCBiaW9tYXNzLCBjcnlzdGFsKS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgcmVzb3VyY2Ugc3VidHlwZSBpZGVudGlmaWVycy4AsNpXYXWzYgtnZXRyZXNlcnZlcwCAFbqaYnWzYgxnZXRyZXNvdXJjZXOHAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRyZXNvdXJjZXMKc3VtbWFyeTogJ0dldCBhbGwgcmVzb3VyY2UgaXRlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBzdWJzZXQgb2YgaXRlbXMgY2xhc3NpZmllZCBhcyByZXNvdXJjZXMsIGluY2x1ZGluZyBlYWNoIHJlc291cmNlJ3MgaWQsIG1hc3MsIHN1YnR5cGUsIGFuZCB0aWVyLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGVudW1lcmF0ZSBnYXRoZXJhYmxlIG1hdGVyaWFscy4AAAA404izYghnZXRzbG90c7sDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHNsb3RzCnN1bW1hcnk6ICdHZXQgZW50aXR5IHNsb3QgbGF5b3V0cycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIG1vZHVsZSBzbG90IGxheW91dCBmb3IgZXZlcnkgZW50aXR5IGl0ZW0gdHlwZSwgbGlzdGluZyB0aGUgb3JkZXJlZCBzbG90IHR5cGVzIGF2YWlsYWJsZSBmb3IgbW9kdWxlIGluc3RhbGxhdGlvbi4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZXRlcm1pbmUgd2hpY2ggbW9kdWxlIHR5cGVzIGFyZSBjb21wYXRpYmxlIHdpdGggYSBnaXZlbiBlbnRpdHkgaHVsbC4AgNTZ3IyzYgpnZXRzdHJhdHVt0gItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c3RyYXR1bQpzdW1tYXJ5OiAnR2V0IHJlc291cmNlIHN0cmF0dW0gZGF0YScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyByZXNvdXJjZSBzdHJhdHVtIGRhdGEgZm9yIGEgc3BlY2lmaWMgZGVwdGggbGF5ZXIgYXQgYSBjb29yZGluYXRlLCBpbmNsdWRpbmcgdGhlIHN0cmF0dW0gc2VlZCBpbmZvIGFuZCBkZXJpdmVkIHJlc291cmNlIHN0YXRzLoCVu0ZKjbNiDGdldHN1bW1hcmllc+gCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHN1bW1hcmllcwpzdW1tYXJ5OiAnR2V0IGVudGl0eSBzdW1tYXJpZXMgZm9yIGEgcGxheWVyJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZXR1cm5zIGxpZ2h0d2VpZ2h0IHN1bW1hcmllcyBvZiBhbGwgZW50aXRpZXMgb3duZWQgYnkgYSBwbGF5ZXIgaW5jbHVkaW5nIHR5cGUsIGlkLCBvd25lciwgbmFtZSwgbG9jYXRpb24sIGFuZCBpZGxlIHN0YXR1cy4gT3B0aW9uYWxseSBmaWx0ZXIgYnkgZW50aXR5IHR5cGUuAKLa5uaq6WULZ3JvdXB0cmF2ZWyaBC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBncm91cHRyYXZlbApzdW1tYXJ5OiAnTW92ZSBtdWx0aXBsZSBlbnRpdGllcyB0b2dldGhlcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5pdGlhdGUgZ3JvdXAgdHJhdmVsIGZvciBtdWx0aXBsZSBlbnRpdGllcyB0byBhIGRlc3RpbmF0aW9uLiBBbGwgZW50aXRpZXMgbXVzdCBiZSBhdCB0aGUgc2FtZSBsb2NhdGlvbiBhbmQgb3duZWQgYnkgdGhlIGNhbGxlci4gQXQgbGVhc3Qgb25lIGVudGl0eSB3aXRoIGVuZ2luZXMgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aHJ1c3QuIEZsaWdodCBkdXJhdGlvbiBpcyBjYWxjdWxhdGVkIGZyb20gY29tYmluZWQgdGhydXN0IGFuZCB0b3RhbCBtYXNzIG9mIGFsbCBlbnRpdGllcy4gQ3JlYXRlcyBhbiBlbnRpdHlncm91cCBmb3IgYXRvbWljIHJlc29sdXRpb24gYW5kIGNhbmNlbGxhdGlvbi4AAAAAANCwaQRoYXNo+AEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogaGFzaApzdW1tYXJ5OiAnQ2FsY3VsYXRlIHNoYTI1NiBoYXNoJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDYWxjdWxhdGVzIHRoZSBzaGEyNTYgaGFzaCBvZiBhIHN0cmluZyBiYXNlZCB1c2luZyB0aGUgZ2FtZSBzZWVkLgAAAECE0rBpB2hhc2g1MTL7AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBoYXNoNTEyCnN1bW1hcnk6ICdDYWxjdWxhdGUgc2hhNTEyIGhhc2gnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbGN1bGF0ZXMgdGhlIHNoYTUxMiBoYXNoIG9mIGEgc3RyaW5nIGJhc2VkIHVzaW5nIHRoZSBnYW1lIHNlZWQuAAAAAACQ3XQEaW5pdPoBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGluaXQKc3VtbWFyeTogJ0luaXRpYWxpemUgZ2FtZSBzZWVkJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbml0aWFsaXplIGEgdGhlIGdhbWVzIHNlZWQgYW5kIHNlZWQgdmFsdWVzIHRvIGJvb3RzdHJhcCBnYW1lIHN0YXRlLgAAAAAAMB19BGpvaW7EAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBqb2luCnN1bW1hcnk6ICdKb2luIGEgZ2FtZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSm9pbiBhIGdhbWUgb2YgU2hpcGxvYWQAAAAA+OUynQZub3RpZnmKAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBub3RpZnkKc3VtbWFyeTogJ1Rhc2sgbGlmZWN5Y2xlIG5vdGlmaWNhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIHRoYXQgbm90aWZpZXMgZW50aXR5IG93bmVycyBvZiB0YXNrIGxpZmVjeWNsZSBldmVudHMgKHJlc29sdmVkLCBjYW5jZWxsZWQpLiBDYWxsZWQgaW5saW5lIHdoZW4gdGFza3MgY2hhbmdlIHN0YXRlLiBVc2VzIHJlcXVpcmVfcmVjaXBpZW50IHRvIGVuYWJsZSBvZmYtY2hhaW4gbW9uaXRvcmluZyB2aWEgYWN0aW9uIHRyYWNlcy4AAACKXdOQughyZWNoYXJnZc0CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJlY2hhcmdlCnN1bW1hcnk6ICdSZWNoYXJnZSBzaGlwIGVuZXJneScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2NoZWR1bGUgYSByZWNoYXJnZSB0YXNrIGZvciBhbiBlbnRpdHkgdG8gcmVzdG9yZSBlbmVyZ3kgdG8gZnVsbCBjYXBhY2l0eS4gVGhlIHJlY2hhcmdlIGR1cmF0aW9uIGRlcGVuZHMgb24gY3VycmVudCBlbmVyZ3kgbGV2ZWwgYW5kIHJlY2hhcmdlIHJhdGUuAAAAQO1IsboHcmVzb2x2ZdADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJlc29sdmUKc3VtbWFyeTogJ0NvbXBsZXRlIHNjaGVkdWxlZCB0YXNrcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmVzb2x2ZSBjb21wbGV0ZWQgdGFza3MgaW4gYW4gZW50aXR5J3Mgc2NoZWR1bGUsIGFwcGx5aW5nIHRoZWlyIGVmZmVjdHMgKHJlY2hhcmdlIGVuZXJneSwgdXBkYXRlIGxvY2F0aW9uLCBsb2FkL3VubG9hZCBjYXJnbykuIElmIGNvdW50IGlzIHNwZWNpZmllZCwgcmVzb2x2ZSBleGFjdGx5IHRoYXQgbWFueSB0YXNrczsgb3RoZXJ3aXNlIHJlc29sdmUgYWxsIGNvbXBsZXRlZCB0YXNrcy4gRmFpbHMgaWYgY291bnQgZXhjZWVkcyB0aGUgbnVtYmVyIG9mIGNvbXBsZXRlZCB0YXNrcy4AAAAq6kSlvAhybW1vZHVsZbwDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJtbW9kdWxlCnN1bW1hcnk6ICdSZW1vdmUgYSBtb2R1bGUgZnJvbSBhIHNsb3QnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlbW92ZSBhbiBpbnN0YWxsZWQgbW9kdWxlIGZyb20gYSBzbG90IG9uIGEgbGl2ZSBlbnRpdHkgb3IgYSBwYWNrZWQgZW50aXR5IGluIGNhcmdvLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIG5vIHNjaGVkdWxlZCB0YXNrcy4gVGhlIG1vZHVsZSBpcyByZXR1cm5lZCB0byBjYXJnby4gRmFpbHMgaWYgdGhlIGVudGl0eSBkb2VzIG5vdCBoYXZlIGVub3VnaCBjYXJnbyBjYXBhY2l0eSB0byBob2xkIHRoZSByZXR1cm5lZCBtb2R1bGUuAAAAbKG8prwIcm1uZnRjZmehAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBybW5mdGNmZwpzdW1tYXJ5OiAnUmVtb3ZlIE5GVCB0ZW1wbGF0ZSBtYXBwaW5nIGZvciBhbiBpdGVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZW1vdmUgdGhlIEF0b21pY0Fzc2V0cyB0ZW1wbGF0ZSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gaWQgZnJvbSB0aGUgYG5mdGNvbmZpZ2AgdGFibGUuIEFmdGVyIHJlbW92YWwgdGhlIGl0ZW0gY2FuIG5vIGxvbmdlciBiZSB3cmFwcGVkIG9yIHVud3JhcHBlZCB1bnRpbCBhIG5ldyBtYXBwaW5nIGlzIHNldC4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAAAAAkKPBBHNhbHTYAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzYWx0CnN1bW1hcnk6ICdBcHBlbmQgU2FsdCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQWRkIGFkZGl0aW9uYWwgc2FsdCB0byB0aGUgbmV4dCBlcG9jaCBzZWVkLgAAYAvlNbPCCXNldG5mdGNmZ8QDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNldG5mdGNmZwpzdW1tYXJ5OiAnU2V0IE5GVCB0ZW1wbGF0ZSBtYXBwaW5nIGZvciBhbiBpdGVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpCaW5kIGFuIGl0ZW0gaWQgdG8gYW4gQXRvbWljQXNzZXRzIHRlbXBsYXRlIGlkIGFuZCBzY2hlbWEgbmFtZS4gVXNlZCB0byBjb25maWd1cmUgaG93IHRoZSBjb250cmFjdCBtaW50cyBhbmQgcmVjb2duaXplcyBORlRzIGZvciBhIGdpdmVuIGl0ZW0uIEluc2VydHMgYSBuZXcgbWFwcGluZyBpZiBvbmUgZG9lcyBub3QgZXhpc3QsIG9yIHVwZGF0ZXMgdGhlIGV4aXN0aW5nIG1hcHBpbmcuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAGXXoMlNxQpzcGF3bmNhcmdvxQEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc3Bhd25jYXJnbwpzdW1tYXJ5OiAnREVCVUc6IHNwYXduIGNhcmdvIG9uIGFuIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQCSgsjUyU3FC3NwYXducGFja2Vk5wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc3Bhd25wYWNrZWQKc3VtbWFyeTogJ0RFQlVHOiBzcGF3biBhIHBhY2tlZCBlbnRpdHkgd2l0aCBpbnN0YWxsZWQgbW9kdWxlcyBvbiBhbiBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AkkpK4clNxQtzcGF3bnNlZWRlZM0BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNwYXduc2VlZGVkCnN1bW1hcnk6ICdERUJVRzogc3Bhd24gc2VlZGVkIGNhcmdvIG9uIGFuIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAFctPM3NCHRyYW5zZmVyyAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdHJhbnNmZXIKc3VtbWFyeTogJ1RyYW5zZmVyIGNhcmdvIGJldHdlZW4gZW50aXRpZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRyYW5zZmVyIGNhcmdvIGJldHdlZW4gdHdvIGVudGl0aWVzIGF0IHRoZSBzYW1lIGxvY2F0aW9uLiBCb3RoIGVudGl0aWVzIG11c3QgYmUgb3duZWQgYnkgdGhlIGNhbGxlciBhbmQgYXQgbGVhc3Qgb25lIG11c3QgaGF2ZSBsb2FkZXJzLiBDcmVhdGVzIGxvYWQgYW5kIHVubG9hZCB0YXNrcyBvbiBib3RoIGVudGl0aWVzIHdpdGggZHVyYXRpb24gYmFzZWQgb24gY29tYmluZWQgbG9hZGVyIGNhcGFjaXR5IGFuZCBaLWRpc3RhbmNlIGJldHdlZW4gdGhlbS4AAAAARLXNzQZ0cmF2ZWz7AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB0cmF2ZWwKc3VtbWFyeTogJ01vdmUgYSBzaGlwJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbml0aWF0ZSB0cmF2ZWwgb2YgYW4gZW50aXR5IGZyb20gaXRzIGN1cnJlbnQgbG9jYXRpb24gdG8gYSBuZXcgZGVzdGluYXRpb24uAAAAAABQr+EEd2FycJ8DLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdhcnAKc3VtbWFyeTogJ1dhcnAgdG8gYSBkZXN0aW5hdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5zdGFudGx5IHRlbGVwb3J0IGFuIGVudGl0eSB0byBhIGRlc3RpbmF0aW9uIHN5c3RlbS4gUmVxdWlyZXMgd2FycCBjYXBhYmlsaXR5LCBmdWxsIGVuZXJneSwgZW1wdHkgY2FyZ28sIGFuZCBhbiBlbXB0eSBzY2hlZHVsZS4gVGhlIGRlc3RpbmF0aW9uIG11c3QgYmUgYSB2YWxpZCBzeXN0ZW0gd2l0aGluIHdhcnAgcmFuZ2UuIFJlc29sdmVzIGltbWVkaWF0ZWx5IGFzIGEgemVyby1kdXJhdGlvbiB0YXNrLgAAAAAAoKrjBHdpcGWyAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3aXBlCnN1bW1hcnk6ICdERUJVRzogd2lwZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS2g0FTaKqyq4wx3aXBlc2VxdWVuY2XCAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3aXBlc2VxdWVuY2UKc3VtbWFyeTogJ0RFQlVHOiB3aXBlc2VxdWVuY2UgYWN0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAAAABQzeUEd3JhcP4DLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdyYXAKc3VtbWFyeTogJ1dyYXAgY2FyZ28gaW50byBhbiBORlQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCldyYXAgYSBxdWFudGl0eSBvZiBjYXJnbyBmcm9tIGFuIGVudGl0eSBpbnRvIGFuIEF0b21pY0Fzc2V0cyBORlQgbWludGVkIHRvIHRoZSBzcGVjaWZpZWQgb3duZXIuIFRoZSBlbnRpdHkgbXVzdCBiZSBhdCBhIG5leHVzLCBoYXZlIGxvYWRlcnMsIGFuZCBjb250YWluIGVub3VnaCBvZiB0aGUgcmVxdWVzdGVkIGNhcmdvLiBTY2hlZHVsZXMgYSB3cmFwIHRhc2sgdGhhdCwgb24gcmVzb2x1dGlvbiwgcmVtb3ZlcyB0aGUgY2FyZ28gZnJvbSB0aGUgZW50aXR5IGFuZCBtaW50cyB0aGUgTkZUIHVzaW5nIHRoZSB0ZW1wbGF0ZSBjb25maWd1cmVkIGZvciB0aGF0IGl0ZW0gaWQuDQAAAAAAyq5BA2k2NAAACWNhcmdvX3JvdwAAuGo6kydFA2k2NAAADWNvbnRhaW5lcl9yb3cAqqaX+ezyVANpNjQAAA9lbnRpdHlncm91cF9yb3cAAACTumwQjQNpNjQAAAxsb2NhdGlvbl9yb3cAAAAAAKy7mgNpNjQAAAluZXh1c19yb3cAAGBuTYrymgNpNjQAAA1uZnRjb25maWdfcm93AAAAAFzlTawDaTY0AAAKcGxheWVyX3JvdwAAAEDtq7C6A2k2NAAAC3Jlc2VydmVfcm93AAAACk2lrcIDaTY0AAAMc2VxdWVuY2Vfcm93AAAAAABQXcMDaTY0AAAIc2hpcF9yb3cAAAAAAJVNxgNpNjQAAAlzdGF0ZV9yb3cAAAAAAKyqzwNpNjQAAAl0eXBlc19yb3cAAFBY06au4QNpNjQAAA13YXJlaG91c2Vfcm93ARFTaGlwbG9hZCAoU2VydmVyKRFTaGlwbG9hZCAoU2VydmVyKQAAACQAAAAARIWmQQ5jYW5jZWxfcmVzdWx0cwAAAACAvMxFDHRhc2tfcmVzdWx0cwAAAAB4GqtKDHRhc2tfcmVzdWx0cwCAzy5PhbBKBnN0cmluZwAAAABc1bJhDHRhc2tfcmVzdWx0cwAAYG5NirJiC2dhbWVfY29uZmlnALBy2eWpsmINZW50aXR5X2luZm9bXQAA8NnlqbJiC2VudGl0eV9pbmZvAEw2SarssmIPaXRlbWRhdGFfcmVzdWx0AABOTqrssmIPaXRlbV9pZHNfcmVzdWx0AAAAWKrssmIKaXRlbXNfaW5mb4BV9Vmq7LJiC2VudW1fcmVzdWx0ACZ12SAas2INbG9jYXRpb25faW5mbwCAySYhGrNiEGxvY2F0aW9uX2Rlcml2ZWQAsKo+JyqzYgtlbnVtX3Jlc3VsdAAAVlEnKrNiDm1vZHVsZXNfcmVzdWx0AADw5xo1s2ILbmVhcmJ5X2luZm8AAF3T5TWzYg5uZnRpbmZvX3Jlc3VsdAAAuMqbWLNiC3BsYXllcl9pbmZvAABQ1SF1s2IOcmVjaXBlc19yZXN1bHQAAFbVIXWzYg5yZWNpcGVzX3Jlc3VsdAAAzgZhdbNiC2VudW1fcmVzdWx0ALDaV2F1s2ITc3RyYXR1bV9yZW1haW5pbmdbXYAVuppidbNiEHJlc291cmNlc19yZXN1bHQAAAA404izYhVlbnRpdHlfbGF5b3V0c19yZXN1bHQAgNTZ3IyzYgxzdHJhdHVtX2RhdGGAlbtGSo2zYhBlbnRpdHlfc3VtbWFyeVtdAKLa5uaq6WUMdGFza19yZXN1bHRzAAAAAADQsGkLY2hlY2tzdW0yNTYAAABAhNKwaQtjaGVja3N1bTUxMgAAAIpd05C6DHRhc2tfcmVzdWx0cwAAAEDtSLG6D3Jlc29sdmVfcmVzdWx0cwAAAFctPM3NDHRhc2tfcmVzdWx0cwAAAABEtc3NDHRhc2tfcmVzdWx0cwAAAAAAUK/hDHRhc2tfcmVzdWx0cwAAAAAAUM3lDHRhc2tfcmVzdWx0cw==');
220
+ const abiBlob = Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDiFAQlhZGRtb2R1bGUABAllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OAptb2R1bGVfcmVmCWNhcmdvX3JlZgp0YXJnZXRfcmVmCmNhcmdvX3JlZj8IYWRkbmV4dXMAAwpuZXh1c19uYW1lBnN0cmluZwF4BWludDY0AXkFaW50NjQHYWR2YW5jZQACBnJldmVhbAZzdHJpbmcGY29tbWl0C2NoZWNrc3VtMjU2BWJsZW5kAAICaWQGdWludDY0BmlucHV0cwxjYXJnb19pdGVtW10GY2FuY2VsAAICaWQGdWludDY0BWNvdW50BnVpbnQ2NA5jYW5jZWxfcmVzdWx0cwAGCWVudGl0eV9pZAZ1aW50NjQLZW50aXR5X3R5cGUEbmFtZQ9jYW5jZWxsZWRfY291bnQFdWludDgQc2NoZWR1bGVfc3RhcnRlZAt0aW1lX3BvaW50PwtlbnRpdHlncm91cAd1aW50NjQ/DWdyb3VwX21lbWJlcnMWQl92ZWN0b3JfZW50aXR5X3JlZl9FPwpjYXJnb19pdGVtAAQHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0B21vZHVsZXMObW9kdWxlX2VudHJ5W10IcXVhbnRpdHkGdWludDMyCWNhcmdvX3JlZgADB2l0ZW1faWQGdWludDE2BXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCWNhcmdvX3JvdwAGAmlkBnVpbnQ2NAllbnRpdHlfaWQGdWludDY0B2l0ZW1faWQGdWludDY0CHF1YW50aXR5BnVpbnQ2NAVzdGF0cwZ1aW50NjQHbW9kdWxlcw5tb2R1bGVfZW50cnlbXQpjYXJnb192aWV3AAUHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0B21vZHVsZXMObW9kdWxlX2VudHJ5W10IcXVhbnRpdHkGdWludDMyAmlkBnVpbnQ2NAxjbGFpbXN0YXJ0ZXIAAwdhY2NvdW50BG5hbWUBeAVpbnQ2NAF5BWludDY0CWNsZWFucnN2cAACBWVwb2NoBnVpbnQ2NAhtYXhfcm93cwZ1aW50NjQKY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/BmNvbW1pdAABBmNvbW1pdAtjaGVja3N1bTI1Ngljb25maWdsb2cAAQZjb25maWcLZ2FtZV9jb25maWcLY29vcmRpbmF0ZXMAAwF4BWludDY0AXkFaW50NjQBegd1aW50MTY/BWNyYWZ0AAQCaWQGdWludDY0CXJlY2lwZV9pZAZ1aW50MTYIcXVhbnRpdHkGdWludDMyBmlucHV0cwxjYXJnb19pdGVtW10NY3JhZnRlcl9zdGF0cwACBXNwZWVkBnVpbnQxNgVkcmFpbgZ1aW50MTYMY3JlYXRlZW50aXR5AAUFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQRuYW1lC2VudGl0eV9uYW1lBnN0cmluZwF4BWludDY0AXkFaW50NjQIZGVtb2xpc2gAAQllbnRpdHlfaWQGdWludDY0BmRlcGxveQACAmlkBnVpbnQ2NANyZWYJY2FyZ29fcmVmCmRlc2NlbnRpdHkABAdpdGVtX2lkBnVpbnQxNgpodWxsX3N0YXRzBnVpbnQ2NAxtb2R1bGVfaXRlbXMIdWludDE2W10MbW9kdWxlX3N0YXRzCHVpbnQ2NFtdBmVuYWJsZQABB2VuYWJsZWQEYm9vbAxlbmVyZ3lfc3RhdHMAAghjYXBhY2l0eQZ1aW50MTYIcmVjaGFyZ2UGdWludDE2FGVudGl0eV9jdXJyZW50X3N0YXRlAAILY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMGZW5lcmd5BnVpbnQxNg9lbnRpdHlfZGVmYXVsdHMAAgt3YXJlaG91c2VfegZ1aW50MTYLY29udGFpbmVyX3oGdWludDE2C2VudGl0eV9pbmZvABkEdHlwZQRuYW1lAmlkBnVpbnQ2NAVvd25lcgRuYW1lC2VudGl0eV9uYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcwljYXJnb21hc3MGdWludDMyBWNhcmdvDGNhcmdvX3ZpZXdbXQdsb2FkZXJzDWxvYWRlcl9zdGF0cz8HbW9kdWxlcw5tb2R1bGVfZW50cnlbXQZlbmVyZ3kHdWludDE2PwhodWxsbWFzcwd1aW50MzI/B2VuZ2luZXMPbW92ZW1lbnRfc3RhdHM/CWdlbmVyYXRvcg1lbmVyZ3lfc3RhdHM/CGNhcGFjaXR5B3VpbnQzMj8IZ2F0aGVyZXIPZ2F0aGVyZXJfc3RhdHM/BmhhdWxlcg1oYXVsZXJfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8HY3JhZnRlcg5jcmFmdGVyX3N0YXRzPwdpc19pZGxlBGJvb2wMY3VycmVudF90YXNrBXRhc2s/FGN1cnJlbnRfdGFza19lbGFwc2VkBnVpbnQzMhZjdXJyZW50X3Rhc2tfcmVtYWluaW5nBnVpbnQzMg1wZW5kaW5nX3Rhc2tzBnRhc2tbXQdpZGxlX2F0C3RpbWVfcG9pbnQ/CHNjaGVkdWxlCXNjaGVkdWxlPw1lbnRpdHlfbGF5b3V0AAIOZW50aXR5X2l0ZW1faWQGdWludDE2BXNsb3RzCnNsb3RfZGVmW10VZW50aXR5X2xheW91dHNfcmVzdWx0AAEIZW50aXRpZXMPZW50aXR5X2xheW91dFtdCmVudGl0eV9yZWYAAgtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQKZW50aXR5X3JvdwAUAmlkBnVpbnQ2NAVvd25lcgRuYW1lBGtpbmQEbmFtZQRuYW1lBnN0cmluZwVzdGF0cwZ1aW50NjQLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMIaHVsbG1hc3MHdWludDMyPwhjYXBhY2l0eQd1aW50MzI/BmVuZXJneQd1aW50MTY/CWNhcmdvbWFzcwZ1aW50MzIHZW5naW5lcw9tb3ZlbWVudF9zdGF0cz8JZ2VuZXJhdG9yDWVuZXJneV9zdGF0cz8HbG9hZGVycw1sb2FkZXJfc3RhdHM/CGdhdGhlcmVyD2dhdGhlcmVyX3N0YXRzPwR3YXJwC3dhcnBfc3RhdHM/B2NyYWZ0ZXIOY3JhZnRlcl9zdGF0cz8GaGF1bGVyDWhhdWxlcl9zdGF0cz8HbW9kdWxlcw5tb2R1bGVfZW50cnlbXQhzY2hlZHVsZQlzY2hlZHVsZT8HaXRlbV9pZAZ1aW50MTYOZW50aXR5X3N1bW1hcnkACAR0eXBlBG5hbWUCaWQGdWludDY0BW93bmVyBG5hbWULZW50aXR5X25hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzB2lzX2lkbGUEYm9vbA5yZXNvbHZlZF9jb3VudAZ1aW50MzINcGVuZGluZ19jb3VudAZ1aW50MzIQZW50aXR5X3Rhc2tfaW5mbwAECWVudGl0eV9pZAZ1aW50NjQLZW50aXR5X3R5cGUEbmFtZQp0YXNrX2NvdW50BXVpbnQ4EHNjaGVkdWxlX3N0YXJ0ZWQKdGltZV9wb2ludA9lbnRpdHlncm91cF9yb3cAAgJpZAZ1aW50NjQMcGFydGljaXBhbnRzDGVudGl0eV9yZWZbXQtlbnVtX21lbWJlcgACBXZhbHVlBXVpbnQ4BG5hbWUGc3RyaW5nC2VudW1fcmVzdWx0AAEHbWVtYmVycw1lbnVtX21lbWJlcltdDGZpeGNhcmdvbWFzcwABCWVudGl0eV9pZAZ1aW50NjQLZ2FtZV9jb25maWcAAwd2ZXJzaW9uBnVpbnQzMghkZWZhdWx0cw9lbnRpdHlfZGVmYXVsdHMFaXRlbXMKaXRlbV9kZWZbXQZnYXRoZXIABAlzb3VyY2VfaWQGdWludDY0DmRlc3RpbmF0aW9uX2lkBnVpbnQ2NAdzdHJhdHVtBnVpbnQxNghxdWFudGl0eQZ1aW50MzIOZ2F0aGVyZXJfc3RhdHMABAV5aWVsZAZ1aW50MTYFZHJhaW4GdWludDE2BWRlcHRoBnVpbnQxNgVzcGVlZAZ1aW50MTYJZ2V0Y29uZmlnAAALZ2V0ZWxpZ2libGUAAgZjb29yZHMLY29vcmRpbmF0ZXMHc3RyYXR1bQZ1aW50MTYLZ2V0ZW50aXRpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/CWdldGVudGl0eQABCWVudGl0eV9pZAZ1aW50NjQLZ2V0aXRlbWRhdGEAAApnZXRpdGVtaWRzAAAIZ2V0aXRlbXMAAAxnZXRpdGVtdHlwZXMAAAtnZXRsb2NhdGlvbgACAXgFaW50NjQBeQVpbnQ2NApnZXRsb2NkYXRhAAIBeAVpbnQ2NAF5BWludDY0C2dldG1vZHR5cGVzAAAKZ2V0bW9kdWxlcwAACWdldG5lYXJieQACCWVudGl0eV9pZAZ1aW50NjQIcmVjaGFyZ2UEYm9vbApnZXRuZnRpbmZvAAAJZ2V0cGxheWVyAAEHYWNjb3VudARuYW1lCWdldHJlY2lwZQABDm91dHB1dF9pdGVtX2lkBnVpbnQxNgpnZXRyZWNpcGVzAAILbG93ZXJfYm91bmQGdWludDE2BWxpbWl0BXVpbnQ4CmdldHJlc2NhdHMAAAtnZXRyZXNlcnZlcwACAXgFaW50NjQBeQVpbnQ2NAxnZXRyZXNvdXJjZXMAAAhnZXRzbG90cwAACmdldHN0cmF0dW0AAwF4BWludDY0AXkFaW50NjQHc3RyYXR1bQZ1aW50MTYMZ2V0c3VtbWFyaWVzAAIFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQVuYW1lPwtncm91cHRyYXZlbAAECGVudGl0aWVzDGVudGl0eV9yZWZbXQF4BWludDY0AXkFaW50NjQIcmVjaGFyZ2UEYm9vbARoYXNoAAEFdmFsdWUGc3RyaW5nB2hhc2g1MTIAAQV2YWx1ZQZzdHJpbmcMaGF1bGVyX3N0YXRzAAMIY2FwYWNpdHkFdWludDgKZWZmaWNpZW5jeQZ1aW50MTYFZHJhaW4GdWludDE2CmluaXRpYWxpemUAAQRzZWVkC2NoZWNrc3VtMjU2CGl0ZW1fZGVmAAUCaWQGdWludDE2BG1hc3MGdWludDMyBHR5cGUFdWludDgHc3VidHlwZQV1aW50OAR0aWVyBXVpbnQ4DGl0ZW1faWRfcGFpcgACAmlkBnVpbnQxNgRuYW1lBnN0cmluZw9pdGVtX2lkc19yZXN1bHQAAQVpdGVtcw5pdGVtX2lkX3BhaXJbXQ9pdGVtZGF0YV9yZXN1bHQAAgVpdGVtcwppdGVtX2RlZltdB3JlY2lwZXMOcmVjaXBlc19yZXN1bHQKaXRlbXNfaW5mbwABBWl0ZW1zCml0ZW1fZGVmW10Eam9pbgABB2FjY291bnQEbmFtZQxsb2FkZXJfc3RhdHMAAwRtYXNzBnVpbnQzMgZ0aHJ1c3QGdWludDE2CHF1YW50aXR5BXVpbnQ4EGxvY2F0aW9uX2Rlcml2ZWQAAgxzdGF0aWNfcHJvcHMPbG9jYXRpb25fc3RhdGljBHNpemUGdWludDE2DWxvY2F0aW9uX2luZm8AAgZjb29yZHMLY29vcmRpbmF0ZXMJaXNfc3lzdGVtBGJvb2wPbG9jYXRpb25fc3RhdGljAAUGY29vcmRzC2Nvb3JkaW5hdGVzBHR5cGUNbG9jYXRpb25fdHlwZQdzdWJ0eXBlBXVpbnQ4BXNlZWQwBXVpbnQ4BXNlZWQxBXVpbnQ4DG1vZHVsZV9lbnRyeQACBHR5cGUFdWludDgJaW5zdGFsbGVkDnBhY2tlZF9tb2R1bGU/C21vZHVsZV9pbmZvAAQCaWQGdWludDE2BG1hc3MGdWludDMyC21vZHVsZV90eXBlBXVpbnQ4BHRpZXIFdWludDgObW9kdWxlc19yZXN1bHQAAQdtb2R1bGVzDW1vZHVsZV9pbmZvW10ObW92ZW1lbnRfc3RhdHMAAgZ0aHJ1c3QGdWludDMyBWRyYWluBnVpbnQxNgtuZWFyYnlfaW5mbwAFCmNhbl90cmF2ZWwEYm9vbAdjdXJyZW50FGVudGl0eV9jdXJyZW50X3N0YXRlCXByb2plY3RlZBRlbnRpdHlfY3VycmVudF9zdGF0ZQptYXhfZW5lcmd5BnVpbnQxNgdzeXN0ZW1zD25lYXJieV9zeXN0ZW1bXQ1uZWFyYnlfc3lzdGVtAAQIZGlzdGFuY2UGdWludDY0C2VuZXJneV9jb3N0BnVpbnQ2NAtmbGlnaHRfdGltZQZ1aW50MzIIbG9jYXRpb24NbG9jYXRpb25faW5mbw5uZnRfc2NoZW1hX2RlZgACC3NjaGVtYV9uYW1lBG5hbWUGZmllbGRzDnNjaGVtYV9maWVsZFtdEG5mdF90ZW1wbGF0ZV9kZWYAAgdpdGVtX2lkBnVpbnQxNgtzY2hlbWFfbmFtZQRuYW1lDW5mdGNvbmZpZ19yb3cAAwdpdGVtX2lkBnVpbnQxNgt0ZW1wbGF0ZV9pZAVpbnQzMgtzY2hlbWFfbmFtZQRuYW1lDm5mdGluZm9fcmVzdWx0AAIHc2NoZW1hcxBuZnRfc2NoZW1hX2RlZltdCXRlbXBsYXRlcxJuZnRfdGVtcGxhdGVfZGVmW10Gbm90aWZ5AAEFZXZlbnQKdGFza19ldmVudA1wYWNrZWRfbW9kdWxlAAIHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0C3BsYXllcl9pbmZvAAMFb3duZXIEbmFtZQlpc19wbGF5ZXIEYm9vbAxjb21wYW55X25hbWUGc3RyaW5nCnBsYXllcl9yb3cAAQVvd25lcgRuYW1lCHJlY2hhcmdlAAECaWQGdWludDY0DHJlY2lwZV9pbnB1dAAEB2l0ZW1faWQGdWludDE2CGNhdGVnb3J5BXVpbnQ4BHRpZXIFdWludDgIcXVhbnRpdHkGdWludDMyEHJlY2lwZV9pdGVtX2luZm8AAgJpZAZ1aW50MTYEbWFzcwZ1aW50MzIPcmVjaXBlX3Jlc3BvbnNlAAcOb3V0cHV0X2l0ZW1faWQGdWludDE2C291dHB1dF9tYXNzBnVpbnQzMgZpbnB1dHMOcmVjaXBlX2lucHV0W10Kc3RhdF9zbG90cxRzdGF0X3Nsb3RfcmVzcG9uc2VbXQ1ibGVuZF93ZWlnaHRzBWJ5dGVzC291dHB1dF9pdGVtEHJlY2lwZV9pdGVtX2luZm8LaW5wdXRfaXRlbXMScmVjaXBlX2l0ZW1faW5mb1tdDnJlY2lwZXNfcmVzdWx0AAEHcmVjaXBlcxFyZWNpcGVfcmVzcG9uc2VbXQxyZWZyc2hlbnRpdHkAAQllbnRpdHlfaWQGdWludDY0C3Jlc2VydmVfcm93AAQCaWQGdWludDY0CGNvb3JkX2lkBnVpbnQ2NAdzdHJhdHVtBnVpbnQxNglyZW1haW5pbmcGdWludDMyB3Jlc29sdmUAAgJpZAZ1aW50NjQFY291bnQHdWludDY0Pw9yZXNvbHZlX3Jlc3VsdHMABgllbnRpdHlfaWQGdWludDY0C2VudGl0eV90eXBlBG5hbWUOcmVzb2x2ZWRfY291bnQFdWludDgUbmV3X3NjaGVkdWxlX3N0YXJ0ZWQLdGltZV9wb2ludD8LZW50aXR5Z3JvdXAHdWludDY0Pw1ncm91cF9tZW1iZXJzFkJfdmVjdG9yX2VudGl0eV9yZWZfRT8NcmVzb3VyY2VfaW5mbwAEAmlkBnVpbnQxNgRtYXNzBnVpbnQzMghjYXRlZ29yeQV1aW50OAR0aWVyBXVpbnQ4DnJlc291cmNlX3N0YXRzAAMFc3RhdDEGdWludDE2BXN0YXQyBnVpbnQxNgVzdGF0MwZ1aW50MTYQcmVzb3VyY2VzX3Jlc3VsdAABCXJlc291cmNlcw9yZXNvdXJjZV9pbmZvW10Icm1tb2R1bGUAAwllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OAp0YXJnZXRfcmVmCmNhcmdvX3JlZj8Icm1uZnRjZmcAAQdpdGVtX2lkBnVpbnQxNgRzYWx0AAEEc2FsdAZ1aW50NjQIc2NoZWR1bGUAAgdzdGFydGVkCnRpbWVfcG9pbnQFdGFza3MGdGFza1tdDHNjaGVtYV9maWVsZAACBG5hbWUGc3RyaW5nCmZpZWxkX3R5cGUGc3RyaW5nCXNldG5mdGNmZwADB2l0ZW1faWQGdWludDE2C3RlbXBsYXRlX2lkBWludDMyC3NjaGVtYV9uYW1lBG5hbWUKc2tpcHJldmVhbAABBmNvbW1pdAtjaGVja3N1bTI1NghzbG90X2RlZgACBHR5cGUFdWludDgKb3V0cHV0X3BjdAZ1aW50MTYKc3Bhd25jYXJnbwADCWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0C3NwYXducGFja2VkAAQJZW50aXR5X2lkBnVpbnQ2NAdpdGVtX2lkBnVpbnQxNgpodWxsX3N0YXRzBnVpbnQ2NAlpbnN0YWxsZWQPcGFja2VkX21vZHVsZVtdC3NwYXduc2VlZGVkAAQJZW50aXR5X2lkBnVpbnQ2NAdpdGVtX2lkBnVpbnQ2NAhxdWFudGl0eQZ1aW50NjQFc3RhdHMGdWludDY0EnN0YXRfc2xvdF9yZXNwb25zZQABB3NvdXJjZXMNc3RhdF9zb3VyY2VbXQtzdGF0X3NvdXJjZQACC2lucHV0X2luZGV4BXVpbnQ4EGlucHV0X3N0YXRfaW5kZXgFdWludDgJc3RhdGVfcm93AAUHZW5hYmxlZARib29sBWVwb2NoBnVpbnQzMgRzYWx0BnVpbnQ2NARzZWVkC2NoZWNrc3VtMjU2BmNvbW1pdAtjaGVja3N1bTI1NgxzdHJhdHVtX2RhdGEAAgdzdHJhdHVtDHN0cmF0dW1faW5mbwVzdGF0cw5yZXNvdXJjZV9zdGF0cwxzdHJhdHVtX2luZm8ABQdpdGVtX2lkBnVpbnQxNgRzZWVkBnVpbnQ2NAhyaWNobmVzcwZ1aW50MTYHcmVzZXJ2ZQZ1aW50MzILcmVzZXJ2ZV9tYXgGdWludDMyEXN0cmF0dW1fcmVtYWluaW5nAAIHc3RyYXR1bQZ1aW50MTYJcmVtYWluaW5nBnVpbnQzMgR0YXNrAAgEdHlwZQV1aW50OAhkdXJhdGlvbgZ1aW50MzIKY2FuY2VsYWJsZQV1aW50OAtjb29yZGluYXRlcwxjb29yZGluYXRlcz8FY2FyZ28MY2FyZ29faXRlbVtdDGVudGl0eXRhcmdldAtlbnRpdHlfcmVmPwtlbnRpdHlncm91cAd1aW50NjQ/C2VuZXJneV9jb3N0B3VpbnQxNj8KdGFza19ldmVudAAJCmV2ZW50X3R5cGUFdWludDgFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQKdGFza19pbmRleAV1aW50OAR0YXNrBHRhc2sJc3RhcnRzX2F0CnRpbWVfcG9pbnQMY29tcGxldGVzX2F0CnRpbWVfcG9pbnQKbmV3X2VuZXJneQd1aW50MTY/DHRhc2tfcmVzdWx0cwABCGVudGl0aWVzEmVudGl0eV90YXNrX2luZm9bXQh0cmFuc2ZlcgADCXNvdXJjZV9pZAZ1aW50NjQHZGVzdF9pZAZ1aW50NjQFaXRlbXMMY2FyZ29faXRlbVtdBnRyYXZlbAAEAmlkBnVpbnQ2NAF4BWludDY0AXkFaW50NjQIcmVjaGFyZ2UEYm9vbAl0eXBlc19yb3cABAJpZAZ1aW50NjQTZW50aXR5X3N1bW1hcnlfdHlwZQ5lbnRpdHlfc3VtbWFyeRBnYW1lX2NvbmZpZ190eXBlC2dhbWVfY29uZmlnFnN0cmF0dW1fcmVtYWluaW5nX3R5cGURc3RyYXR1bV9yZW1haW5pbmcIdW5kZXBsb3kAAgdob3N0X2lkBnVpbnQ2NAl0YXJnZXRfaWQGdWludDY0BHdhcnAAAwJpZAZ1aW50NjQBeAVpbnQ2NAF5BWludDY0CndhcnBfc3RhdHMAAQVyYW5nZQZ1aW50MzIEd2lwZQAABHdyYXAABAVvd25lcgRuYW1lCWVudGl0eV9pZAZ1aW50NjQIbmV4dXNfaWQGdWludDY0BWl0ZW1zDGNhcmdvX2l0ZW1bXQp3cmFwZW50aXR5AAIJZW50aXR5X2lkBnVpbnQ2NAhuZXh1c19pZAZ1aW50NjRBAABQUScqUzIJYWRkbW9kdWxlxwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWRkbW9kdWxlCnN1bW1hcnk6ICdJbnN0YWxsIGEgbW9kdWxlIGludG8gYSBzbG90JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnN0YWxsIGEgbW9kdWxlIGZyb20gY2FyZ28gaW50byBhIG1vZHVsZSBzbG90IG9uIGEgbGl2ZSBlbnRpdHkgb3IgYSBwYWNrZWQgZW50aXR5IGluIGNhcmdvLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIG5vIHNjaGVkdWxlZCB0YXNrcy4gVGhlIG1vZHVsZSB0eXBlIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgc2xvdCB0eXBlLiBUaGUgbW9kdWxlIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIGNhcmdvIHVwb24gaW5zdGFsbGF0aW9uLgAAAFh3NVMyCGFkZG5leHVzpwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWRkbmV4dXMKc3VtbWFyeTogJ0FkZCBhIG5leHVzIGxvY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDcmVhdGUgYSBuZXcgbmV4dXMgZW50aXR5IGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy4gTmV4dXNlcyBhcmUgb3duZWQgYnkgdGhlIGNvbnRyYWN0IGFuZCBzZXJ2ZSBhcyBmaXhlZCBnYXRoZXJpbmcgcG9pbnRzIHdoZXJlIHBsYXllcnMgY2FuIHdyYXAsIHVud3JhcCwgZGVwbG95LCBhbmQgb3RoZXJ3aXNlIGludGVyYWN0IHdpdGggTkZULWJhY2tlZCBhc3NldHMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAABAoWl2MgdhZHZhbmNl0wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWR2YW5jZQpzdW1tYXJ5OiAnQWR2YW5jZSB0dXJuJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpBZHZhbmNlIHRoZSBnYW1lIHRvIHRoZSBuZXh0IHR1cm4uAAAAAIA0VTwFYmxlbmT8Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBibGVuZApzdW1tYXJ5OiAnQmxlbmQgY2FyZ28gc3RhY2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDb21iaW5lIG11bHRpcGxlIGNhcmdvIHN0YWNrcyBvZiB0aGUgc2FtZSBpdGVtIHR5cGUgaW50byBhIHNpbmdsZSBzdGFjayB3aXRoIG5ldyBibGVuZGVkIHN0YXRzLiBBbGwgaW5wdXQgc3RhY2tzIG11c3Qgc2hhcmUgdGhlIHNhbWUgaXRlbSBpZC4gVGhlIG91dHB1dCBzdGFjayBoYXMgdGhlIGNvbWJpbmVkIHF1YW50aXR5IG9mIGFsbCBpbnB1dHMuAAAAAESFpkEGY2FuY2VswgItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2FuY2VsCnN1bW1hcnk6ICdDYW5jZWwgc2NoZWR1bGVkIHRhc2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDYW5jZWwgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGFza3MgZnJvbSB0aGUgZW5kIG9mIGFuIGVudGl0eSdzIHNjaGVkdWxlLiBUYXNrcyB0aGF0IGFyZSBpbW11dGFibGUgYW5kIGluIHByb2dyZXNzIGNhbm5vdCBiZSBjYW5jZWxsZWQucFW+JmPpTEQMY2xhaW1zdGFydGVyhQQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xhaW1zdGFydGVyCnN1bW1hcnk6ICdERUJVRzogY2xhaW0gYSBzdGFydGVyIHNoaXAnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClNwYXduIGEgcHJlLWtpdHRlZCBUMSBzdGFydGVyIHNoaXAgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGVzIGZvciBhIHJlZ2lzdGVyZWQgcGxheWVyLiBBdmFpbGFibGUgb25seSBvbiB0ZXN0IGRlcGxveW1lbnRzIHdoZXJlIG5vIGluLWdhbWUgc2hpcCBlY29ub215IHlldCBleGlzdHMuIFJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gYmUgYSBqb2luZWQgcGxheWVyIHdpdGggbm8gZXhpc3Rpbmcgc2hpcHM7IHRoZSByZXN1bHRpbmcgc2hpcCBpcyBmaXR0ZWQgd2l0aCBhIGdlbmVyYXRvciwgZW5naW5lLCBnYXRoZXJlciwgY3JhZnRlciwgYW5kIGhhdWxlciBtb2R1bGUuAACoG99pVEQJY2xlYW5yc3Zw7AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xlYW5yc3ZwCnN1bW1hcnk6ICdDbGVhbiB1cCBwYXN0IGVwb2NoIHJlc2VydmVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpFcmFzZSByZXNlcnZlIHRhYmxlIHJvd3MgZnJvbSBhIHBhc3QgZXBvY2guIENhbm5vdCBjbGVhbiB0aGUgY3VycmVudCBvciBmdXR1cmUgZXBvY2hzLiBUaGUgbWF4X3Jvd3MgcGFyYW1ldGVyIGNhcHMgdGhlIG51bWJlciBvZiByb3dzIGVyYXNlZCBwZXIgY2FsbCB0byBsaW1pdCBDUFUgdXNhZ2UuAICKx+RrVEQKY2xlYXJ0YWJsZb4BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsZWFydGFibGUKc3VtbWFyeTogJ0RFQlVHOiBjbGVhcnRhYmxlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAABkJyVFBmNvbW1pdOwBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNvbW1pdApzdW1tYXJ5OiAnU2V0IGNvbW1pdCB2YWx1ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2V0IHRoZSBpbml0aWFsIGNvbW1pdCB2YWx1ZSBkdXJpbmcgZ2FtZSBpbml0aWFsaXphdGlvbi4AAGA0MrcmRQljb25maWdsb2fdAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjb25maWdsb2cKc3VtbWFyeTogJ0xvZyBnYW1lIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiB0aGF0IGxvZ3MgdGhlIGN1cnJlbnQgZ2FtZSBjb25maWd1cmF0aW9uLiBDYWxsZWQgaW5saW5lIGFmdGVyIGluaXRpYWxpemF0aW9uIHRvIGJyb2FkY2FzdCBjb25maWcgdmlhIGFjdGlvbiB0cmFjZXMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAAAAgLzMRQVjcmFmdMgDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNyYWZ0CnN1bW1hcnk6ICdDcmFmdCBpdGVtcyBmcm9tIGEgcmVjaXBlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUcmFuc2Zvcm0gY2FyZ28gaXRlbXMgaW50byBhIG5ldyBpdGVtIHVzaW5nIGEgcmVjaXBlLiBUaGUgZW50aXR5IG11c3QgaGF2ZSBhIGNyYWZ0ZXIgbW9kdWxlIGluc3RhbGxlZC4gQ29uc3VtZXMgZW5lcmd5IGFuZCBzY2hlZHVsZXMgYSBjcmFmdGluZyB0YXNrIHdpdGggZHVyYXRpb24gYmFzZWQgb24gdG90YWwgaW5wdXQgbWFzcyBhbmQgY3JhZnRlciBzcGVlZC4gSW5wdXQgcXVhbnRpdGllcyBtdXN0IGV4YWN0bHkgbWF0Y2ggdGhlIHJlY2lwZSByZXF1aXJlbWVudHMu4LPLU6ls1EUMY3JlYXRlZW50aXR5vwEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY3JlYXRlZW50aXR5CnN1bW1hcnk6ICdERUJVRzogY3JlYXRlIGFuIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAA27SKVKCGRlbW9saXNo8QMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZGVtb2xpc2gKc3VtbWFyeTogJ0RlbW9saXNoIGEgc3RhdGlvbmFyeSBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkRlY29tbWlzc2lvbiBhbiBlbnRpdHksIGVyYXNpbmcgaXQgZnJvbSB0aGUgZ2FtZS4gVGhlIGVudGl0eSBtdXN0IGJlIGlkbGUsIGhhdmUgZW1wdHkgY2FyZ28sIGFuZCBoYXZlIG5vIGluc3RhbGxlZCBtb2R1bGVzIChyZW1vdmUgZWFjaCB2aWEgcm1tb2R1bGUgZmlyc3QpLiBTY2hlZHVsZXMgYSBkZW1vbGlzaCB0YXNrIHRoYXQgZXJhc2VzIHRoZSBlbnRpdHkgb24gcmVzb2x1dGlvbi4gT25seSB2YWxpZCBmb3IgZW50aXRpZXMgdGhhdCBjYW5ub3QgbW92ZTsgdXNlIHVuZGVwbG95IG9yIHdyYXBlbnRpdHkgZm9yIHRoZSByZXN0LgAAAAB4GqtKBmRlcGxveewCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGRlcGxveQpzdW1tYXJ5OiAnRGVwbG95IGEgcGFja2VkIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVW5wYWNrIGEgcGFja2VkIGVudGl0eSBpdGVtIChwYWNrZWQgc2hpcCBvciBwYWNrZWQgY29udGFpbmVyKSBmcm9tIGNhcmdvLCBzY2hlZHVsaW5nIGEgZGVwbG95IHRhc2sgdGhhdCBjcmVhdGVzIHRoZSBuZXcgZW50aXR5IGF0IHRoZSBkZXBsb3lpbmcgZW50aXR5J3MgbG9jYXRpb24gdXBvbiByZXNvbHV0aW9uLgCAzy5PhbBKCmRlc2NlbnRpdHnJAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBkZXNjZW50aXR5CnN1bW1hcnk6ICdEZXNjcmliZSBhIHBhY2tlZCBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gc3RyaW5nIGZvciBhIHBhY2tlZCBlbnRpdHksIGRlcml2ZWQgZnJvbSB0aGUgZW50aXR5IGl0ZW0gaWQsIGh1bGwgc3RhdHMsIGFuZCB0aGUgbGlzdCBvZiBpbnN0YWxsZWQgbW9kdWxlIGl0ZW0gaWRzIGFuZCBzdGF0cy4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyBhbmQgTkZUIHJlbmRlcmVycyB0byBkaXNwbGF5IHBhY2tlZCBlbnRpdGllcy4AAAAAqHjMVAZlbmFibGXdAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBlbmFibGUKc3VtbWFyeTogJ1NldCBlbmFibGVkIHN0YXRlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpFbmFibGUgb3IgZGlzYWJsZSB0aGlzIGdhbWUgb2YgU2hpcGxvYWQugLGRlF2DulsMZml4Y2FyZ29tYXNzAAAAAABc1bJhBmdhdGhlcpcDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdhdGhlcgpzdW1tYXJ5OiAnR2F0aGVyIHJlc291cmNlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKR2F0aGVyIHJlc291cmNlcyBhdCB0aGUgc2hpcCdzIGN1cnJlbnQgbG9jYXRpb24uIE9ubHkgd29ya3MgYXQgZ2F0aGVyYWJsZSBsb2NhdGlvbiB0eXBlcy4gU2NoZWR1bGVzIGEgZ2F0aGVyIHRhc2sgdGhhdCBjb25zdW1lcyBlbmVyZ3kgYW5kIHlpZWxkcyBjYXJnbyBiYXNlZCBvbiB0aGUgc2hpcCdzIGdhdGhlcmVyIHN0YXRzIGFuZCB0aGUgbG9jYXRpb24ncyByZXNvdXJjZSBjb21wb3NpdGlvbi4AAGBuTYqyYglnZXRjb25maWfKAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRjb25maWcKc3VtbWFyeTogJ0dldCBnYW1lIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgdGhlIGdhbWUgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgZGVmYXVsdCBlbnRpdHkgc3RhdHMgZm9yIHdhcmVob3VzZXMgYW5kIGNvbnRhaW5lcnMsIGFuZCB0aGUgZnVsbCBpdGVtIGRlZmluaXRpb25zIHRhYmxlLgBUPI65qLJiC2dldGVsaWdpYmxlyAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0ZWxpZ2libGUKc3VtbWFyeTogJ0dldCBlbGlnaWJsZSByZXNvdXJjZSBpdGVtIElEcyBhdCBhIGxvY2F0aW9uIGFuZCBzdHJhdHVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgbGlzdCBvZiByZXNvdXJjZSBpdGVtIElEcyBlbGlnaWJsZSB0byBiZSBnYXRoZXJlZCBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMgYW5kIHN0cmF0dW0gZGVwdGguIEl0ZW1zIGFyZSBnYXRlZCBieSBib3RoIHRoZSBsb2NhdGlvbidzIHJlc291cmNlIHByb2ZpbGUgYW5kIHRoZSBkZXB0aCB0aHJlc2hvbGQgZm9yIGVhY2ggdGllci4AsHLZ5amyYgtnZXRlbnRpdGllc6QCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0aWVzCnN1bW1hcnk6ICdHZXQgYWxsIGVudGl0aWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBmdWxsIGVudGl0eSBpbmZvIGZvciBhbGwgZW50aXRpZXMgb3duZWQgYnkgYSBwbGF5ZXIuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgAA8NnlqbJiCWdldGVudGl0eaICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0eQpzdW1tYXJ5OiAnR2V0IGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbiBlbnRpdHkgaW5jbHVkaW5nIGlkZW50aXR5LCBjYXJnbywgc2NoZWR1bGUgc3RhdGUsIGFuZCB0eXBlLXNwZWNpZmljIGZpZWxkcy4ATDZJquyyYgtnZXRpdGVtZGF0YagDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1kYXRhCnN1bW1hcnk6ICdHZXQgZnVsbCBpdGVtIGNhdGFsb2cnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBjb21wbGV0ZSBpdGVtIGNhdGFsb2cgYXMgdGhlIGNvbnRyYWN0IHNlZXMgaXQsIGluY2x1ZGluZyB0eXBlLCBzdWJ0eXBlLCB0aWVyLCBtYXNzLCBhbmQgb3RoZXIgc3RhdGljIG1ldGFkYXRhLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIGFuZCBjbGllbnRzIHRvIG1pcnJvciB0aGUgY29udHJhY3QncyBpdGVtIGRlZmluaXRpb25zLgAATk6q7LJiCmdldGl0ZW1pZHOGAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRpdGVtaWRzCnN1bW1hcnk6ICdHZXQgaXRlbSBpZCB0byBuYW1lIG1hcHBpbmdzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBtYXBwaW5nIG9mIGl0ZW0gaWQgY29uc3RhbnRzIHRvIHRoZWlyIGNhbm9uaWNhbCBzdHJpbmcgbmFtZXMuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gcmVzb2x2ZSBudW1lcmljIGl0ZW0gaWRzIHRvIGh1bWFuLXJlYWRhYmxlIGlkZW50aWZpZXJzLgAAAFiq7LJiCGdldGl0ZW1zmgItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbXMKc3VtbWFyeTogJ0dldCBhbGwgYXZhaWxhYmxlIGl0ZW1zJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGEgbGlzdCBvZiBhbGwgaXRlbXMgaW4gdGhlIGdhbWUgaW5jbHVkaW5nIHRoZWlyIGlkLCBiYXNlIHByaWNlLCBhbmQgbWFzcy6AVfVZquyyYgxnZXRpdGVtdHlwZXOIAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRpdGVtdHlwZXMKc3VtbWFyeTogJ0dldCBpdGVtIHR5cGUgZW51bSB2YWx1ZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBmdWxsIHNldCBvZiBpdGVtIHR5cGUgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAocmVzb3VyY2UsIGNvbXBvbmVudCwgbW9kdWxlLCBlbnRpdHkpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRlY29kZSBpdGVtIHR5cGUgaWRlbnRpZmllcnMuACZ12SAas2ILZ2V0bG9jYXRpb27iAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NhdGlvbgpzdW1tYXJ5OiAnR2V0IGxvY2F0aW9uIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgbG9jYXRpb24gaW5jbHVkaW5nIHdoZXRoZXIgYSBzeXN0ZW0gZXhpc3RzLCBhbmQgZm9yIGVhY2ggaXRlbTogcHJpY2UsIHN1cHBseSwgcmFyaXR5IG11bHRpcGxpZXIsIGFuZCBsb2NhdGlvbiBtdWx0aXBsaWVyLgCAySYhGrNiCmdldGxvY2RhdGH+Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NkYXRhCnN1bW1hcnk6ICdHZXQgZGVyaXZlZCBsb2NhdGlvbiBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGRlcml2ZWQgbG9jYXRpb24gZGF0YSBpbmNsdWRpbmcgc3RhdGljIHByb3BlcnRpZXMgKHR5cGUsIGRpZmZpY3VsdHksIHNlZWRzKSBmcm9tIHRoZSBnYW1lIHNlZWQgYW5kIGVwb2NoLXNwZWNpZmljIHByb3BlcnRpZXMgKGFjdGl2ZSwgc2VlZHMpIGZyb20gdGhlIGN1cnJlbnQgZXBvY2ggc2VlZC4AsKo+JyqzYgtnZXRtb2R0eXBlc9YDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG1vZHR5cGVzCnN1bW1hcnk6ICdHZXQgbW9kdWxlIHR5cGUgZW51bSB2YWx1ZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBmdWxsIHNldCBvZiBtb2R1bGUgdHlwZSBlbnVtIHZhbHVlcyBhbmQgdGhlaXIgc3RyaW5nIG5hbWVzIChhbnksIGVuZ2luZSwgZ2VuZXJhdG9yLCBnYXRoZXJlciwgbG9hZGVyLCB3YXJwLCBjcmFmdGVyLCBsYXVuY2hlciwgc3RvcmFnZSwgaGF1bGVyKS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgbW9kdWxlIHN1YnR5cGUgaWRlbnRpZmllcnMgYW5kIHNsb3QgY29tcGF0aWJpbGl0eS4AAFZRJyqzYgpnZXRtb2R1bGVzgAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bW9kdWxlcwpzdW1tYXJ5OiAnR2V0IGFsbCBtb2R1bGUgaXRlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBzdWJzZXQgb2YgaXRlbXMgY2xhc3NpZmllZCBhcyBtb2R1bGVzLCBpbmNsdWRpbmcgZWFjaCBtb2R1bGUncyBpZCwgbWFzcywgc3VidHlwZSwgYW5kIHRpZXIuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZW51bWVyYXRlIGluc3RhbGxhYmxlIGVxdWlwbWVudC4AAPDnGjWzYglnZXRuZWFyYnneAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRuZWFyYnkKc3VtbWFyeTogJ0dldCBuZWFyYnkgcmVhY2hhYmxlIHN5c3RlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgbmVhcmJ5IHN5c3RlbXMgcmVhY2hhYmxlIGJ5IGFuIGVudGl0eSBmcm9tIGl0cyBwcm9qZWN0ZWQgbG9jYXRpb24uIFJldHVybnMgY3VycmVudCBzdGF0ZSAod2l0aCBjb21wbGV0ZWQgdGFza3MgcmVzb2x2ZWQpLCBwcm9qZWN0ZWQgc3RhdGUgKGFmdGVyIGFsbCBzY2hlZHVsZWQgdGFza3MpLCBhbmQgYSBsaXN0IG9mIHJlYWNoYWJsZSBzeXN0ZW1zIHdpdGggZGlzdGFuY2UsIGVuZXJneSBjb3N0LCBmbGlnaHQgdGltZSwgYW5kIG1hcmtldCBpbmZvcm1hdGlvbi4AAF3T5TWzYgpnZXRuZnRpbmZv8AMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bmZ0aW5mbwpzdW1tYXJ5OiAnR2V0IE5GVCBzY2hlbWEgYW5kIHRlbXBsYXRlIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBmdWxsIHNldCBvZiBBdG9taWNBc3NldHMgc2NoZW1hcyBhbmQgdGVtcGxhdGVzIHRoZSBnYW1lIGNvbnRyYWN0IGV4cGVjdHMsIHBsdXMgdGhlIGN1cnJlbnQgYGl0ZW1faWQg4oaSICh0ZW1wbGF0ZV9pZCwgc2NoZW1hX25hbWUpYCBtYXBwaW5nIHN0b3JlZCBpbiB0aGUgYG5mdGNvbmZpZ2AgdGFibGUuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gc3luYyBhdG9taWNhc3NldHMgc3RhdGUgd2l0aCB0aGUgY29udHJhY3QuAAC4yptYs2IJZ2V0cGxheWVy/QItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cGxheWVyCnN1bW1hcnk6ICdHZXQgcGxheWVyIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgcGxheWVyIGluY2x1ZGluZyBiYWxhbmNlLCBkZWJ0LCBuZXR3b3J0aCwgZW50aXR5IGNvdW50cywgYW5kIHByaWNpbmcgZm9yIG5leHQgcHVyY2hhc2VzLiBSZXR1cm5zIGlzX3BsYXllcj1mYWxzZSBpZiB0aGUgYWNjb3VudCBoYXMgbm90IGpvaW5lZCB0aGUgZ2FtZS4AAFDVIXWzYglnZXRyZWNpcGWmAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRyZWNpcGUKc3VtbWFyeTogJ0dldCBhIHNpbmdsZSBjcmFmdGluZyByZWNpcGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSByZWNpcGUgd2hvc2Ugb3V0cHV0IG1hdGNoZXMgdGhlIGdpdmVuIGl0ZW0gaWQsIGluY2x1ZGluZyBpdHMgaW5wdXRzLCBibGVuZCB3ZWlnaHRzLCBzdGF0IHNsb3RzLCBhbmQgcmVzb2x2ZWQgaXRlbSBtYXNzIGluZm8uIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZGlzcGxheSBjcmFmdGluZyByZXF1aXJlbWVudHMuAABW1SF1s2IKZ2V0cmVjaXBlc6wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlY2lwZXMKc3VtbWFyeTogJ0xpc3QgY3JhZnRpbmcgcmVjaXBlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBwYWdpbmF0ZWQgbGlzdCBvZiBjcmFmdGluZyByZWNpcGVzIHN0YXJ0aW5nIGF0IHRoZSBwcm92aWRlZCBsb3dlciBib3VuZCBvdXRwdXQgaXRlbSBpZCwgdXAgdG8gdGhlIHNwZWNpZmllZCBsaW1pdC4gRWFjaCBlbnRyeSBpbmNsdWRlcyBpbnB1dHMsIGJsZW5kIHdlaWdodHMsIHN0YXQgc2xvdHMsIGFuZCByZXNvbHZlZCBpdGVtIG1hc3MgaW5mby4AAM4GYXWzYgpnZXRyZXNjYXRzngMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cmVzY2F0cwpzdW1tYXJ5OiAnR2V0IHJlc291cmNlIGNhdGVnb3J5IGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgcmVzb3VyY2UgY2F0ZWdvcnkgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAob3JlLCBnYXMsIHJlZ29saXRoLCBiaW9tYXNzLCBjcnlzdGFsKS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgcmVzb3VyY2Ugc3VidHlwZSBpZGVudGlmaWVycy4AsNpXYXWzYgtnZXRyZXNlcnZlc/wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlc2VydmVzCnN1bW1hcnk6ICdHZXQgY3VycmVudCByZXNlcnZlIG1vZGlmaWNhdGlvbnMgYXQgYSBsb2NhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyB0aGUgY2hhaW4ncyBtb2RpZmljYXRpb25zIHRvIGRlcml2ZWQgcmVzZXJ2ZXMgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGUgZm9yIHRoZSBjdXJyZW50IGVwb2NoIGFzIGEgbGlzdCBvZiB7c3RyYXR1bSwgcmVtYWluaW5nfSBwYWlycy4gU3RyYXRhIG5vdCBwcmVzZW50IGluIHRoZSByZXNwb25zZSB1c2UgdGhlaXIgZGVyaXZlZCBpbml0aWFsIHJlc2VydmUuIENvbXBvc2Ugd2l0aCBTREsgZGVyaXZhdGlvbiB0byBnZXQgdGhlIGZ1bGwgcGVyLWxvY2F0aW9uIHN0cmF0YSB2aWV3LoAVuppidbNiDGdldHJlc291cmNlc4cDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlc291cmNlcwpzdW1tYXJ5OiAnR2V0IGFsbCByZXNvdXJjZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHN1YnNldCBvZiBpdGVtcyBjbGFzc2lmaWVkIGFzIHJlc291cmNlcywgaW5jbHVkaW5nIGVhY2ggcmVzb3VyY2UncyBpZCwgbWFzcywgc3VidHlwZSwgYW5kIHRpZXIuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZW51bWVyYXRlIGdhdGhlcmFibGUgbWF0ZXJpYWxzLgAAADjTiLNiCGdldHNsb3RzuwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c2xvdHMKc3VtbWFyeTogJ0dldCBlbnRpdHkgc2xvdCBsYXlvdXRzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgbW9kdWxlIHNsb3QgbGF5b3V0IGZvciBldmVyeSBlbnRpdHkgaXRlbSB0eXBlLCBsaXN0aW5nIHRoZSBvcmRlcmVkIHNsb3QgdHlwZXMgYXZhaWxhYmxlIGZvciBtb2R1bGUgaW5zdGFsbGF0aW9uLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRldGVybWluZSB3aGljaCBtb2R1bGUgdHlwZXMgYXJlIGNvbXBhdGlibGUgd2l0aCBhIGdpdmVuIGVudGl0eSBodWxsLgCA1NncjLNiCmdldHN0cmF0dW3SAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdHJhdHVtCnN1bW1hcnk6ICdHZXQgcmVzb3VyY2Ugc3RyYXR1bSBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHJlc291cmNlIHN0cmF0dW0gZGF0YSBmb3IgYSBzcGVjaWZpYyBkZXB0aCBsYXllciBhdCBhIGNvb3JkaW5hdGUsIGluY2x1ZGluZyB0aGUgc3RyYXR1bSBzZWVkIGluZm8gYW5kIGRlcml2ZWQgcmVzb3VyY2Ugc3RhdHMugJW7RkqNs2IMZ2V0c3VtbWFyaWVz6AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c3VtbWFyaWVzCnN1bW1hcnk6ICdHZXQgZW50aXR5IHN1bW1hcmllcyBmb3IgYSBwbGF5ZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJldHVybnMgbGlnaHR3ZWlnaHQgc3VtbWFyaWVzIG9mIGFsbCBlbnRpdGllcyBvd25lZCBieSBhIHBsYXllciBpbmNsdWRpbmcgdHlwZSwgaWQsIG93bmVyLCBuYW1lLCBsb2NhdGlvbiwgYW5kIGlkbGUgc3RhdHVzLiBPcHRpb25hbGx5IGZpbHRlciBieSBlbnRpdHkgdHlwZS4Aotrm5qrpZQtncm91cHRyYXZlbJoELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdyb3VwdHJhdmVsCnN1bW1hcnk6ICdNb3ZlIG11bHRpcGxlIGVudGl0aWVzIHRvZ2V0aGVyJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbml0aWF0ZSBncm91cCB0cmF2ZWwgZm9yIG11bHRpcGxlIGVudGl0aWVzIHRvIGEgZGVzdGluYXRpb24uIEFsbCBlbnRpdGllcyBtdXN0IGJlIGF0IHRoZSBzYW1lIGxvY2F0aW9uIGFuZCBvd25lZCBieSB0aGUgY2FsbGVyLiBBdCBsZWFzdCBvbmUgZW50aXR5IHdpdGggZW5naW5lcyBpcyByZXF1aXJlZCB0byBwcm92aWRlIHRocnVzdC4gRmxpZ2h0IGR1cmF0aW9uIGlzIGNhbGN1bGF0ZWQgZnJvbSBjb21iaW5lZCB0aHJ1c3QgYW5kIHRvdGFsIG1hc3Mgb2YgYWxsIGVudGl0aWVzLiBDcmVhdGVzIGFuIGVudGl0eWdyb3VwIGZvciBhdG9taWMgcmVzb2x1dGlvbiBhbmQgY2FuY2VsbGF0aW9uLgAAAAAA0LBpBGhhc2j4AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBoYXNoCnN1bW1hcnk6ICdDYWxjdWxhdGUgc2hhMjU2IGhhc2gnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbGN1bGF0ZXMgdGhlIHNoYTI1NiBoYXNoIG9mIGEgc3RyaW5nIGJhc2VkIHVzaW5nIHRoZSBnYW1lIHNlZWQuAAAAQITSsGkHaGFzaDUxMvsBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGhhc2g1MTIKc3VtbWFyeTogJ0NhbGN1bGF0ZSBzaGE1MTIgaGFzaCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ2FsY3VsYXRlcyB0aGUgc2hhNTEyIGhhc2ggb2YgYSBzdHJpbmcgYmFzZWQgdXNpbmcgdGhlIGdhbWUgc2VlZC4AgPouGpfddAppbml0aWFsaXplgAItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogaW5pdGlhbGl6ZQpzdW1tYXJ5OiAnSW5pdGlhbGl6ZSBnYW1lIHNlZWQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYWxpemUgYSB0aGUgZ2FtZXMgc2VlZCBhbmQgc2VlZCB2YWx1ZXMgdG8gYm9vdHN0cmFwIGdhbWUgc3RhdGUuAAAAAAAwHX0Eam9pbsQBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGpvaW4Kc3VtbWFyeTogJ0pvaW4gYSBnYW1lJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpKb2luIGEgZ2FtZSBvZiBTaGlwbG9hZAAAAAD45TKdBm5vdGlmeYoDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IG5vdGlmeQpzdW1tYXJ5OiAnVGFzayBsaWZlY3ljbGUgbm90aWZpY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnRlcm5hbCBhY3Rpb24gdGhhdCBub3RpZmllcyBlbnRpdHkgb3duZXJzIG9mIHRhc2sgbGlmZWN5Y2xlIGV2ZW50cyAocmVzb2x2ZWQsIGNhbmNlbGxlZCkuIENhbGxlZCBpbmxpbmUgd2hlbiB0YXNrcyBjaGFuZ2Ugc3RhdGUuIFVzZXMgcmVxdWlyZV9yZWNpcGllbnQgdG8gZW5hYmxlIG9mZi1jaGFpbiBtb25pdG9yaW5nIHZpYSBhY3Rpb24gdHJhY2VzLgAAAIpd05C6CHJlY2hhcmdlzQItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcmVjaGFyZ2UKc3VtbWFyeTogJ1JlY2hhcmdlIHNoaXAgZW5lcmd5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpTY2hlZHVsZSBhIHJlY2hhcmdlIHRhc2sgZm9yIGFuIGVudGl0eSB0byByZXN0b3JlIGVuZXJneSB0byBmdWxsIGNhcGFjaXR5LiBUaGUgcmVjaGFyZ2UgZHVyYXRpb24gZGVwZW5kcyBvbiBjdXJyZW50IGVuZXJneSBsZXZlbCBhbmQgcmVjaGFyZ2UgcmF0ZS7gs8tTNXyXugxyZWZyc2hlbnRpdHkAAAAAQO1IsboHcmVzb2x2ZdADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJlc29sdmUKc3VtbWFyeTogJ0NvbXBsZXRlIHNjaGVkdWxlZCB0YXNrcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmVzb2x2ZSBjb21wbGV0ZWQgdGFza3MgaW4gYW4gZW50aXR5J3Mgc2NoZWR1bGUsIGFwcGx5aW5nIHRoZWlyIGVmZmVjdHMgKHJlY2hhcmdlIGVuZXJneSwgdXBkYXRlIGxvY2F0aW9uLCBsb2FkL3VubG9hZCBjYXJnbykuIElmIGNvdW50IGlzIHNwZWNpZmllZCwgcmVzb2x2ZSBleGFjdGx5IHRoYXQgbWFueSB0YXNrczsgb3RoZXJ3aXNlIHJlc29sdmUgYWxsIGNvbXBsZXRlZCB0YXNrcy4gRmFpbHMgaWYgY291bnQgZXhjZWVkcyB0aGUgbnVtYmVyIG9mIGNvbXBsZXRlZCB0YXNrcy4AAAAq6kSlvAhybW1vZHVsZbwDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJtbW9kdWxlCnN1bW1hcnk6ICdSZW1vdmUgYSBtb2R1bGUgZnJvbSBhIHNsb3QnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlbW92ZSBhbiBpbnN0YWxsZWQgbW9kdWxlIGZyb20gYSBzbG90IG9uIGEgbGl2ZSBlbnRpdHkgb3IgYSBwYWNrZWQgZW50aXR5IGluIGNhcmdvLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIG5vIHNjaGVkdWxlZCB0YXNrcy4gVGhlIG1vZHVsZSBpcyByZXR1cm5lZCB0byBjYXJnby4gRmFpbHMgaWYgdGhlIGVudGl0eSBkb2VzIG5vdCBoYXZlIGVub3VnaCBjYXJnbyBjYXBhY2l0eSB0byBob2xkIHRoZSByZXR1cm5lZCBtb2R1bGUuAAAAbKG8prwIcm1uZnRjZmehAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBybW5mdGNmZwpzdW1tYXJ5OiAnUmVtb3ZlIE5GVCB0ZW1wbGF0ZSBtYXBwaW5nIGZvciBhbiBpdGVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZW1vdmUgdGhlIEF0b21pY0Fzc2V0cyB0ZW1wbGF0ZSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gaWQgZnJvbSB0aGUgYG5mdGNvbmZpZ2AgdGFibGUuIEFmdGVyIHJlbW92YWwgdGhlIGl0ZW0gY2FuIG5vIGxvbmdlciBiZSB3cmFwcGVkIG9yIHVud3JhcHBlZCB1bnRpbCBhIG5ldyBtYXBwaW5nIGlzIHNldC4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAAAAAkKPBBHNhbHTYAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzYWx0CnN1bW1hcnk6ICdBcHBlbmQgU2FsdCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQWRkIGFkZGl0aW9uYWwgc2FsdCB0byB0aGUgbmV4dCBlcG9jaCBzZWVkLgAAYAvlNbPCCXNldG5mdGNmZ8QDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNldG5mdGNmZwpzdW1tYXJ5OiAnU2V0IE5GVCB0ZW1wbGF0ZSBtYXBwaW5nIGZvciBhbiBpdGVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpCaW5kIGFuIGl0ZW0gaWQgdG8gYW4gQXRvbWljQXNzZXRzIHRlbXBsYXRlIGlkIGFuZCBzY2hlbWEgbmFtZS4gVXNlZCB0byBjb25maWd1cmUgaG93IHRoZSBjb250cmFjdCBtaW50cyBhbmQgcmVjb2duaXplcyBORlRzIGZvciBhIGdpdmVuIGl0ZW0uIEluc2VydHMgYSBuZXcgbWFwcGluZyBpZiBvbmUgZG9lcyBub3QgZXhpc3QsIG9yIHVwZGF0ZXMgdGhlIGV4aXN0aW5nIG1hcHBpbmcuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AQDRqq1sdxApza2lwcmV2ZWFsAAAAZdegyU3FCnNwYXduY2FyZ2/FAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzcGF3bmNhcmdvCnN1bW1hcnk6ICdERUJVRzogc3Bhd24gY2FyZ28gb24gYW4gZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAJKCyNTJTcULc3Bhd25wYWNrZWTnAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzcGF3bnBhY2tlZApzdW1tYXJ5OiAnREVCVUc6IHNwYXduIGEgcGFja2VkIGVudGl0eSB3aXRoIGluc3RhbGxlZCBtb2R1bGVzIG9uIGFuIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQCSSkrhyU3FC3NwYXduc2VlZGVkzQEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc3Bhd25zZWVkZWQKc3VtbWFyeTogJ0RFQlVHOiBzcGF3biBzZWVkZWQgY2FyZ28gb24gYW4gZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAAVy08zc0IdHJhbnNmZXLIAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB0cmFuc2ZlcgpzdW1tYXJ5OiAnVHJhbnNmZXIgY2FyZ28gYmV0d2VlbiBlbnRpdGllcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVHJhbnNmZXIgY2FyZ28gYmV0d2VlbiB0d28gZW50aXRpZXMgYXQgdGhlIHNhbWUgbG9jYXRpb24uIEJvdGggZW50aXRpZXMgbXVzdCBiZSBvd25lZCBieSB0aGUgY2FsbGVyIGFuZCBhdCBsZWFzdCBvbmUgbXVzdCBoYXZlIGxvYWRlcnMuIENyZWF0ZXMgbG9hZCBhbmQgdW5sb2FkIHRhc2tzIG9uIGJvdGggZW50aXRpZXMgd2l0aCBkdXJhdGlvbiBiYXNlZCBvbiBjb21iaW5lZCBsb2FkZXIgY2FwYWNpdHkgYW5kIFotZGlzdGFuY2UgYmV0d2VlbiB0aGVtLgAAAABEtc3NBnRyYXZlbPsBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHRyYXZlbApzdW1tYXJ5OiAnTW92ZSBhIHNoaXAnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYXRlIHRyYXZlbCBvZiBhbiBlbnRpdHkgZnJvbSBpdHMgY3VycmVudCBsb2NhdGlvbiB0byBhIG5ldyBkZXN0aW5hdGlvbi4AAACexqrS1Ah1bmRlcGxveecELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHVuZGVwbG95CnN1bW1hcnk6ICdQYWNrIGEgZGVwbG95ZWQgZW50aXR5IGludG8gYSBob3N0JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpQYWNrIGFuIGVudGl0eSBpbnRvIGEgaG9zdCBlbnRpdHkncyBjYXJnbyBhcyBhIHBhY2tlZC1lbnRpdHkgaXRlbS4gSG9zdCBhbmQgdGFyZ2V0IG11c3Qgc2hhcmUgdGhlIHNhbWUgb3duZXIgYW5kIGNvb3JkaW5hdGVzLCB0aGUgaG9zdCBtdXN0IGhhdmUgbG9hZGVycyBhbmQgZW5vdWdoIGNhcGFjaXR5IGZvciB0aGUgcGFja2VkIG1hc3MsIGFuZCB0aGUgdGFyZ2V0IG11c3QgYmUgaWRsZSB3aXRoIGVtcHR5IGNhcmdvLiBDcmVhdGVzIGFuIGVudGl0eWdyb3VwIGFuZCBzY2hlZHVsZXMgdW5kZXBsb3kgdGFza3Mgb24gYm90aCBlbnRpdGllczsgb24gcmVzb2x1dGlvbiB0aGUgdGFyZ2V0IGlzIGVyYXNlZCBhbmQgdGhlIHBhY2tlZCBlbnRpdHkgaXMgYWRkZWQgdG8gdGhlIGhvc3QncyBjYXJnby4gSW52ZXJzZSBvZiBkZXBsb3kuAAAAAABQr+EEd2FycJ8DLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdhcnAKc3VtbWFyeTogJ1dhcnAgdG8gYSBkZXN0aW5hdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5zdGFudGx5IHRlbGVwb3J0IGFuIGVudGl0eSB0byBhIGRlc3RpbmF0aW9uIHN5c3RlbS4gUmVxdWlyZXMgd2FycCBjYXBhYmlsaXR5LCBmdWxsIGVuZXJneSwgZW1wdHkgY2FyZ28sIGFuZCBhbiBlbXB0eSBzY2hlZHVsZS4gVGhlIGRlc3RpbmF0aW9uIG11c3QgYmUgYSB2YWxpZCBzeXN0ZW0gd2l0aGluIHdhcnAgcmFuZ2UuIFJlc29sdmVzIGltbWVkaWF0ZWx5IGFzIGEgemVyby1kdXJhdGlvbiB0YXNrLgAAAAAAoKrjBHdpcGWyAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3aXBlCnN1bW1hcnk6ICdERUJVRzogd2lwZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AAAAAAFDN5QR3cmFw/gMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd3JhcApzdW1tYXJ5OiAnV3JhcCBjYXJnbyBpbnRvIGFuIE5GVCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKV3JhcCBhIHF1YW50aXR5IG9mIGNhcmdvIGZyb20gYW4gZW50aXR5IGludG8gYW4gQXRvbWljQXNzZXRzIE5GVCBtaW50ZWQgdG8gdGhlIHNwZWNpZmllZCBvd25lci4gVGhlIGVudGl0eSBtdXN0IGJlIGF0IGEgbmV4dXMsIGhhdmUgbG9hZGVycywgYW5kIGNvbnRhaW4gZW5vdWdoIG9mIHRoZSByZXF1ZXN0ZWQgY2FyZ28uIFNjaGVkdWxlcyBhIHdyYXAgdGFzayB0aGF0LCBvbiByZXNvbHV0aW9uLCByZW1vdmVzIHRoZSBjYXJnbyBmcm9tIHRoZSBlbnRpdHkgYW5kIG1pbnRzIHRoZSBORlQgdXNpbmcgdGhlIHRlbXBsYXRlIGNvbmZpZ3VyZWQgZm9yIHRoYXQgaXRlbSBpZC4AgM8uT1XN5Qp3cmFwZW50aXR55gMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd3JhcGVudGl0eQpzdW1tYXJ5OiAnV3JhcCBhIGRlcGxveWVkIGVudGl0eSBpbnRvIGFuIE5GVCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKV3JhcCBhbiBlbnRpdHkgaW50byBhbiBBdG9taWNBc3NldHMgTkZUIG1pbnRlZCB0byBpdHMgb3duZXIuIFRoZSBlbnRpdHkgbXVzdCBiZSBhdCBhIG5leHVzLCBpZGxlIHdpdGggZW1wdHkgY2FyZ28sIGFuZCBoYXZlIGFuIG5mdGNvbmZpZyBtYXBwaW5nIGZvciBpdHMgaXRlbSBpZC4gU2NoZWR1bGVzIGEgd3JhcCB0YXNrIHRoYXQsIG9uIHJlc29sdXRpb24sIGVyYXNlcyB0aGUgZW50aXR5IGFuZCBtaW50cyB0aGUgTkZUIHByZXNlcnZpbmcgaXRzIHN0YXRzIGFuZCBpbnN0YWxsZWQgbW9kdWxlcy4IAAAAAADKrkEDaTY0AAAJY2FyZ29fcm93AAAAAPjs8lQDaTY0AAAKZW50aXR5X3JvdwCqppf57PJUA2k2NAAAD2VudGl0eWdyb3VwX3JvdwAAYG5NivKaA2k2NAAADW5mdGNvbmZpZ19yb3cAAAAAXOVNrANpNjQAAApwbGF5ZXJfcm93AAAAQO2rsLoDaTY0AAALcmVzZXJ2ZV9yb3cAAAAAAJVNxgNpNjQAAAlzdGF0ZV9yb3cAAAAAAKyqzwNpNjQAAAl0eXBlc19yb3cBEVNoaXBsb2FkIChTZXJ2ZXIpEVNoaXBsb2FkIChTZXJ2ZXIpAAAAKAAAAABEhaZBDmNhbmNlbF9yZXN1bHRzAAAAAIC8zEUMdGFza19yZXN1bHRzAAAADbtIpUoMdGFza19yZXN1bHRzAAAAAHgaq0oMdGFza19yZXN1bHRzAIDPLk+FsEoGc3RyaW5nAAAAAFzVsmEMdGFza19yZXN1bHRzAABgbk2KsmILZ2FtZV9jb25maWcAVDyOuaiyYgh1aW50MTZbXQCwctnlqbJiDWVudGl0eV9pbmZvW10AAPDZ5amyYgtlbnRpdHlfaW5mbwBMNkmq7LJiD2l0ZW1kYXRhX3Jlc3VsdAAATk6q7LJiD2l0ZW1faWRzX3Jlc3VsdAAAAFiq7LJiCml0ZW1zX2luZm+AVfVZquyyYgtlbnVtX3Jlc3VsdAAmddkgGrNiDWxvY2F0aW9uX2luZm8AgMkmIRqzYhBsb2NhdGlvbl9kZXJpdmVkALCqPicqs2ILZW51bV9yZXN1bHQAAFZRJyqzYg5tb2R1bGVzX3Jlc3VsdAAA8OcaNbNiC25lYXJieV9pbmZvAABd0+U1s2IObmZ0aW5mb19yZXN1bHQAALjKm1izYgtwbGF5ZXJfaW5mbwAAUNUhdbNiDnJlY2lwZXNfcmVzdWx0AABW1SF1s2IOcmVjaXBlc19yZXN1bHQAAM4GYXWzYgtlbnVtX3Jlc3VsdACw2ldhdbNiE3N0cmF0dW1fcmVtYWluaW5nW12AFbqaYnWzYhByZXNvdXJjZXNfcmVzdWx0AAAAONOIs2IVZW50aXR5X2xheW91dHNfcmVzdWx0AIDU2dyMs2IMc3RyYXR1bV9kYXRhgJW7RkqNs2IQZW50aXR5X3N1bW1hcnlbXQCi2ubmqullDHRhc2tfcmVzdWx0cwAAAAAA0LBpC2NoZWNrc3VtMjU2AAAAQITSsGkLY2hlY2tzdW01MTIAAACKXdOQugx0YXNrX3Jlc3VsdHMAAABA7Uixug9yZXNvbHZlX3Jlc3VsdHMAAABXLTzNzQx0YXNrX3Jlc3VsdHMAAAAARLXNzQx0YXNrX3Jlc3VsdHMAAACexqrS1Ax0YXNrX3Jlc3VsdHMAAAAAAFCv4Qx0YXNrX3Jlc3VsdHMAAAAAAFDN5Qx0YXNrX3Jlc3VsdHMAgM8uT1XN5Qx0YXNrX3Jlc3VsdHM=');
209
221
  const abi = ABI.from(abiBlob);
210
222
  var Types;
211
223
  (function (Types) {
212
- let addmodule = class addmodule extends Struct {
224
+ let packed_module = class packed_module extends Struct {
213
225
  };
214
226
  __decorate([
215
- Struct.field(Name)
216
- ], addmodule.prototype, "entity_type", void 0);
227
+ Struct.field(UInt16)
228
+ ], packed_module.prototype, "item_id", void 0);
217
229
  __decorate([
218
230
  Struct.field(UInt64)
219
- ], addmodule.prototype, "entity_id", void 0);
231
+ ], packed_module.prototype, "stats", void 0);
232
+ packed_module = __decorate([
233
+ Struct.type('packed_module')
234
+ ], packed_module);
235
+ Types.packed_module = packed_module;
236
+ let module_entry = class module_entry extends Struct {
237
+ };
220
238
  __decorate([
221
239
  Struct.field(UInt8)
222
- ], addmodule.prototype, "module_index", void 0);
240
+ ], module_entry.prototype, "type", void 0);
241
+ __decorate([
242
+ Struct.field(packed_module, { optional: true })
243
+ ], module_entry.prototype, "installed", void 0);
244
+ module_entry = __decorate([
245
+ Struct.type('module_entry')
246
+ ], module_entry);
247
+ Types.module_entry = module_entry;
248
+ let cargo_ref = class cargo_ref extends Struct {
249
+ };
250
+ __decorate([
251
+ Struct.field(UInt16)
252
+ ], cargo_ref.prototype, "item_id", void 0);
223
253
  __decorate([
224
254
  Struct.field(UInt64)
225
- ], addmodule.prototype, "module_cargo_id", void 0);
255
+ ], cargo_ref.prototype, "stats", void 0);
256
+ __decorate([
257
+ Struct.field(module_entry, { array: true })
258
+ ], cargo_ref.prototype, "modules", void 0);
259
+ cargo_ref = __decorate([
260
+ Struct.type('cargo_ref')
261
+ ], cargo_ref);
262
+ Types.cargo_ref = cargo_ref;
263
+ let addmodule = class addmodule extends Struct {
264
+ };
226
265
  __decorate([
227
266
  Struct.field(UInt64)
228
- ], addmodule.prototype, "target_cargo_id", void 0);
267
+ ], addmodule.prototype, "entity_id", void 0);
268
+ __decorate([
269
+ Struct.field(UInt8)
270
+ ], addmodule.prototype, "module_index", void 0);
271
+ __decorate([
272
+ Struct.field(cargo_ref)
273
+ ], addmodule.prototype, "module_ref", void 0);
274
+ __decorate([
275
+ Struct.field(cargo_ref, { optional: true })
276
+ ], addmodule.prototype, "target_ref", void 0);
229
277
  addmodule = __decorate([
230
278
  Struct.type('addmodule')
231
279
  ], addmodule);
@@ -257,53 +305,26 @@ var Types;
257
305
  Struct.type('advance')
258
306
  ], advance);
259
307
  Types.advance = advance;
260
- let packed_module = class packed_module extends Struct {
261
- };
262
- __decorate([
263
- Struct.field(UInt16)
264
- ], packed_module.prototype, "item_id", void 0);
265
- __decorate([
266
- Struct.field(UInt64)
267
- ], packed_module.prototype, "stats", void 0);
268
- packed_module = __decorate([
269
- Struct.type('packed_module')
270
- ], packed_module);
271
- Types.packed_module = packed_module;
272
- let module_entry = class module_entry extends Struct {
273
- };
274
- __decorate([
275
- Struct.field(UInt8)
276
- ], module_entry.prototype, "type", void 0);
277
- __decorate([
278
- Struct.field(packed_module, { optional: true })
279
- ], module_entry.prototype, "installed", void 0);
280
- module_entry = __decorate([
281
- Struct.type('module_entry')
282
- ], module_entry);
283
- Types.module_entry = module_entry;
284
308
  let cargo_item = class cargo_item extends Struct {
285
309
  };
286
310
  __decorate([
287
311
  Struct.field(UInt16)
288
312
  ], cargo_item.prototype, "item_id", void 0);
289
- __decorate([
290
- Struct.field(UInt32)
291
- ], cargo_item.prototype, "quantity", void 0);
292
313
  __decorate([
293
314
  Struct.field(UInt64)
294
315
  ], cargo_item.prototype, "stats", void 0);
295
316
  __decorate([
296
317
  Struct.field(module_entry, { array: true })
297
318
  ], cargo_item.prototype, "modules", void 0);
319
+ __decorate([
320
+ Struct.field(UInt32)
321
+ ], cargo_item.prototype, "quantity", void 0);
298
322
  cargo_item = __decorate([
299
323
  Struct.type('cargo_item')
300
324
  ], cargo_item);
301
325
  Types.cargo_item = cargo_item;
302
326
  let blend = class blend extends Struct {
303
327
  };
304
- __decorate([
305
- Struct.field(Name)
306
- ], blend.prototype, "entity_type", void 0);
307
328
  __decorate([
308
329
  Struct.field(UInt64)
309
330
  ], blend.prototype, "id", void 0);
@@ -316,9 +337,6 @@ var Types;
316
337
  Types.blend = blend;
317
338
  let cancel = class cancel extends Struct {
318
339
  };
319
- __decorate([
320
- Struct.field(Name)
321
- ], cancel.prototype, "entity_type", void 0);
322
340
  __decorate([
323
341
  Struct.field(UInt64)
324
342
  ], cancel.prototype, "id", void 0);
@@ -389,6 +407,27 @@ var Types;
389
407
  Struct.type('cargo_row')
390
408
  ], cargo_row);
391
409
  Types.cargo_row = cargo_row;
410
+ let cargo_view = class cargo_view extends Struct {
411
+ };
412
+ __decorate([
413
+ Struct.field(UInt16)
414
+ ], cargo_view.prototype, "item_id", void 0);
415
+ __decorate([
416
+ Struct.field(UInt64)
417
+ ], cargo_view.prototype, "stats", void 0);
418
+ __decorate([
419
+ Struct.field(module_entry, { array: true })
420
+ ], cargo_view.prototype, "modules", void 0);
421
+ __decorate([
422
+ Struct.field(UInt32)
423
+ ], cargo_view.prototype, "quantity", void 0);
424
+ __decorate([
425
+ Struct.field(UInt64)
426
+ ], cargo_view.prototype, "id", void 0);
427
+ cargo_view = __decorate([
428
+ Struct.type('cargo_view')
429
+ ], cargo_view);
430
+ Types.cargo_view = cargo_view;
392
431
  let claimstarter = class claimstarter extends Struct {
393
432
  };
394
433
  __decorate([
@@ -512,83 +551,8 @@ var Types;
512
551
  Struct.type('coordinates')
513
552
  ], coordinates);
514
553
  Types.coordinates = coordinates;
515
- let task = class task extends Struct {
516
- };
517
- __decorate([
518
- Struct.field(UInt8)
519
- ], task.prototype, "type", void 0);
520
- __decorate([
521
- Struct.field(UInt32)
522
- ], task.prototype, "duration", void 0);
523
- __decorate([
524
- Struct.field(UInt8)
525
- ], task.prototype, "cancelable", void 0);
526
- __decorate([
527
- Struct.field(coordinates, { optional: true })
528
- ], task.prototype, "coordinates", void 0);
529
- __decorate([
530
- Struct.field(cargo_item, { array: true })
531
- ], task.prototype, "cargo", void 0);
532
- __decorate([
533
- Struct.field(entity_ref, { optional: true })
534
- ], task.prototype, "entitytarget", void 0);
535
- __decorate([
536
- Struct.field(UInt64, { optional: true })
537
- ], task.prototype, "entitygroup", void 0);
538
- __decorate([
539
- Struct.field(UInt16, { optional: true })
540
- ], task.prototype, "energy_cost", void 0);
541
- task = __decorate([
542
- Struct.type('task')
543
- ], task);
544
- Types.task = task;
545
- let schedule = class schedule extends Struct {
546
- };
547
- __decorate([
548
- Struct.field(TimePoint)
549
- ], schedule.prototype, "started", void 0);
550
- __decorate([
551
- Struct.field(task, { array: true })
552
- ], schedule.prototype, "tasks", void 0);
553
- schedule = __decorate([
554
- Struct.type('schedule')
555
- ], schedule);
556
- Types.schedule = schedule;
557
- let container_row = class container_row extends Struct {
558
- };
559
- __decorate([
560
- Struct.field(UInt64)
561
- ], container_row.prototype, "id", void 0);
562
- __decorate([
563
- Struct.field(Name)
564
- ], container_row.prototype, "owner", void 0);
565
- __decorate([
566
- Struct.field('string')
567
- ], container_row.prototype, "name", void 0);
568
- __decorate([
569
- Struct.field(coordinates)
570
- ], container_row.prototype, "coordinates", void 0);
571
- __decorate([
572
- Struct.field(UInt32)
573
- ], container_row.prototype, "hullmass", void 0);
574
- __decorate([
575
- Struct.field(UInt32)
576
- ], container_row.prototype, "capacity", void 0);
577
- __decorate([
578
- Struct.field(UInt32)
579
- ], container_row.prototype, "cargomass", void 0);
580
- __decorate([
581
- Struct.field(schedule, { optional: true })
582
- ], container_row.prototype, "schedule", void 0);
583
- container_row = __decorate([
584
- Struct.type('container_row')
585
- ], container_row);
586
- Types.container_row = container_row;
587
554
  let craft = class craft extends Struct {
588
555
  };
589
- __decorate([
590
- Struct.field(Name)
591
- ], craft.prototype, "entity_type", void 0);
592
556
  __decorate([
593
557
  Struct.field(UInt64)
594
558
  ], craft.prototype, "id", void 0);
@@ -638,20 +602,23 @@ var Types;
638
602
  Struct.type('createentity')
639
603
  ], createentity);
640
604
  Types.createentity = createentity;
641
- let deploy = class deploy extends Struct {
605
+ let demolish = class demolish extends Struct {
642
606
  };
643
607
  __decorate([
644
- Struct.field(Name)
645
- ], deploy.prototype, "entity_type", void 0);
608
+ Struct.field(UInt64)
609
+ ], demolish.prototype, "entity_id", void 0);
610
+ demolish = __decorate([
611
+ Struct.type('demolish')
612
+ ], demolish);
613
+ Types.demolish = demolish;
614
+ let deploy = class deploy extends Struct {
615
+ };
646
616
  __decorate([
647
617
  Struct.field(UInt64)
648
618
  ], deploy.prototype, "id", void 0);
649
619
  __decorate([
650
- Struct.field(UInt16)
651
- ], deploy.prototype, "packed_item_id", void 0);
652
- __decorate([
653
- Struct.field(UInt64)
654
- ], deploy.prototype, "stats", void 0);
620
+ Struct.field(cargo_ref)
621
+ ], deploy.prototype, "ref", void 0);
655
622
  deploy = __decorate([
656
623
  Struct.type('deploy')
657
624
  ], deploy);
@@ -776,6 +743,48 @@ var Types;
776
743
  Struct.type('warp_stats')
777
744
  ], warp_stats);
778
745
  Types.warp_stats = warp_stats;
746
+ let task = class task extends Struct {
747
+ };
748
+ __decorate([
749
+ Struct.field(UInt8)
750
+ ], task.prototype, "type", void 0);
751
+ __decorate([
752
+ Struct.field(UInt32)
753
+ ], task.prototype, "duration", void 0);
754
+ __decorate([
755
+ Struct.field(UInt8)
756
+ ], task.prototype, "cancelable", void 0);
757
+ __decorate([
758
+ Struct.field(coordinates, { optional: true })
759
+ ], task.prototype, "coordinates", void 0);
760
+ __decorate([
761
+ Struct.field(cargo_item, { array: true })
762
+ ], task.prototype, "cargo", void 0);
763
+ __decorate([
764
+ Struct.field(entity_ref, { optional: true })
765
+ ], task.prototype, "entitytarget", void 0);
766
+ __decorate([
767
+ Struct.field(UInt64, { optional: true })
768
+ ], task.prototype, "entitygroup", void 0);
769
+ __decorate([
770
+ Struct.field(UInt16, { optional: true })
771
+ ], task.prototype, "energy_cost", void 0);
772
+ task = __decorate([
773
+ Struct.type('task')
774
+ ], task);
775
+ Types.task = task;
776
+ let schedule = class schedule extends Struct {
777
+ };
778
+ __decorate([
779
+ Struct.field(TimePoint)
780
+ ], schedule.prototype, "started", void 0);
781
+ __decorate([
782
+ Struct.field(task, { array: true })
783
+ ], schedule.prototype, "tasks", void 0);
784
+ schedule = __decorate([
785
+ Struct.type('schedule')
786
+ ], schedule);
787
+ Types.schedule = schedule;
779
788
  let entity_info = class entity_info extends Struct {
780
789
  };
781
790
  __decorate([
@@ -797,7 +806,7 @@ var Types;
797
806
  Struct.field(UInt32)
798
807
  ], entity_info.prototype, "cargomass", void 0);
799
808
  __decorate([
800
- Struct.field(cargo_item, { array: true })
809
+ Struct.field(cargo_view, { array: true })
801
810
  ], entity_info.prototype, "cargo", void 0);
802
811
  __decorate([
803
812
  Struct.field(loader_stats, { optional: true })
@@ -862,6 +871,9 @@ var Types;
862
871
  __decorate([
863
872
  Struct.field(UInt8)
864
873
  ], slot_def.prototype, "type", void 0);
874
+ __decorate([
875
+ Struct.field(UInt16)
876
+ ], slot_def.prototype, "output_pct", void 0);
865
877
  slot_def = __decorate([
866
878
  Struct.type('slot_def')
867
879
  ], slot_def);
@@ -887,6 +899,72 @@ var Types;
887
899
  Struct.type('entity_layouts_result')
888
900
  ], entity_layouts_result);
889
901
  Types.entity_layouts_result = entity_layouts_result;
902
+ let entity_row = class entity_row extends Struct {
903
+ };
904
+ __decorate([
905
+ Struct.field(UInt64)
906
+ ], entity_row.prototype, "id", void 0);
907
+ __decorate([
908
+ Struct.field(Name)
909
+ ], entity_row.prototype, "owner", void 0);
910
+ __decorate([
911
+ Struct.field(Name)
912
+ ], entity_row.prototype, "kind", void 0);
913
+ __decorate([
914
+ Struct.field('string')
915
+ ], entity_row.prototype, "name", void 0);
916
+ __decorate([
917
+ Struct.field(UInt64)
918
+ ], entity_row.prototype, "stats", void 0);
919
+ __decorate([
920
+ Struct.field(coordinates)
921
+ ], entity_row.prototype, "coordinates", void 0);
922
+ __decorate([
923
+ Struct.field(UInt32, { optional: true })
924
+ ], entity_row.prototype, "hullmass", void 0);
925
+ __decorate([
926
+ Struct.field(UInt32, { optional: true })
927
+ ], entity_row.prototype, "capacity", void 0);
928
+ __decorate([
929
+ Struct.field(UInt16, { optional: true })
930
+ ], entity_row.prototype, "energy", void 0);
931
+ __decorate([
932
+ Struct.field(UInt32)
933
+ ], entity_row.prototype, "cargomass", void 0);
934
+ __decorate([
935
+ Struct.field(movement_stats, { optional: true })
936
+ ], entity_row.prototype, "engines", void 0);
937
+ __decorate([
938
+ Struct.field(energy_stats, { optional: true })
939
+ ], entity_row.prototype, "generator", void 0);
940
+ __decorate([
941
+ Struct.field(loader_stats, { optional: true })
942
+ ], entity_row.prototype, "loaders", void 0);
943
+ __decorate([
944
+ Struct.field(gatherer_stats, { optional: true })
945
+ ], entity_row.prototype, "gatherer", void 0);
946
+ __decorate([
947
+ Struct.field(warp_stats, { optional: true })
948
+ ], entity_row.prototype, "warp", void 0);
949
+ __decorate([
950
+ Struct.field(crafter_stats, { optional: true })
951
+ ], entity_row.prototype, "crafter", void 0);
952
+ __decorate([
953
+ Struct.field(hauler_stats, { optional: true })
954
+ ], entity_row.prototype, "hauler", void 0);
955
+ __decorate([
956
+ Struct.field(module_entry, { array: true })
957
+ ], entity_row.prototype, "modules", void 0);
958
+ __decorate([
959
+ Struct.field(schedule, { optional: true })
960
+ ], entity_row.prototype, "schedule", void 0);
961
+ __decorate([
962
+ Struct.field(UInt16)
963
+ ], entity_row.prototype, "item_id", void 0);
964
+ entity_row = __decorate([
965
+ Struct.type('entity_row')
966
+ ], entity_row);
967
+ Types.entity_row = entity_row;
890
968
  let entity_summary = class entity_summary extends Struct {
891
969
  };
892
970
  __decorate([
@@ -968,14 +1046,23 @@ var Types;
968
1046
  Struct.type('enum_result')
969
1047
  ], enum_result);
970
1048
  Types.enum_result = enum_result;
1049
+ let fixcargomass = class fixcargomass extends Struct {
1050
+ };
1051
+ __decorate([
1052
+ Struct.field(UInt64)
1053
+ ], fixcargomass.prototype, "entity_id", void 0);
1054
+ fixcargomass = __decorate([
1055
+ Struct.type('fixcargomass')
1056
+ ], fixcargomass);
1057
+ Types.fixcargomass = fixcargomass;
971
1058
  let gather = class gather extends Struct {
972
1059
  };
973
1060
  __decorate([
974
- Struct.field(entity_ref)
975
- ], gather.prototype, "source", void 0);
1061
+ Struct.field(UInt64)
1062
+ ], gather.prototype, "source_id", void 0);
976
1063
  __decorate([
977
- Struct.field(entity_ref)
978
- ], gather.prototype, "destination", void 0);
1064
+ Struct.field(UInt64)
1065
+ ], gather.prototype, "destination_id", void 0);
979
1066
  __decorate([
980
1067
  Struct.field(UInt16)
981
1068
  ], gather.prototype, "stratum", void 0);
@@ -992,6 +1079,18 @@ var Types;
992
1079
  Struct.type('getconfig')
993
1080
  ], getconfig);
994
1081
  Types.getconfig = getconfig;
1082
+ let geteligible = class geteligible extends Struct {
1083
+ };
1084
+ __decorate([
1085
+ Struct.field(coordinates)
1086
+ ], geteligible.prototype, "coords", void 0);
1087
+ __decorate([
1088
+ Struct.field(UInt16)
1089
+ ], geteligible.prototype, "stratum", void 0);
1090
+ geteligible = __decorate([
1091
+ Struct.type('geteligible')
1092
+ ], geteligible);
1093
+ Types.geteligible = geteligible;
995
1094
  let getentities = class getentities extends Struct {
996
1095
  };
997
1096
  __decorate([
@@ -1006,9 +1105,6 @@ var Types;
1006
1105
  Types.getentities = getentities;
1007
1106
  let getentity = class getentity extends Struct {
1008
1107
  };
1009
- __decorate([
1010
- Struct.field(Name)
1011
- ], getentity.prototype, "entity_type", void 0);
1012
1108
  __decorate([
1013
1109
  Struct.field(UInt64)
1014
1110
  ], getentity.prototype, "entity_id", void 0);
@@ -1078,9 +1174,6 @@ var Types;
1078
1174
  Types.getmodules = getmodules;
1079
1175
  let getnearby = class getnearby extends Struct {
1080
1176
  };
1081
- __decorate([
1082
- Struct.field(Name)
1083
- ], getnearby.prototype, "entity_type", void 0);
1084
1177
  __decorate([
1085
1178
  Struct.field(UInt64)
1086
1179
  ], getnearby.prototype, "entity_id", void 0);
@@ -1220,15 +1313,15 @@ var Types;
1220
1313
  Struct.type('hash512')
1221
1314
  ], hash512);
1222
1315
  Types.hash512 = hash512;
1223
- let init = class init extends Struct {
1316
+ let initialize = class initialize extends Struct {
1224
1317
  };
1225
1318
  __decorate([
1226
1319
  Struct.field(Checksum256)
1227
- ], init.prototype, "seed", void 0);
1228
- init = __decorate([
1229
- Struct.type('init')
1230
- ], init);
1231
- Types.init = init;
1320
+ ], initialize.prototype, "seed", void 0);
1321
+ initialize = __decorate([
1322
+ Struct.type('initialize')
1323
+ ], initialize);
1324
+ Types.initialize = initialize;
1232
1325
  let item_id_pair = class item_id_pair extends Struct {
1233
1326
  };
1234
1327
  __decorate([
@@ -1388,29 +1481,11 @@ var Types;
1388
1481
  Struct.type('location_static')
1389
1482
  ], location_static);
1390
1483
  Types.location_static = location_static;
1391
- let location_epoch = class location_epoch extends Struct {
1392
- };
1393
- __decorate([
1394
- Struct.field('bool')
1395
- ], location_epoch.prototype, "active", void 0);
1396
- __decorate([
1397
- Struct.field(UInt8)
1398
- ], location_epoch.prototype, "seed0", void 0);
1399
- __decorate([
1400
- Struct.field(UInt8)
1401
- ], location_epoch.prototype, "seed1", void 0);
1402
- location_epoch = __decorate([
1403
- Struct.type('location_epoch')
1404
- ], location_epoch);
1405
- Types.location_epoch = location_epoch;
1406
- let location_derived = class location_derived extends Struct {
1484
+ let location_derived = class location_derived extends Struct {
1407
1485
  };
1408
1486
  __decorate([
1409
1487
  Struct.field(location_static)
1410
1488
  ], location_derived.prototype, "static_props", void 0);
1411
- __decorate([
1412
- Struct.field(location_epoch)
1413
- ], location_derived.prototype, "epoch_props", void 0);
1414
1489
  __decorate([
1415
1490
  Struct.field(UInt16)
1416
1491
  ], location_derived.prototype, "size", void 0);
@@ -1430,30 +1505,6 @@ var Types;
1430
1505
  Struct.type('location_info')
1431
1506
  ], location_info);
1432
1507
  Types.location_info = location_info;
1433
- let location_row = class location_row extends Struct {
1434
- };
1435
- __decorate([
1436
- Struct.field(UInt64)
1437
- ], location_row.prototype, "id", void 0);
1438
- __decorate([
1439
- Struct.field(Name)
1440
- ], location_row.prototype, "owner", void 0);
1441
- __decorate([
1442
- Struct.field(coordinates)
1443
- ], location_row.prototype, "coordinates", void 0);
1444
- __decorate([
1445
- Struct.field(UInt32)
1446
- ], location_row.prototype, "cargomass", void 0);
1447
- __decorate([
1448
- Struct.field(cargo_item, { array: true })
1449
- ], location_row.prototype, "cargo", void 0);
1450
- __decorate([
1451
- Struct.field(schedule, { optional: true })
1452
- ], location_row.prototype, "schedule", void 0);
1453
- location_row = __decorate([
1454
- Struct.type('location_row')
1455
- ], location_row);
1456
- Types.location_row = location_row;
1457
1508
  let module_info = class module_info extends Struct {
1458
1509
  };
1459
1510
  __decorate([
@@ -1520,24 +1571,6 @@ var Types;
1520
1571
  Struct.type('nearby_info')
1521
1572
  ], nearby_info);
1522
1573
  Types.nearby_info = nearby_info;
1523
- let nexus_row = class nexus_row extends Struct {
1524
- };
1525
- __decorate([
1526
- Struct.field(UInt64)
1527
- ], nexus_row.prototype, "id", void 0);
1528
- __decorate([
1529
- Struct.field(Name)
1530
- ], nexus_row.prototype, "owner", void 0);
1531
- __decorate([
1532
- Struct.field('string')
1533
- ], nexus_row.prototype, "name", void 0);
1534
- __decorate([
1535
- Struct.field(coordinates)
1536
- ], nexus_row.prototype, "coordinates", void 0);
1537
- nexus_row = __decorate([
1538
- Struct.type('nexus_row')
1539
- ], nexus_row);
1540
- Types.nexus_row = nexus_row;
1541
1574
  let schema_field = class schema_field extends Struct {
1542
1575
  };
1543
1576
  __decorate([
@@ -1654,15 +1687,6 @@ var Types;
1654
1687
  __decorate([
1655
1688
  Struct.field('string')
1656
1689
  ], player_info.prototype, "company_name", void 0);
1657
- __decorate([
1658
- Struct.field(UInt64)
1659
- ], player_info.prototype, "ship_count", void 0);
1660
- __decorate([
1661
- Struct.field(UInt64)
1662
- ], player_info.prototype, "warehouse_count", void 0);
1663
- __decorate([
1664
- Struct.field(UInt64)
1665
- ], player_info.prototype, "container_count", void 0);
1666
1690
  player_info = __decorate([
1667
1691
  Struct.type('player_info')
1668
1692
  ], player_info);
@@ -1678,9 +1702,6 @@ var Types;
1678
1702
  Types.player_row = player_row;
1679
1703
  let recharge = class recharge extends Struct {
1680
1704
  };
1681
- __decorate([
1682
- Struct.field(Name)
1683
- ], recharge.prototype, "entity_type", void 0);
1684
1705
  __decorate([
1685
1706
  Struct.field(UInt64)
1686
1707
  ], recharge.prototype, "id", void 0);
@@ -1688,6 +1709,15 @@ var Types;
1688
1709
  Struct.type('recharge')
1689
1710
  ], recharge);
1690
1711
  Types.recharge = recharge;
1712
+ let refrshentity = class refrshentity extends Struct {
1713
+ };
1714
+ __decorate([
1715
+ Struct.field(UInt64)
1716
+ ], refrshentity.prototype, "entity_id", void 0);
1717
+ refrshentity = __decorate([
1718
+ Struct.type('refrshentity')
1719
+ ], refrshentity);
1720
+ Types.refrshentity = refrshentity;
1691
1721
  let reserve_row = class reserve_row extends Struct {
1692
1722
  };
1693
1723
  __decorate([
@@ -1708,9 +1738,6 @@ var Types;
1708
1738
  Types.reserve_row = reserve_row;
1709
1739
  let resolve = class resolve extends Struct {
1710
1740
  };
1711
- __decorate([
1712
- Struct.field(Name)
1713
- ], resolve.prototype, "entity_type", void 0);
1714
1741
  __decorate([
1715
1742
  Struct.field(UInt64)
1716
1743
  ], resolve.prototype, "id", void 0);
@@ -1789,9 +1816,6 @@ var Types;
1789
1816
  Types.resources_result = resources_result;
1790
1817
  let rmmodule = class rmmodule extends Struct {
1791
1818
  };
1792
- __decorate([
1793
- Struct.field(Name)
1794
- ], rmmodule.prototype, "entity_type", void 0);
1795
1819
  __decorate([
1796
1820
  Struct.field(UInt64)
1797
1821
  ], rmmodule.prototype, "entity_id", void 0);
@@ -1799,8 +1823,8 @@ var Types;
1799
1823
  Struct.field(UInt8)
1800
1824
  ], rmmodule.prototype, "module_index", void 0);
1801
1825
  __decorate([
1802
- Struct.field(UInt64)
1803
- ], rmmodule.prototype, "target_cargo_id", void 0);
1826
+ Struct.field(cargo_ref, { optional: true })
1827
+ ], rmmodule.prototype, "target_ref", void 0);
1804
1828
  rmmodule = __decorate([
1805
1829
  Struct.type('rmmodule')
1806
1830
  ], rmmodule);
@@ -1823,18 +1847,6 @@ var Types;
1823
1847
  Struct.type('salt')
1824
1848
  ], salt);
1825
1849
  Types.salt = salt;
1826
- let sequence_row = class sequence_row extends Struct {
1827
- };
1828
- __decorate([
1829
- Struct.field(Name)
1830
- ], sequence_row.prototype, "key", void 0);
1831
- __decorate([
1832
- Struct.field(UInt64)
1833
- ], sequence_row.prototype, "value", void 0);
1834
- sequence_row = __decorate([
1835
- Struct.type('sequence_row')
1836
- ], sequence_row);
1837
- Types.sequence_row = sequence_row;
1838
1850
  let setnftcfg = class setnftcfg extends Struct {
1839
1851
  };
1840
1852
  __decorate([
@@ -1850,66 +1862,15 @@ var Types;
1850
1862
  Struct.type('setnftcfg')
1851
1863
  ], setnftcfg);
1852
1864
  Types.setnftcfg = setnftcfg;
1853
- let ship_row = class ship_row extends Struct {
1865
+ let skipreveal = class skipreveal extends Struct {
1854
1866
  };
1855
1867
  __decorate([
1856
- Struct.field(UInt64)
1857
- ], ship_row.prototype, "id", void 0);
1858
- __decorate([
1859
- Struct.field(Name)
1860
- ], ship_row.prototype, "owner", void 0);
1861
- __decorate([
1862
- Struct.field('string')
1863
- ], ship_row.prototype, "name", void 0);
1864
- __decorate([
1865
- Struct.field(UInt64)
1866
- ], ship_row.prototype, "stats", void 0);
1867
- __decorate([
1868
- Struct.field(coordinates)
1869
- ], ship_row.prototype, "coordinates", void 0);
1870
- __decorate([
1871
- Struct.field(UInt32, { optional: true })
1872
- ], ship_row.prototype, "hullmass", void 0);
1873
- __decorate([
1874
- Struct.field(UInt32, { optional: true })
1875
- ], ship_row.prototype, "capacity", void 0);
1876
- __decorate([
1877
- Struct.field(UInt16, { optional: true })
1878
- ], ship_row.prototype, "energy", void 0);
1879
- __decorate([
1880
- Struct.field(UInt32)
1881
- ], ship_row.prototype, "cargomass", void 0);
1882
- __decorate([
1883
- Struct.field(movement_stats, { optional: true })
1884
- ], ship_row.prototype, "engines", void 0);
1885
- __decorate([
1886
- Struct.field(energy_stats, { optional: true })
1887
- ], ship_row.prototype, "generator", void 0);
1888
- __decorate([
1889
- Struct.field(loader_stats, { optional: true })
1890
- ], ship_row.prototype, "loaders", void 0);
1891
- __decorate([
1892
- Struct.field(gatherer_stats, { optional: true })
1893
- ], ship_row.prototype, "gatherer", void 0);
1894
- __decorate([
1895
- Struct.field(warp_stats, { optional: true })
1896
- ], ship_row.prototype, "warp", void 0);
1897
- __decorate([
1898
- Struct.field(crafter_stats, { optional: true })
1899
- ], ship_row.prototype, "crafter", void 0);
1900
- __decorate([
1901
- Struct.field(hauler_stats, { optional: true })
1902
- ], ship_row.prototype, "hauler", void 0);
1903
- __decorate([
1904
- Struct.field(module_entry, { array: true })
1905
- ], ship_row.prototype, "modules", void 0);
1906
- __decorate([
1907
- Struct.field(schedule, { optional: true })
1908
- ], ship_row.prototype, "schedule", void 0);
1909
- ship_row = __decorate([
1910
- Struct.type('ship_row')
1911
- ], ship_row);
1912
- Types.ship_row = ship_row;
1868
+ Struct.field(Checksum256)
1869
+ ], skipreveal.prototype, "commit", void 0);
1870
+ skipreveal = __decorate([
1871
+ Struct.type('skipreveal')
1872
+ ], skipreveal);
1873
+ Types.skipreveal = skipreveal;
1913
1874
  let spawncargo = class spawncargo extends Struct {
1914
1875
  };
1915
1876
  __decorate([
@@ -1972,9 +1933,6 @@ var Types;
1972
1933
  __decorate([
1973
1934
  Struct.field(UInt64)
1974
1935
  ], state_row.prototype, "salt", void 0);
1975
- __decorate([
1976
- Struct.field(UInt32)
1977
- ], state_row.prototype, "ships", void 0);
1978
1936
  __decorate([
1979
1937
  Struct.field(Checksum256)
1980
1938
  ], state_row.prototype, "seed", void 0);
@@ -2041,36 +1999,21 @@ var Types;
2041
1999
  Types.task_results = task_results;
2042
2000
  let transfer = class transfer extends Struct {
2043
2001
  };
2044
- __decorate([
2045
- Struct.field(Name)
2046
- ], transfer.prototype, "source_type", void 0);
2047
2002
  __decorate([
2048
2003
  Struct.field(UInt64)
2049
2004
  ], transfer.prototype, "source_id", void 0);
2050
- __decorate([
2051
- Struct.field(Name)
2052
- ], transfer.prototype, "dest_type", void 0);
2053
2005
  __decorate([
2054
2006
  Struct.field(UInt64)
2055
2007
  ], transfer.prototype, "dest_id", void 0);
2056
2008
  __decorate([
2057
- Struct.field(UInt16)
2058
- ], transfer.prototype, "item_id", void 0);
2059
- __decorate([
2060
- Struct.field(UInt64)
2061
- ], transfer.prototype, "stats", void 0);
2062
- __decorate([
2063
- Struct.field(UInt32)
2064
- ], transfer.prototype, "quantity", void 0);
2009
+ Struct.field(cargo_item, { array: true })
2010
+ ], transfer.prototype, "items", void 0);
2065
2011
  transfer = __decorate([
2066
2012
  Struct.type('transfer')
2067
2013
  ], transfer);
2068
2014
  Types.transfer = transfer;
2069
2015
  let travel = class travel extends Struct {
2070
2016
  };
2071
- __decorate([
2072
- Struct.field(Name)
2073
- ], travel.prototype, "entity_type", void 0);
2074
2017
  __decorate([
2075
2018
  Struct.field(UInt64)
2076
2019
  ], travel.prototype, "id", void 0);
@@ -2105,50 +2048,20 @@ var Types;
2105
2048
  Struct.type('types_row')
2106
2049
  ], types_row);
2107
2050
  Types.types_row = types_row;
2108
- let warehouse_row = class warehouse_row extends Struct {
2051
+ let undeploy = class undeploy extends Struct {
2109
2052
  };
2110
2053
  __decorate([
2111
2054
  Struct.field(UInt64)
2112
- ], warehouse_row.prototype, "id", void 0);
2113
- __decorate([
2114
- Struct.field(Name)
2115
- ], warehouse_row.prototype, "owner", void 0);
2116
- __decorate([
2117
- Struct.field('string')
2118
- ], warehouse_row.prototype, "name", void 0);
2055
+ ], undeploy.prototype, "host_id", void 0);
2119
2056
  __decorate([
2120
2057
  Struct.field(UInt64)
2121
- ], warehouse_row.prototype, "stats", void 0);
2122
- __decorate([
2123
- Struct.field(coordinates)
2124
- ], warehouse_row.prototype, "coordinates", void 0);
2125
- __decorate([
2126
- Struct.field(UInt32, { optional: true })
2127
- ], warehouse_row.prototype, "hullmass", void 0);
2128
- __decorate([
2129
- Struct.field(UInt32, { optional: true })
2130
- ], warehouse_row.prototype, "capacity", void 0);
2131
- __decorate([
2132
- Struct.field(UInt32)
2133
- ], warehouse_row.prototype, "cargomass", void 0);
2134
- __decorate([
2135
- Struct.field(loader_stats, { optional: true })
2136
- ], warehouse_row.prototype, "loaders", void 0);
2137
- __decorate([
2138
- Struct.field(module_entry, { array: true })
2139
- ], warehouse_row.prototype, "modules", void 0);
2140
- __decorate([
2141
- Struct.field(schedule, { optional: true })
2142
- ], warehouse_row.prototype, "schedule", void 0);
2143
- warehouse_row = __decorate([
2144
- Struct.type('warehouse_row')
2145
- ], warehouse_row);
2146
- Types.warehouse_row = warehouse_row;
2058
+ ], undeploy.prototype, "target_id", void 0);
2059
+ undeploy = __decorate([
2060
+ Struct.type('undeploy')
2061
+ ], undeploy);
2062
+ Types.undeploy = undeploy;
2147
2063
  let warp = class warp extends Struct {
2148
2064
  };
2149
- __decorate([
2150
- Struct.field(Name)
2151
- ], warp.prototype, "entity_type", void 0);
2152
2065
  __decorate([
2153
2066
  Struct.field(UInt64)
2154
2067
  ], warp.prototype, "id", void 0);
@@ -2168,48 +2081,46 @@ var Types;
2168
2081
  Struct.type('wipe')
2169
2082
  ], wipe);
2170
2083
  Types.wipe = wipe;
2171
- let wipesequence = class wipesequence extends Struct {
2172
- };
2173
- wipesequence = __decorate([
2174
- Struct.type('wipesequence')
2175
- ], wipesequence);
2176
- Types.wipesequence = wipesequence;
2177
2084
  let wrap = class wrap extends Struct {
2178
2085
  };
2179
2086
  __decorate([
2180
2087
  Struct.field(Name)
2181
2088
  ], wrap.prototype, "owner", void 0);
2182
- __decorate([
2183
- Struct.field(Name)
2184
- ], wrap.prototype, "entity_type", void 0);
2185
2089
  __decorate([
2186
2090
  Struct.field(UInt64)
2187
2091
  ], wrap.prototype, "entity_id", void 0);
2188
2092
  __decorate([
2189
2093
  Struct.field(UInt64)
2190
- ], wrap.prototype, "cargo_id", void 0);
2094
+ ], wrap.prototype, "nexus_id", void 0);
2191
2095
  __decorate([
2192
- Struct.field(UInt64)
2193
- ], wrap.prototype, "quantity", void 0);
2096
+ Struct.field(cargo_item, { array: true })
2097
+ ], wrap.prototype, "items", void 0);
2194
2098
  wrap = __decorate([
2195
2099
  Struct.type('wrap')
2196
2100
  ], wrap);
2197
2101
  Types.wrap = wrap;
2102
+ let wrapentity = class wrapentity extends Struct {
2103
+ };
2104
+ __decorate([
2105
+ Struct.field(UInt64)
2106
+ ], wrapentity.prototype, "entity_id", void 0);
2107
+ __decorate([
2108
+ Struct.field(UInt64)
2109
+ ], wrapentity.prototype, "nexus_id", void 0);
2110
+ wrapentity = __decorate([
2111
+ Struct.type('wrapentity')
2112
+ ], wrapentity);
2113
+ Types.wrapentity = wrapentity;
2198
2114
  })(Types || (Types = {}));
2199
2115
  const TableMap = {
2200
2116
  cargo: Types.cargo_row,
2201
- container: Types.container_row,
2117
+ entity: Types.entity_row,
2202
2118
  entitygroup: Types.entitygroup_row,
2203
- location: Types.location_row,
2204
- nexus: Types.nexus_row,
2205
2119
  nftconfig: Types.nftconfig_row,
2206
2120
  player: Types.player_row,
2207
2121
  reserve: Types.reserve_row,
2208
- sequence: Types.sequence_row,
2209
- ship: Types.ship_row,
2210
2122
  state: Types.state_row,
2211
2123
  types: Types.types_row,
2212
- warehouse: Types.warehouse_row,
2213
2124
  };
2214
2125
  class Contract extends Contract$2 {
2215
2126
  constructor(args) {
@@ -2258,15 +2169,15 @@ const PLAYER_ALREADY_JOINED = 'Player has already joined the game.';
2258
2169
  const PLAYER_NOT_JOINED = 'Player has not joined the game.';
2259
2170
  const PLAYER_NOT_FOUND = 'Cannot find player for given account name.';
2260
2171
  const STARTER_ALREADY_CLAIMED = 'Starter ship already claimed; destroy existing ships to re-claim.';
2261
- const SHIP_ALREADY_THERE = 'Ship cannot travel to the location its already at.';
2172
+ const ENTITY_ALREADY_THERE = 'Entity cannot travel to the location it is already at.';
2262
2173
  const SHIP_ALREADY_TRAVELING = 'Ship is already traveling.';
2263
2174
  const SHIP_CANNOT_BUY_TRAVELING = 'Ship cannot buy goods while traveling.';
2264
2175
  const SHIP_CANNOT_UPDATE_TRAVELING = 'Ship cannot be updated while traveling.';
2265
- const SHIP_INVALID_DESTINATION = 'Ship cannot travel, no system at specified destination.';
2266
- const SHIP_INVALID_TRAVEL_DURATION = 'This trip cannot be made as it would exceed the maximum travel duration.';
2176
+ const ENTITY_INVALID_DESTINATION = 'Cannot travel: no system at specified destination.';
2177
+ const ENTITY_INVALID_TRAVEL_DURATION = 'This trip cannot be made as it would exceed the maximum travel duration.';
2267
2178
  const SHIP_NOT_ARRIVED = 'Ship has not yet arrived at its destination.';
2268
- const SHIP_NOT_ENOUGH_ENERGY = 'Ship does not have enough energy to travel to the destination.';
2269
- const SHIP_NOT_ENOUGH_ENERGY_CAPACITY = 'Ship does not have enough energy capacity to travel.';
2179
+ const ENTITY_NOT_ENOUGH_ENERGY = 'Entity does not have enough energy to travel to the destination.';
2180
+ const ENTITY_NOT_ENOUGH_ENERGY_CAPACITY = 'Entity does not have enough energy capacity to travel.';
2270
2181
  const SHIP_NOT_FOUND = 'Cannot find ship for given account.';
2271
2182
  const SHIP_NOT_OWNED = 'Ship is not owned by this account.';
2272
2183
  const NO_SCHEDULE = 'No scheduled tasks.';
@@ -2275,16 +2186,13 @@ const SHIP_NO_COMPLETED_TASKS = 'No completed tasks to resolve.';
2275
2186
  const RESOLVE_COUNT_EXCEEDS_COMPLETED = 'Requested resolve count exceeds completed tasks.';
2276
2187
  const SHIP_CANNOT_CANCEL_TASK = 'Cannot cancel task that is immutable or in progress.';
2277
2188
  const SHIP_NO_TASKS_TO_CANCEL = 'No tasks to cancel.';
2278
- const SHIP_INVALID_CARGO = 'Invalid cargo specified for load/unload.';
2279
- const SHIP_CARGO_NOT_OWNED = 'Cannot load cargo that is not owned.';
2280
- const SHIP_CARGO_NOT_LOADED = 'Cannot unload cargo that is not loaded.';
2281
- const SHIP_CAPACITY_EXCEEDED = 'Ship cargo capacity would be exceeded.';
2189
+ const ENTITY_INVALID_CARGO = 'Invalid cargo specified for load/unload.';
2190
+ const ENTITY_CARGO_NOT_OWNED = 'Cannot load cargo that is not owned.';
2191
+ const ENTITY_CARGO_NOT_LOADED = 'Cannot unload cargo that is not loaded.';
2282
2192
  const ENTITY_CAPACITY_EXCEEDED = 'Entity cargo capacity would be exceeded.';
2283
2193
  const WAREHOUSE_NOT_FOUND = 'Cannot find warehouse for given id.';
2284
2194
  const WAREHOUSE_ALREADY_AT_LOCATION = 'Warehouse already exists at this location.';
2285
- const WAREHOUSE_CAPACITY_EXCEEDED = 'Warehouse capacity would be exceeded.';
2286
2195
  const CONTAINER_NOT_FOUND = 'Cannot find container for given id.';
2287
- const CONTAINER_CAPACITY_EXCEEDED = 'Container capacity would be exceeded.';
2288
2196
  const DESTINATION_CAPACITY_EXCEEDED = 'Destination entity does not have enough capacity for the gather.';
2289
2197
  const CANCEL_PAIRED_HAS_PENDING = 'Cannot cancel transfer, paired entity has pending tasks.';
2290
2198
  const GROUP_EMPTY = 'Group travel requires at least one entity.';
@@ -2331,12 +2239,13 @@ const INSUFFICIENT_ITEM_SUPPLY = 'Insufficient supply of item at location.';
2331
2239
 
2332
2240
  const PRECISION$1 = 10000;
2333
2241
  const CRAFT_ENERGY_DIVISOR = 150000;
2334
- const WAREHOUSE_Z = 500;
2242
+ const PLANETARY_STRUCTURE_Z = 0;
2335
2243
  const CONTAINER_Z = 300;
2336
2244
  const TRAVEL_MAX_DURATION = 86400;
2337
2245
  const MIN_ORBITAL_ALTITUDE = 800;
2338
2246
  const MAX_ORBITAL_ALTITUDE = 3000;
2339
2247
  const BASE_ORBITAL_MASS = 100000;
2248
+ const MIN_TRANSFER_DISTANCE = 100;
2340
2249
  var TaskType;
2341
2250
  (function (TaskType) {
2342
2251
  TaskType[TaskType["IDLE"] = 0] = "IDLE";
@@ -2350,6 +2259,9 @@ var TaskType;
2350
2259
  TaskType[TaskType["DEPLOY"] = 8] = "DEPLOY";
2351
2260
  TaskType[TaskType["WRAP"] = 9] = "WRAP";
2352
2261
  TaskType[TaskType["UNWRAP"] = 10] = "UNWRAP";
2262
+ TaskType[TaskType["UNDEPLOY"] = 11] = "UNDEPLOY";
2263
+ TaskType[TaskType["WRAP_ENTITY"] = 12] = "WRAP_ENTITY";
2264
+ TaskType[TaskType["DEMOLISH"] = 13] = "DEMOLISH";
2353
2265
  })(TaskType || (TaskType = {}));
2354
2266
  var LocationType;
2355
2267
  (function (LocationType) {
@@ -2357,6 +2269,7 @@ var LocationType;
2357
2269
  LocationType[LocationType["PLANET"] = 1] = "PLANET";
2358
2270
  LocationType[LocationType["ASTEROID"] = 2] = "ASTEROID";
2359
2271
  LocationType[LocationType["NEBULA"] = 3] = "NEBULA";
2272
+ LocationType[LocationType["ICE_FIELD"] = 4] = "ICE_FIELD";
2360
2273
  })(LocationType || (LocationType = {}));
2361
2274
  var TaskCancelable;
2362
2275
  (function (TaskCancelable) {
@@ -2411,6 +2324,9 @@ const CATEGORY_LABELS = {
2411
2324
  function formatTier(tier) {
2412
2325
  return 'T' + tier;
2413
2326
  }
2327
+ function tierAdjective(tier) {
2328
+ return TIER_ADJECTIVES[tier] ?? `T${tier}`;
2329
+ }
2414
2330
 
2415
2331
  const ITEM_ORE_T1 = 101;
2416
2332
  const ITEM_ORE_T2 = 102;
@@ -2479,9 +2395,12 @@ const ITEM_LOADER_T1 = 10103;
2479
2395
  const ITEM_CRAFTER_T1 = 10104;
2480
2396
  const ITEM_STORAGE_T1 = 10105;
2481
2397
  const ITEM_HAULER_T1 = 10106;
2398
+ const ITEM_WARP_T1 = 10107;
2482
2399
  const ITEM_CONTAINER_T1_PACKED = 10200;
2483
2400
  const ITEM_SHIP_T1_PACKED = 10201;
2484
2401
  const ITEM_WAREHOUSE_T1_PACKED = 10202;
2402
+ const ITEM_EXTRACTOR_T1_PACKED = 10203;
2403
+ const ITEM_FACTORY_T1_PACKED = 10204;
2485
2404
  const ITEM_HULL_PLATES_T2 = 20001;
2486
2405
  const ITEM_CARGO_LINING_T2 = 20002;
2487
2406
  const ITEM_CONTAINER_T2_PACKED = 20200;
@@ -2508,6 +2427,55 @@ var items = [
2508
2427
  tier: 3,
2509
2428
  category: "ore"
2510
2429
  },
2430
+ {
2431
+ id: 104,
2432
+ mass: 71000,
2433
+ type: "resource",
2434
+ tier: 4,
2435
+ category: "ore"
2436
+ },
2437
+ {
2438
+ id: 105,
2439
+ mass: 78000,
2440
+ type: "resource",
2441
+ tier: 5,
2442
+ category: "ore"
2443
+ },
2444
+ {
2445
+ id: 106,
2446
+ mass: 87000,
2447
+ type: "resource",
2448
+ tier: 6,
2449
+ category: "ore"
2450
+ },
2451
+ {
2452
+ id: 107,
2453
+ mass: 96000,
2454
+ type: "resource",
2455
+ tier: 7,
2456
+ category: "ore"
2457
+ },
2458
+ {
2459
+ id: 108,
2460
+ mass: 107000,
2461
+ type: "resource",
2462
+ tier: 8,
2463
+ category: "ore"
2464
+ },
2465
+ {
2466
+ id: 109,
2467
+ mass: 118000,
2468
+ type: "resource",
2469
+ tier: 9,
2470
+ category: "ore"
2471
+ },
2472
+ {
2473
+ id: 110,
2474
+ mass: 130000,
2475
+ type: "resource",
2476
+ tier: 10,
2477
+ category: "ore"
2478
+ },
2511
2479
  {
2512
2480
  id: 201,
2513
2481
  mass: 35000,
@@ -2529,6 +2497,55 @@ var items = [
2529
2497
  tier: 3,
2530
2498
  category: "crystal"
2531
2499
  },
2500
+ {
2501
+ id: 204,
2502
+ mass: 35000,
2503
+ type: "resource",
2504
+ tier: 4,
2505
+ category: "crystal"
2506
+ },
2507
+ {
2508
+ id: 205,
2509
+ mass: 35000,
2510
+ type: "resource",
2511
+ tier: 5,
2512
+ category: "crystal"
2513
+ },
2514
+ {
2515
+ id: 206,
2516
+ mass: 35000,
2517
+ type: "resource",
2518
+ tier: 6,
2519
+ category: "crystal"
2520
+ },
2521
+ {
2522
+ id: 207,
2523
+ mass: 35000,
2524
+ type: "resource",
2525
+ tier: 7,
2526
+ category: "crystal"
2527
+ },
2528
+ {
2529
+ id: 208,
2530
+ mass: 35000,
2531
+ type: "resource",
2532
+ tier: 8,
2533
+ category: "crystal"
2534
+ },
2535
+ {
2536
+ id: 209,
2537
+ mass: 35000,
2538
+ type: "resource",
2539
+ tier: 9,
2540
+ category: "crystal"
2541
+ },
2542
+ {
2543
+ id: 210,
2544
+ mass: 35000,
2545
+ type: "resource",
2546
+ tier: 10,
2547
+ category: "crystal"
2548
+ },
2532
2549
  {
2533
2550
  id: 301,
2534
2551
  mass: 15000,
@@ -2550,6 +2567,55 @@ var items = [
2550
2567
  tier: 3,
2551
2568
  category: "gas"
2552
2569
  },
2570
+ {
2571
+ id: 304,
2572
+ mass: 11000,
2573
+ type: "resource",
2574
+ tier: 4,
2575
+ category: "gas"
2576
+ },
2577
+ {
2578
+ id: 305,
2579
+ mass: 10000,
2580
+ type: "resource",
2581
+ tier: 5,
2582
+ category: "gas"
2583
+ },
2584
+ {
2585
+ id: 306,
2586
+ mass: 9000,
2587
+ type: "resource",
2588
+ tier: 6,
2589
+ category: "gas"
2590
+ },
2591
+ {
2592
+ id: 307,
2593
+ mass: 8000,
2594
+ type: "resource",
2595
+ tier: 7,
2596
+ category: "gas"
2597
+ },
2598
+ {
2599
+ id: 308,
2600
+ mass: 7500,
2601
+ type: "resource",
2602
+ tier: 8,
2603
+ category: "gas"
2604
+ },
2605
+ {
2606
+ id: 309,
2607
+ mass: 6500,
2608
+ type: "resource",
2609
+ tier: 9,
2610
+ category: "gas"
2611
+ },
2612
+ {
2613
+ id: 310,
2614
+ mass: 6000,
2615
+ type: "resource",
2616
+ tier: 10,
2617
+ category: "gas"
2618
+ },
2553
2619
  {
2554
2620
  id: 401,
2555
2621
  mass: 22000,
@@ -2571,6 +2637,55 @@ var items = [
2571
2637
  tier: 3,
2572
2638
  category: "regolith"
2573
2639
  },
2640
+ {
2641
+ id: 404,
2642
+ mass: 32000,
2643
+ type: "resource",
2644
+ tier: 4,
2645
+ category: "regolith"
2646
+ },
2647
+ {
2648
+ id: 405,
2649
+ mass: 36000,
2650
+ type: "resource",
2651
+ tier: 5,
2652
+ category: "regolith"
2653
+ },
2654
+ {
2655
+ id: 406,
2656
+ mass: 40500,
2657
+ type: "resource",
2658
+ tier: 6,
2659
+ category: "regolith"
2660
+ },
2661
+ {
2662
+ id: 407,
2663
+ mass: 46000,
2664
+ type: "resource",
2665
+ tier: 7,
2666
+ category: "regolith"
2667
+ },
2668
+ {
2669
+ id: 408,
2670
+ mass: 52000,
2671
+ type: "resource",
2672
+ tier: 8,
2673
+ category: "regolith"
2674
+ },
2675
+ {
2676
+ id: 409,
2677
+ mass: 58500,
2678
+ type: "resource",
2679
+ tier: 9,
2680
+ category: "regolith"
2681
+ },
2682
+ {
2683
+ id: 410,
2684
+ mass: 66000,
2685
+ type: "resource",
2686
+ tier: 10,
2687
+ category: "regolith"
2688
+ },
2574
2689
  {
2575
2690
  id: 501,
2576
2691
  mass: 42000,
@@ -2593,10 +2708,59 @@ var items = [
2593
2708
  category: "biomass"
2594
2709
  },
2595
2710
  {
2596
- id: 10001,
2597
- mass: 50000,
2598
- type: "component",
2599
- tier: 1
2711
+ id: 504,
2712
+ mass: 29000,
2713
+ type: "resource",
2714
+ tier: 4,
2715
+ category: "biomass"
2716
+ },
2717
+ {
2718
+ id: 505,
2719
+ mass: 26000,
2720
+ type: "resource",
2721
+ tier: 5,
2722
+ category: "biomass"
2723
+ },
2724
+ {
2725
+ id: 506,
2726
+ mass: 23000,
2727
+ type: "resource",
2728
+ tier: 6,
2729
+ category: "biomass"
2730
+ },
2731
+ {
2732
+ id: 507,
2733
+ mass: 20000,
2734
+ type: "resource",
2735
+ tier: 7,
2736
+ category: "biomass"
2737
+ },
2738
+ {
2739
+ id: 508,
2740
+ mass: 18000,
2741
+ type: "resource",
2742
+ tier: 8,
2743
+ category: "biomass"
2744
+ },
2745
+ {
2746
+ id: 509,
2747
+ mass: 16000,
2748
+ type: "resource",
2749
+ tier: 9,
2750
+ category: "biomass"
2751
+ },
2752
+ {
2753
+ id: 510,
2754
+ mass: 14000,
2755
+ type: "resource",
2756
+ tier: 10,
2757
+ category: "biomass"
2758
+ },
2759
+ {
2760
+ id: 10001,
2761
+ mass: 50000,
2762
+ type: "component",
2763
+ tier: 1
2600
2764
  },
2601
2765
  {
2602
2766
  id: 10002,
@@ -2701,6 +2865,13 @@ var items = [
2701
2865
  tier: 1,
2702
2866
  subtype: "hauler"
2703
2867
  },
2868
+ {
2869
+ id: 10107,
2870
+ mass: 180000,
2871
+ type: "module",
2872
+ tier: 1,
2873
+ subtype: "warp"
2874
+ },
2704
2875
  {
2705
2876
  id: 10200,
2706
2877
  mass: 80000,
@@ -2719,6 +2890,18 @@ var items = [
2719
2890
  type: "entity",
2720
2891
  tier: 1
2721
2892
  },
2893
+ {
2894
+ id: 10203,
2895
+ mass: 800000,
2896
+ type: "entity",
2897
+ tier: 1
2898
+ },
2899
+ {
2900
+ id: 10204,
2901
+ mass: 800000,
2902
+ type: "entity",
2903
+ tier: 1
2904
+ },
2722
2905
  {
2723
2906
  id: 20001,
2724
2907
  mass: 50000,
@@ -3147,10 +3330,6 @@ var recipes = [
3147
3330
  },
3148
3331
  {
3149
3332
  sources: [
3150
- {
3151
- inputIndex: 1,
3152
- statIndex: 1
3153
- }
3154
3333
  ]
3155
3334
  },
3156
3335
  {
@@ -3190,8 +3369,8 @@ var recipes = [
3190
3369
  {
3191
3370
  sources: [
3192
3371
  {
3193
- inputIndex: 0,
3194
- statIndex: 0
3372
+ inputIndex: 1,
3373
+ statIndex: 1
3195
3374
  }
3196
3375
  ]
3197
3376
  },
@@ -3309,7 +3488,7 @@ var recipes = [
3309
3488
  sources: [
3310
3489
  {
3311
3490
  inputIndex: 0,
3312
- statIndex: 0
3491
+ statIndex: 1
3313
3492
  }
3314
3493
  ]
3315
3494
  },
@@ -3325,12 +3504,38 @@ var recipes = [
3325
3504
  sources: [
3326
3505
  {
3327
3506
  inputIndex: 0,
3328
- statIndex: 1
3507
+ statIndex: 0
3329
3508
  }
3330
3509
  ]
3331
3510
  },
3332
3511
  {
3333
3512
  sources: [
3513
+ ]
3514
+ }
3515
+ ],
3516
+ blendWeights: [
3517
+ ]
3518
+ },
3519
+ {
3520
+ outputItemId: 10107,
3521
+ outputMass: 180000,
3522
+ inputs: [
3523
+ {
3524
+ itemId: 10010,
3525
+ quantity: 6
3526
+ },
3527
+ {
3528
+ itemId: 10009,
3529
+ quantity: 4
3530
+ }
3531
+ ],
3532
+ statSlots: [
3533
+ {
3534
+ sources: [
3535
+ {
3536
+ inputIndex: 0,
3537
+ statIndex: 1
3538
+ },
3334
3539
  {
3335
3540
  inputIndex: 1,
3336
3541
  statIndex: 1
@@ -3339,6 +3544,8 @@ var recipes = [
3339
3544
  }
3340
3545
  ],
3341
3546
  blendWeights: [
3547
+ 1,
3548
+ 1
3342
3549
  ]
3343
3550
  },
3344
3551
  {
@@ -3491,6 +3698,114 @@ var recipes = [
3491
3698
  blendWeights: [
3492
3699
  ]
3493
3700
  },
3701
+ {
3702
+ outputItemId: 10203,
3703
+ outputMass: 800000,
3704
+ inputs: [
3705
+ {
3706
+ itemId: 10001,
3707
+ quantity: 15
3708
+ },
3709
+ {
3710
+ itemId: 10002,
3711
+ quantity: 8
3712
+ }
3713
+ ],
3714
+ statSlots: [
3715
+ {
3716
+ sources: [
3717
+ {
3718
+ inputIndex: 0,
3719
+ statIndex: 0
3720
+ }
3721
+ ]
3722
+ },
3723
+ {
3724
+ sources: [
3725
+ {
3726
+ inputIndex: 0,
3727
+ statIndex: 1
3728
+ }
3729
+ ]
3730
+ },
3731
+ {
3732
+ sources: [
3733
+ {
3734
+ inputIndex: 1,
3735
+ statIndex: 0
3736
+ }
3737
+ ]
3738
+ },
3739
+ {
3740
+ sources: [
3741
+ {
3742
+ inputIndex: 1,
3743
+ statIndex: 1
3744
+ }
3745
+ ]
3746
+ }
3747
+ ],
3748
+ blendWeights: [
3749
+ ]
3750
+ },
3751
+ {
3752
+ outputItemId: 10204,
3753
+ outputMass: 800000,
3754
+ inputs: [
3755
+ {
3756
+ itemId: 10001,
3757
+ quantity: 15
3758
+ },
3759
+ {
3760
+ itemId: 10002,
3761
+ quantity: 6
3762
+ },
3763
+ {
3764
+ itemId: 10008,
3765
+ quantity: 4
3766
+ },
3767
+ {
3768
+ itemId: 10009,
3769
+ quantity: 4
3770
+ }
3771
+ ],
3772
+ statSlots: [
3773
+ {
3774
+ sources: [
3775
+ {
3776
+ inputIndex: 0,
3777
+ statIndex: 0
3778
+ }
3779
+ ]
3780
+ },
3781
+ {
3782
+ sources: [
3783
+ {
3784
+ inputIndex: 0,
3785
+ statIndex: 1
3786
+ }
3787
+ ]
3788
+ },
3789
+ {
3790
+ sources: [
3791
+ {
3792
+ inputIndex: 1,
3793
+ statIndex: 0
3794
+ }
3795
+ ]
3796
+ },
3797
+ {
3798
+ sources: [
3799
+ {
3800
+ inputIndex: 1,
3801
+ statIndex: 1
3802
+ }
3803
+ ]
3804
+ }
3805
+ ],
3806
+ blendWeights: [
3807
+ ]
3808
+ },
3494
3809
  {
3495
3810
  outputItemId: 20001,
3496
3811
  outputMass: 50000,
@@ -3649,19 +3964,24 @@ var entities = [
3649
3964
  entityItemId: 10201,
3650
3965
  slots: [
3651
3966
  {
3652
- type: "any"
3967
+ type: "any",
3968
+ outputPct: 100
3653
3969
  },
3654
3970
  {
3655
- type: "any"
3971
+ type: "any",
3972
+ outputPct: 100
3656
3973
  },
3657
3974
  {
3658
- type: "any"
3975
+ type: "any",
3976
+ outputPct: 100
3659
3977
  },
3660
3978
  {
3661
- type: "any"
3979
+ type: "any",
3980
+ outputPct: 100
3662
3981
  },
3663
3982
  {
3664
- type: "any"
3983
+ type: "any",
3984
+ outputPct: 100
3665
3985
  }
3666
3986
  ]
3667
3987
  },
@@ -3669,19 +3989,50 @@ var entities = [
3669
3989
  entityItemId: 10202,
3670
3990
  slots: [
3671
3991
  {
3672
- type: "loader"
3992
+ type: "loader",
3993
+ outputPct: 100
3994
+ },
3995
+ {
3996
+ type: "storage",
3997
+ outputPct: 100
3673
3998
  },
3674
3999
  {
3675
- type: "storage"
4000
+ type: "storage",
4001
+ outputPct: 100
3676
4002
  },
3677
4003
  {
3678
- type: "storage"
4004
+ type: "storage",
4005
+ outputPct: 100
4006
+ },
4007
+ {
4008
+ type: "storage",
4009
+ outputPct: 100
4010
+ }
4011
+ ]
4012
+ },
4013
+ {
4014
+ entityItemId: 10203,
4015
+ slots: [
4016
+ {
4017
+ type: "generator",
4018
+ outputPct: 100
3679
4019
  },
3680
4020
  {
3681
- type: "storage"
4021
+ type: "gatherer",
4022
+ outputPct: 100
4023
+ }
4024
+ ]
4025
+ },
4026
+ {
4027
+ entityItemId: 10204,
4028
+ slots: [
4029
+ {
4030
+ type: "generator",
4031
+ outputPct: 100
3682
4032
  },
3683
4033
  {
3684
- type: "storage"
4034
+ type: "crafter",
4035
+ outputPct: 100
3685
4036
  }
3686
4037
  ]
3687
4038
  },
@@ -3692,78 +4043,6 @@ var entities = [
3692
4043
  }
3693
4044
  ];
3694
4045
 
3695
- const categoryColors = {
3696
- ore: '#C26D3F',
3697
- crystal: '#4ADBFF',
3698
- gas: '#B8E4A0',
3699
- regolith: '#C4A57B',
3700
- biomass: '#5A8B3E',
3701
- };
3702
- const tierColors = {
3703
- 1: '#8b8b8b',
3704
- 2: '#4ade80',
3705
- 3: '#818cf8',
3706
- 4: '#c084fc',
3707
- 5: '#fbbf24',
3708
- 6: '#f97316',
3709
- 7: '#ef4444',
3710
- 8: '#ec4899',
3711
- 9: '#06b6d4',
3712
- 10: '#ffffff',
3713
- };
3714
- const tierLabels = {
3715
- 1: 'Common',
3716
- 2: 'Uncommon',
3717
- 3: 'Rare',
3718
- 4: 'Epic',
3719
- 5: 'Legendary',
3720
- 6: 'Mythic',
3721
- 7: 'Divine',
3722
- 8: 'Celestial',
3723
- 9: 'Eternal',
3724
- 10: 'Transcendent',
3725
- };
3726
- const categoryIcons = {
3727
- ore: '⬡',
3728
- crystal: '◈',
3729
- gas: '◎',
3730
- regolith: '■',
3731
- biomass: '❋',
3732
- };
3733
- const categoryIconShapes = {
3734
- ore: 'hex',
3735
- crystal: 'diamond',
3736
- gas: 'circle',
3737
- regolith: 'square',
3738
- biomass: 'star',
3739
- };
3740
- const componentIcon = '▣';
3741
- const moduleIcon = '⬢';
3742
- const itemAbbreviations = {
3743
- 10001: 'HP',
3744
- 10002: 'CL',
3745
- 10003: 'TC',
3746
- 10004: 'PC',
3747
- 10005: 'DS',
3748
- 10006: 'EP',
3749
- 10007: 'CA',
3750
- 10008: 'TB',
3751
- 10009: 'RC',
3752
- 10010: 'FA',
3753
- 10100: 'EN',
3754
- 10101: 'GN',
3755
- 10102: 'EX',
3756
- 10103: 'LD',
3757
- 10104: 'MF',
3758
- 10105: 'ST',
3759
- 10200: 'CT',
3760
- 10201: 'SH',
3761
- 10202: 'WH',
3762
- 20001: 'HP',
3763
- 20002: 'CL',
3764
- 20200: 'CT',
3765
- };
3766
-
3767
4046
  const itemMetadata = {
3768
4047
  101: { name: 'Ore', description: 'Crude metallic ore.', color: '#C26D3F' },
3769
4048
  102: { name: 'Ore', description: 'Refined metallic ore with improved purity.', color: '#C26D3F' },
@@ -3772,6 +4051,13 @@ const itemMetadata = {
3772
4051
  description: 'High-grade metallic ore with exceptional density.',
3773
4052
  color: '#C26D3F',
3774
4053
  },
4054
+ 104: { name: 'Ore', description: '', color: '#C26D3F' },
4055
+ 105: { name: 'Ore', description: '', color: '#C26D3F' },
4056
+ 106: { name: 'Ore', description: '', color: '#C26D3F' },
4057
+ 107: { name: 'Ore', description: '', color: '#C26D3F' },
4058
+ 108: { name: 'Ore', description: '', color: '#C26D3F' },
4059
+ 109: { name: 'Ore', description: '', color: '#C26D3F' },
4060
+ 110: { name: 'Ore', description: '', color: '#C26D3F' },
3775
4061
  201: { name: 'Crystal', description: 'Raw resonant crystal.', color: '#4ADBFF' },
3776
4062
  202: {
3777
4063
  name: 'Crystal',
@@ -3783,6 +4069,13 @@ const itemMetadata = {
3783
4069
  description: 'High-grade resonant crystal with exceptional purity.',
3784
4070
  color: '#4ADBFF',
3785
4071
  },
4072
+ 204: { name: 'Crystal', description: '', color: '#4ADBFF' },
4073
+ 205: { name: 'Crystal', description: '', color: '#4ADBFF' },
4074
+ 206: { name: 'Crystal', description: '', color: '#4ADBFF' },
4075
+ 207: { name: 'Crystal', description: '', color: '#4ADBFF' },
4076
+ 208: { name: 'Crystal', description: '', color: '#4ADBFF' },
4077
+ 209: { name: 'Crystal', description: '', color: '#4ADBFF' },
4078
+ 210: { name: 'Crystal', description: '', color: '#4ADBFF' },
3786
4079
  301: { name: 'Gas', description: 'Raw volatile gas.', color: '#B8E4A0' },
3787
4080
  302: {
3788
4081
  name: 'Gas',
@@ -3794,6 +4087,13 @@ const itemMetadata = {
3794
4087
  description: 'High-grade volatile gas with exceptional energy density.',
3795
4088
  color: '#B8E4A0',
3796
4089
  },
4090
+ 304: { name: 'Gas', description: '', color: '#B8E4A0' },
4091
+ 305: { name: 'Gas', description: '', color: '#B8E4A0' },
4092
+ 306: { name: 'Gas', description: '', color: '#B8E4A0' },
4093
+ 307: { name: 'Gas', description: '', color: '#B8E4A0' },
4094
+ 308: { name: 'Gas', description: '', color: '#B8E4A0' },
4095
+ 309: { name: 'Gas', description: '', color: '#B8E4A0' },
4096
+ 310: { name: 'Gas', description: '', color: '#B8E4A0' },
3797
4097
  401: { name: 'Regolith', description: 'Crude regolith dust.', color: '#C4A57B' },
3798
4098
  402: {
3799
4099
  name: 'Regolith',
@@ -3805,6 +4105,13 @@ const itemMetadata = {
3805
4105
  description: 'High-grade regolith with exceptional uniformity.',
3806
4106
  color: '#C4A57B',
3807
4107
  },
4108
+ 404: { name: 'Regolith', description: '', color: '#C4A57B' },
4109
+ 405: { name: 'Regolith', description: '', color: '#C4A57B' },
4110
+ 406: { name: 'Regolith', description: '', color: '#C4A57B' },
4111
+ 407: { name: 'Regolith', description: '', color: '#C4A57B' },
4112
+ 408: { name: 'Regolith', description: '', color: '#C4A57B' },
4113
+ 409: { name: 'Regolith', description: '', color: '#C4A57B' },
4114
+ 410: { name: 'Regolith', description: '', color: '#C4A57B' },
3808
4115
  501: { name: 'Biomass', description: 'Crude organic biomass.', color: '#5A8B3E' },
3809
4116
  502: {
3810
4117
  name: 'Biomass',
@@ -3816,6 +4123,13 @@ const itemMetadata = {
3816
4123
  description: 'High-grade biomass with exceptional saturation.',
3817
4124
  color: '#5A8B3E',
3818
4125
  },
4126
+ 504: { name: 'Biomass', description: '', color: '#5A8B3E' },
4127
+ 505: { name: 'Biomass', description: '', color: '#5A8B3E' },
4128
+ 506: { name: 'Biomass', description: '', color: '#5A8B3E' },
4129
+ 507: { name: 'Biomass', description: '', color: '#5A8B3E' },
4130
+ 508: { name: 'Biomass', description: '', color: '#5A8B3E' },
4131
+ 509: { name: 'Biomass', description: '', color: '#5A8B3E' },
4132
+ 510: { name: 'Biomass', description: '', color: '#5A8B3E' },
3819
4133
  10001: {
3820
4134
  name: 'Hull Plates',
3821
4135
  description: 'Structural plating formed from ore. Used in hulls, containers, and frames.',
@@ -3901,6 +4215,11 @@ const itemMetadata = {
3901
4215
  description: 'Projects a haul beam to lock onto and transport containers or warehouses through group travel.',
3902
4216
  color: '#4ADBFF',
3903
4217
  },
4218
+ 10107: {
4219
+ name: 'Warp',
4220
+ description: 'Folds local space-time around the hull, projecting the ship across vast distances in a single discharge of the entire energy reserve.',
4221
+ color: '#9be4ff',
4222
+ },
3904
4223
  10200: {
3905
4224
  name: 'Container',
3906
4225
  description: 'Passive floating cargo storage in space. Towed by ships.',
@@ -3916,6 +4235,16 @@ const itemMetadata = {
3916
4235
  description: 'Massive stationary storage facility with a single loader module slot.',
3917
4236
  color: '#EAB308',
3918
4237
  },
4238
+ 10203: {
4239
+ name: 'Extractor',
4240
+ description: 'Planetary resource extraction facility with generator and gatherer module slots.',
4241
+ color: '#D4726F',
4242
+ },
4243
+ 10204: {
4244
+ name: 'Factory',
4245
+ description: 'Planetary fabrication facility with generator and crafter module slots.',
4246
+ color: '#7BA7D4',
4247
+ },
3919
4248
  20001: {
3920
4249
  name: 'Hull Plates',
3921
4250
  description: 'Advanced structural plating reinforced with tier 2 ore.',
@@ -3935,6 +4264,8 @@ const itemMetadata = {
3935
4264
  const entityMetadata = {
3936
4265
  10201: { moduleSlotLabels: ['Engine', 'Generator', 'Gatherer', 'Loader', 'Storage'] },
3937
4266
  10202: { moduleSlotLabels: ['Loader', 'Storage', 'Storage', 'Storage', 'Storage'] },
4267
+ 10203: { moduleSlotLabels: ['Generator', 'Gatherer'] },
4268
+ 10204: { moduleSlotLabels: ['Generator', 'Crafter'] },
3938
4269
  };
3939
4270
  for (const item of items) {
3940
4271
  if (!itemMetadata[item.id]) {
@@ -4040,9 +4371,6 @@ function typeLabel(type) {
4040
4371
  function categoryLabel(cat) {
4041
4372
  return CATEGORY_LABELS[cat];
4042
4373
  }
4043
- function tierLabel(tier) {
4044
- return tierLabels[tier] ?? `T${tier}`;
4045
- }
4046
4374
  const CATEGORY_BY_INDEX = ['ore', 'gas', 'regolith', 'biomass', 'crystal'];
4047
4375
  function categoryFromIndex(i) {
4048
4376
  return CATEGORY_BY_INDEX[i];
@@ -4105,10 +4433,15 @@ function hash512(seed, string) {
4105
4433
  }
4106
4434
 
4107
4435
  const DEPTH_THRESHOLD_T1 = 0;
4108
- const DEPTH_THRESHOLD_T2 = 2000;
4109
- const DEPTH_THRESHOLD_T3 = 10000;
4110
- const DEPTH_THRESHOLD_T4 = 30000;
4111
- const DEPTH_THRESHOLD_T5 = 55000;
4436
+ const DEPTH_THRESHOLD_T2 = 1500;
4437
+ const DEPTH_THRESHOLD_T3 = 5000;
4438
+ const DEPTH_THRESHOLD_T4 = 12000;
4439
+ const DEPTH_THRESHOLD_T5 = 22000;
4440
+ const DEPTH_THRESHOLD_T6 = 32000;
4441
+ const DEPTH_THRESHOLD_T7 = 42000;
4442
+ const DEPTH_THRESHOLD_T8 = 50000;
4443
+ const DEPTH_THRESHOLD_T9 = 57000;
4444
+ const DEPTH_THRESHOLD_T10 = 63000;
4112
4445
  const LOCATION_MIN_DEPTH = 500;
4113
4446
  const LOCATION_MAX_DEPTH = 65535;
4114
4447
  const YIELD_THRESHOLD = Math.floor(0.001 * 0xffffffff);
@@ -4118,19 +4451,22 @@ const PLANET_SUBTYPE_TERRESTRIAL = 2;
4118
4451
  const PLANET_SUBTYPE_ICY = 3;
4119
4452
  const PLANET_SUBTYPE_OCEAN = 4;
4120
4453
  const PLANET_SUBTYPE_INDUSTRIAL = 5;
4454
+ const DEPTH_THRESHOLD_TABLE = [
4455
+ DEPTH_THRESHOLD_T1,
4456
+ DEPTH_THRESHOLD_T2,
4457
+ DEPTH_THRESHOLD_T3,
4458
+ DEPTH_THRESHOLD_T4,
4459
+ DEPTH_THRESHOLD_T5,
4460
+ DEPTH_THRESHOLD_T6,
4461
+ DEPTH_THRESHOLD_T7,
4462
+ DEPTH_THRESHOLD_T8,
4463
+ DEPTH_THRESHOLD_T9,
4464
+ DEPTH_THRESHOLD_T10,
4465
+ ];
4121
4466
  function getDepthThreshold(tier) {
4122
- switch (tier) {
4123
- case 1:
4124
- return DEPTH_THRESHOLD_T1;
4125
- case 2:
4126
- return DEPTH_THRESHOLD_T2;
4127
- case 3:
4128
- return DEPTH_THRESHOLD_T3;
4129
- case 4:
4130
- return DEPTH_THRESHOLD_T4;
4131
- default:
4132
- return DEPTH_THRESHOLD_T5;
4133
- }
4467
+ if (tier < 1 || tier > 10)
4468
+ return 65535;
4469
+ return DEPTH_THRESHOLD_TABLE[tier - 1];
4134
4470
  }
4135
4471
  function getResourceTier(itemId) {
4136
4472
  return getItem(itemId).tier;
@@ -4143,11 +4479,11 @@ function getResourceWeight(itemId, stratum) {
4143
4479
  const depthAbove = stratum - threshold;
4144
4480
  switch (tier) {
4145
4481
  case 1:
4146
- if (stratum < 2000)
4482
+ if (stratum < DEPTH_THRESHOLD_T2)
4147
4483
  return 100;
4148
- if (stratum < 10000)
4484
+ if (stratum < DEPTH_THRESHOLD_T3)
4149
4485
  return 80;
4150
- if (stratum < 30000)
4486
+ if (stratum < DEPTH_THRESHOLD_T4)
4151
4487
  return 50;
4152
4488
  return 30;
4153
4489
  case 2:
@@ -4172,37 +4508,97 @@ function getResourceWeight(itemId, stratum) {
4172
4508
  return 10;
4173
4509
  }
4174
4510
  }
4175
- const ASTEROID_RESOURCES = [101, 102, 103, 201, 202];
4176
- const NEBULA_RESOURCES = [202, 203, 301, 302, 303];
4177
- const GAS_GIANT_RESOURCES = [301, 302, 303, 401, 501];
4178
- const ROCKY_RESOURCES = [101, 102, 103, 401, 402, 403, 503];
4179
- const TERRESTRIAL_RESOURCES = [201, 202, 401, 402, 501, 502, 503];
4180
- const ICY_RESOURCES = [101, 301, 302, 401, 403, 501, 502];
4181
- const OCEAN_RESOURCES = [201, 203, 301, 303, 501, 502, 503];
4182
- const INDUSTRIAL_RESOURCES = [101, 102, 103, 201, 203, 402, 403];
4183
- function getLocationCandidates(locationType, subtype) {
4184
- if (locationType === 2)
4185
- return ASTEROID_RESOURCES;
4186
- if (locationType === 3)
4187
- return NEBULA_RESOURCES;
4188
- if (locationType === 1) {
4511
+ const RESOURCE_ORE = 0;
4512
+ const RESOURCE_GAS = 1;
4513
+ const RESOURCE_REGOLITH = 2;
4514
+ const RESOURCE_BIOMASS = 3;
4515
+ const RESOURCE_CRYSTAL = 4;
4516
+ function categoryBaseId(category) {
4517
+ switch (category) {
4518
+ case RESOURCE_ORE:
4519
+ return 100;
4520
+ case RESOURCE_CRYSTAL:
4521
+ return 200;
4522
+ case RESOURCE_GAS:
4523
+ return 300;
4524
+ case RESOURCE_REGOLITH:
4525
+ return 400;
4526
+ case RESOURCE_BIOMASS:
4527
+ return 500;
4528
+ default:
4529
+ return 0;
4530
+ }
4531
+ }
4532
+ function resourceId(category, tier) {
4533
+ return categoryBaseId(category) + tier;
4534
+ }
4535
+ function getLocationProfile(locationType, subtype) {
4536
+ if (locationType === LocationType.ASTEROID) {
4537
+ return [
4538
+ { category: RESOURCE_ORE, maxTier: 5 },
4539
+ { category: RESOURCE_CRYSTAL, maxTier: 5 },
4540
+ ];
4541
+ }
4542
+ if (locationType === LocationType.NEBULA) {
4543
+ return [
4544
+ { category: RESOURCE_GAS, maxTier: 5 },
4545
+ { category: RESOURCE_REGOLITH, maxTier: 5 },
4546
+ ];
4547
+ }
4548
+ if (locationType === LocationType.ICE_FIELD) {
4549
+ return [
4550
+ { category: RESOURCE_GAS, maxTier: 5 },
4551
+ { category: RESOURCE_BIOMASS, maxTier: 5 },
4552
+ ];
4553
+ }
4554
+ if (locationType === LocationType.PLANET) {
4189
4555
  switch (subtype) {
4190
4556
  case PLANET_SUBTYPE_GAS_GIANT:
4191
- return GAS_GIANT_RESOURCES;
4557
+ return [
4558
+ { category: RESOURCE_GAS, maxTier: 10 },
4559
+ { category: RESOURCE_CRYSTAL, maxTier: 3 },
4560
+ ];
4192
4561
  case PLANET_SUBTYPE_ROCKY:
4193
- return ROCKY_RESOURCES;
4562
+ return [
4563
+ { category: RESOURCE_REGOLITH, maxTier: 10 },
4564
+ { category: RESOURCE_ORE, maxTier: 3 },
4565
+ ];
4194
4566
  case PLANET_SUBTYPE_TERRESTRIAL:
4195
- return TERRESTRIAL_RESOURCES;
4567
+ return [
4568
+ { category: RESOURCE_ORE, maxTier: 10 },
4569
+ { category: RESOURCE_BIOMASS, maxTier: 3 },
4570
+ ];
4196
4571
  case PLANET_SUBTYPE_ICY:
4197
- return ICY_RESOURCES;
4572
+ return [
4573
+ { category: RESOURCE_CRYSTAL, maxTier: 10 },
4574
+ { category: RESOURCE_REGOLITH, maxTier: 3 },
4575
+ ];
4198
4576
  case PLANET_SUBTYPE_OCEAN:
4199
- return OCEAN_RESOURCES;
4577
+ return [
4578
+ { category: RESOURCE_BIOMASS, maxTier: 10 },
4579
+ { category: RESOURCE_GAS, maxTier: 3 },
4580
+ ];
4200
4581
  case PLANET_SUBTYPE_INDUSTRIAL:
4201
- return INDUSTRIAL_RESOURCES;
4582
+ return [
4583
+ { category: RESOURCE_ORE, maxTier: 3 },
4584
+ { category: RESOURCE_CRYSTAL, maxTier: 3 },
4585
+ { category: RESOURCE_REGOLITH, maxTier: 3 },
4586
+ { category: RESOURCE_BIOMASS, maxTier: 3 },
4587
+ ];
4202
4588
  }
4203
4589
  }
4204
4590
  return [];
4205
4591
  }
4592
+ function getLocationCandidates(locationType, subtype) {
4593
+ const profile = getLocationProfile(locationType, subtype);
4594
+ const ids = [];
4595
+ for (const { category, maxTier } of profile) {
4596
+ for (let tier = 1; tier <= maxTier; tier++) {
4597
+ ids.push(resourceId(category, tier));
4598
+ }
4599
+ }
4600
+ return ids;
4601
+ }
4206
4602
  function getEligibleResources(locationType, subtype, stratum) {
4207
4603
  const candidates = getLocationCandidates(locationType, subtype);
4208
4604
  return candidates.filter((itemId) => {
@@ -6378,7 +6774,6 @@ var nebulaNouns = [
6378
6774
  ];
6379
6775
 
6380
6776
  const LOCATION_EXISTS_THRESHOLD = 0x10;
6381
- const LOCATION_ACTIVE_THRESHOLD = 0x80;
6382
6777
  function getLocationType(gameSeed, coordinates) {
6383
6778
  const seed = Checksum256.from(gameSeed);
6384
6779
  const str = ['system', coordinates.x, coordinates.y].join('-');
@@ -6386,13 +6781,13 @@ function getLocationType(gameSeed, coordinates) {
6386
6781
  if (hashResult.array[0] >= LOCATION_EXISTS_THRESHOLD) {
6387
6782
  return LocationType.EMPTY;
6388
6783
  }
6389
- if (hashResult.array[1] < 96) {
6784
+ if (hashResult.array[1] < 96)
6390
6785
  return LocationType.PLANET;
6391
- }
6392
- else if (hashResult.array[1] < 176) {
6786
+ if (hashResult.array[1] < 149)
6393
6787
  return LocationType.ASTEROID;
6394
- }
6395
- return LocationType.NEBULA;
6788
+ if (hashResult.array[1] < 202)
6789
+ return LocationType.NEBULA;
6790
+ return LocationType.ICE_FIELD;
6396
6791
  }
6397
6792
  function isGatherableLocation(locationType) {
6398
6793
  return locationType !== LocationType.EMPTY;
@@ -6407,6 +6802,8 @@ function getLocationTypeName(type) {
6407
6802
  return 'Asteroid';
6408
6803
  case LocationType.NEBULA:
6409
6804
  return 'Nebula';
6805
+ case LocationType.ICE_FIELD:
6806
+ return 'Ice Field';
6410
6807
  }
6411
6808
  }
6412
6809
  function uint16(hash, offset) {
@@ -6434,6 +6831,14 @@ function generateNebulaName(hashResult) {
6434
6831
  const nounIdx = uint16(hashResult, 2) % nebulaNouns.length;
6435
6832
  return `${nebulaAdjectives[adjIdx]} ${nebulaNouns[nounIdx]}`;
6436
6833
  }
6834
+ function generateIceFieldName(hashResult) {
6835
+ const A = 65;
6836
+ const letter1 = String.fromCharCode(A + (hashResult.array[0] % 26));
6837
+ const letter2 = String.fromCharCode(A + (hashResult.array[1] % 26));
6838
+ const subId = (hashResult.array[2] % 9) + 1;
6839
+ const num = (uint16(hashResult, 3) % 9000) + 1000;
6840
+ return `${letter1}${letter2}-${subId}/${num}`;
6841
+ }
6437
6842
  function getSystemName(gameSeed, location) {
6438
6843
  const seed = Checksum256.from(gameSeed);
6439
6844
  const locationType = getLocationType(seed, location);
@@ -6449,6 +6854,8 @@ function getSystemName(gameSeed, location) {
6449
6854
  return generateAsteroidName(hashResult);
6450
6855
  case LocationType.NEBULA:
6451
6856
  return generateNebulaName(hashResult);
6857
+ case LocationType.ICE_FIELD:
6858
+ return generateIceFieldName(hashResult);
6452
6859
  default:
6453
6860
  return generatePlanetName(hashResult);
6454
6861
  }
@@ -6474,33 +6881,27 @@ function deriveLocationStatic(gameSeed, coordinates) {
6474
6881
  if (hashResult.array[1] < 96) {
6475
6882
  loc.type = UInt8.from(LocationType.PLANET);
6476
6883
  }
6477
- else if (hashResult.array[1] < 176) {
6884
+ else if (hashResult.array[1] < 149) {
6478
6885
  loc.type = UInt8.from(LocationType.ASTEROID);
6479
6886
  }
6480
- else {
6887
+ else if (hashResult.array[1] < 202) {
6481
6888
  loc.type = UInt8.from(LocationType.NEBULA);
6482
6889
  }
6890
+ else {
6891
+ loc.type = UInt8.from(LocationType.ICE_FIELD);
6892
+ }
6483
6893
  loc.subtype = UInt8.from(Number(loc.type) === LocationType.PLANET ? hashResult.array[2] % 6 : hashResult.array[2]);
6484
6894
  loc.seed0 = UInt8.from(hashResult.array[3]);
6485
6895
  loc.seed1 = UInt8.from(hashResult.array[4]);
6486
6896
  return loc;
6487
6897
  }
6488
- function deriveLocationEpoch(epochSeed, coordinates) {
6489
- const seed = Checksum256.from(epochSeed);
6490
- const coords = Coordinates.from(coordinates);
6491
- const str = `system-epoch-${coords.x}-${coords.y}`;
6492
- const hashResult = hash512(seed, str);
6493
- return Types.location_epoch.from({
6494
- active: hashResult.array[0] < LOCATION_ACTIVE_THRESHOLD,
6495
- seed0: hashResult.array[1],
6496
- seed1: hashResult.array[2],
6497
- });
6898
+ function isLocationBuildable(gameSeed, coordinates) {
6899
+ return getLocationType(gameSeed, coordinates) === LocationType.PLANET;
6498
6900
  }
6499
- function deriveLocation(gameSeed, epochSeed, coordinates) {
6901
+ function deriveLocation(gameSeed, coordinates) {
6500
6902
  const staticProps = deriveLocationStatic(gameSeed, coordinates);
6501
6903
  return Types.location_derived.from({
6502
6904
  static_props: staticProps,
6503
- epoch_props: deriveLocationEpoch(epochSeed, coordinates),
6504
6905
  size: deriveLocationSize(staticProps),
6505
6906
  });
6506
6907
  }
@@ -6527,9 +6928,6 @@ class GameState extends Types.state_row {
6527
6928
  get isEnabled() {
6528
6929
  return this.enabled;
6529
6930
  }
6530
- get shipCount() {
6531
- return Number(this.ships);
6532
- }
6533
6931
  get currentSalt() {
6534
6932
  return this.salt;
6535
6933
  }
@@ -6570,7 +6968,6 @@ class GameState extends Types.state_row {
6570
6968
  return {
6571
6969
  enabled: this.enabled,
6572
6970
  epoch: this.epoch.toString(),
6573
- ships: this.shipCount,
6574
6971
  hasSeed: !this.seed.equals(Checksum256.from('0'.repeat(64))),
6575
6972
  hasCommit: !this.commit.equals(Checksum256.from('0'.repeat(64))),
6576
6973
  };
@@ -6622,6 +7019,40 @@ function lerp$1(origin, destination, time) {
6622
7019
  y: (1 - time) * Number(origin.y) + time * Number(destination.y),
6623
7020
  };
6624
7021
  }
7022
+ function easeFlightProgress(t) {
7023
+ if (t <= 0)
7024
+ return 0;
7025
+ if (t >= 1)
7026
+ return 1;
7027
+ return t < 0.5 ? 2 * t * t : 1 - 2 * (1 - t) * (1 - t);
7028
+ }
7029
+ function flightSpeedFactor(t) {
7030
+ if (t <= 0 || t >= 1)
7031
+ return 0;
7032
+ return t < 0.5 ? 4 * t : 4 * (1 - t);
7033
+ }
7034
+ function interpolateFlightPosition(origin, destination, taskProgress, options) {
7035
+ const t = options?.easing === 'linear' ? taskProgress : easeFlightProgress(taskProgress);
7036
+ return {
7037
+ x: (1 - t) * Number(origin.x) + t * Number(destination.x),
7038
+ y: (1 - t) * Number(origin.y) + t * Number(destination.y),
7039
+ };
7040
+ }
7041
+ function getInterpolatedPosition(entity, taskIndex, taskProgress) {
7042
+ if (!entity.schedule || entity.schedule.tasks.length === 0) {
7043
+ return { x: Number(entity.coordinates.x), y: Number(entity.coordinates.y) };
7044
+ }
7045
+ if (taskIndex < 0) {
7046
+ const settled = getFlightOrigin(entity, entity.schedule.tasks.length);
7047
+ return { x: Number(settled.x), y: Number(settled.y) };
7048
+ }
7049
+ const task = entity.schedule.tasks[taskIndex];
7050
+ if (!task.type.equals(TaskType.TRAVEL) || !task.coordinates) {
7051
+ const origin = getFlightOrigin(entity, taskIndex);
7052
+ return { x: Number(origin.x), y: Number(origin.y) };
7053
+ }
7054
+ return interpolateFlightPosition(getFlightOrigin(entity, taskIndex), task.coordinates, taskProgress);
7055
+ }
6625
7056
  function rotation(origin, destination) {
6626
7057
  return Math.atan2(destination.y - origin.y, destination.x - origin.x) * (180 / Math.PI) + 90;
6627
7058
  }
@@ -6831,9 +7262,12 @@ function getDestinationLocation(entity) {
6831
7262
  return undefined;
6832
7263
  }
6833
7264
  function getPositionAt(entity, taskIndex, taskProgress) {
6834
- if (!entity.schedule || entity.schedule.tasks.length === 0 || taskIndex < 0) {
7265
+ if (!entity.schedule || entity.schedule.tasks.length === 0) {
6835
7266
  return entity.coordinates;
6836
7267
  }
7268
+ if (taskIndex < 0) {
7269
+ return getFlightOrigin(entity, entity.schedule.tasks.length);
7270
+ }
6837
7271
  const task = entity.schedule.tasks[taskIndex];
6838
7272
  if (!task.type.equals(TaskType.TRAVEL) || !task.coordinates) {
6839
7273
  return getFlightOrigin(entity, taskIndex);
@@ -6886,7 +7320,8 @@ function calc_transfer_duration(source, dest, cargoMass) {
6886
7320
  ? source.location.z
6887
7321
  : (source.location.z?.toNumber() ?? 0);
6888
7322
  const destZ = typeof dest.location.z === 'number' ? dest.location.z : (dest.location.z?.toNumber() ?? 0);
6889
- const distance = Math.abs(sourceZ - destZ);
7323
+ const rawDistance = Math.abs(sourceZ - destZ);
7324
+ const distance = rawDistance < MIN_TRANSFER_DISTANCE ? MIN_TRANSFER_DISTANCE : rawDistance;
6890
7325
  const totalMass = cargoMass + totalLoaderMass;
6891
7326
  const acceleration = calc_acceleration(totalThrust, totalMass);
6892
7327
  const flightTime = 2 * Math.sqrt(distance / acceleration);
@@ -6965,7 +7400,7 @@ function cargoItemToStack(item) {
6965
7400
  return {
6966
7401
  item_id: UInt16.from(item.item_id),
6967
7402
  quantity: UInt32.from(item.quantity),
6968
- stats: item.stats,
7403
+ stats: UInt64.from(item.stats),
6969
7404
  modules: item.modules ?? [],
6970
7405
  };
6971
7406
  }
@@ -7062,7 +7497,7 @@ function currentTaskIndex(entity, now) {
7062
7497
  }
7063
7498
  timeAccum += taskDuration;
7064
7499
  }
7065
- return entity.schedule.tasks.length - 1;
7500
+ return -1;
7066
7501
  }
7067
7502
  function currentTask(entity, now) {
7068
7503
  const index = currentTaskIndex(entity, now);
@@ -7128,6 +7563,23 @@ function currentTaskProgress(entity, now) {
7128
7563
  return 1;
7129
7564
  return Math.min(1, elapsed / duration);
7130
7565
  }
7566
+ function currentTaskProgressFloat(entity, now) {
7567
+ if (!entity.schedule || entity.schedule.tasks.length === 0)
7568
+ return 0;
7569
+ const index = currentTaskIndex(entity, now);
7570
+ if (index < 0)
7571
+ return 0;
7572
+ const task = entity.schedule.tasks[index];
7573
+ const durationMs = task.duration.toNumber() * 1000;
7574
+ if (durationMs === 0)
7575
+ return 1;
7576
+ const startedMs = entity.schedule.started.toDate().getTime();
7577
+ const taskStartMs = startedMs + getTaskStartTime(entity, index) * 1000;
7578
+ const elapsedMs = now.getTime() - taskStartMs;
7579
+ if (elapsedMs <= 0)
7580
+ return 0;
7581
+ return Math.min(1, elapsedMs / durationMs);
7582
+ }
7131
7583
  function scheduleProgress(entity, now) {
7132
7584
  const duration = scheduleDuration(entity);
7133
7585
  if (duration === 0)
@@ -7172,6 +7624,7 @@ var schedule = /*#__PURE__*/Object.freeze({
7172
7624
  isTaskComplete: isTaskComplete,
7173
7625
  isTaskInProgress: isTaskInProgress,
7174
7626
  currentTaskProgress: currentTaskProgress,
7627
+ currentTaskProgressFloat: currentTaskProgressFloat,
7175
7628
  scheduleProgress: scheduleProgress,
7176
7629
  isTaskType: isTaskType,
7177
7630
  isInFlight: isInFlight,
@@ -7352,6 +7805,10 @@ function applyTask(projected, task) {
7352
7805
  case TaskType.DEPLOY:
7353
7806
  applyDeployTask(projected, task);
7354
7807
  break;
7808
+ case TaskType.UNDEPLOY:
7809
+ case TaskType.WRAP_ENTITY:
7810
+ case TaskType.DEMOLISH:
7811
+ break;
7355
7812
  }
7356
7813
  }
7357
7814
  function projectEntity(entity, options) {
@@ -7456,7 +7913,7 @@ function validateCraftTask(task, projected) {
7456
7913
  }
7457
7914
  }
7458
7915
  if (!found)
7459
- throw new Error(SHIP_CARGO_NOT_LOADED);
7916
+ throw new Error(ENTITY_CARGO_NOT_LOADED);
7460
7917
  }
7461
7918
  }
7462
7919
  function validateSchedule(entity) {
@@ -7517,6 +7974,10 @@ function projectEntityAt(entity, now) {
7517
7974
  if (taskComplete)
7518
7975
  applyDeployTask(projected, task);
7519
7976
  break;
7977
+ case TaskType.UNDEPLOY:
7978
+ case TaskType.WRAP_ENTITY:
7979
+ case TaskType.DEMOLISH:
7980
+ break;
7520
7981
  }
7521
7982
  }
7522
7983
  return projected;
@@ -7620,6 +8081,9 @@ class ScheduleAccessor {
7620
8081
  currentTaskProgress(now) {
7621
8082
  return currentTaskProgress(this.entity, now);
7622
8083
  }
8084
+ currentTaskProgressFloat(now) {
8085
+ return currentTaskProgressFloat(this.entity, now);
8086
+ }
7623
8087
  progress(now) {
7624
8088
  return scheduleProgress(this.entity, now);
7625
8089
  }
@@ -7708,6 +8172,12 @@ class Ship extends Types.entity_info {
7708
8172
  get name() {
7709
8173
  return this.entity_name;
7710
8174
  }
8175
+ get entityClass() {
8176
+ return 'orbital';
8177
+ }
8178
+ get canUndeploy() {
8179
+ return true;
8180
+ }
7711
8181
  get inv() {
7712
8182
  this._inv ?? (this._inv = new InventoryAccessor(this));
7713
8183
  return this._inv;
@@ -7739,6 +8209,11 @@ class Ship extends Types.entity_info {
7739
8209
  const progress = this.sched.currentTaskProgress(now);
7740
8210
  return Coordinates.from(getPositionAt(this, taskIndex, progress));
7741
8211
  }
8212
+ interpolatedPositionAt(now) {
8213
+ const taskIndex = this.sched.currentTaskIndex(now);
8214
+ const progress = this.sched.currentTaskProgressFloat(now);
8215
+ return getInterpolatedPosition(this, taskIndex, progress);
8216
+ }
7742
8217
  isInFlight(now) {
7743
8218
  return isInFlight(this, now);
7744
8219
  }
@@ -7845,8 +8320,7 @@ const ORE_STATS = [
7845
8320
  key: 'density',
7846
8321
  label: 'Density',
7847
8322
  abbreviation: 'DEN',
7848
- purpose: 'Mass per unit',
7849
- inverted: true,
8323
+ purpose: 'Structural integrity — higher rolls produce lighter hulls',
7850
8324
  },
7851
8325
  ];
7852
8326
  const CRYSTAL_STATS = [
@@ -8387,6 +8861,8 @@ function getModuleCapabilityType(itemId) {
8387
8861
  return MODULE_STORAGE;
8388
8862
  case ITEM_HAULER_T1:
8389
8863
  return MODULE_HAULER;
8864
+ case ITEM_WARP_T1:
8865
+ return MODULE_WARP;
8390
8866
  default:
8391
8867
  return 0xff;
8392
8868
  }
@@ -8421,92 +8897,124 @@ function moduleSlotTypeToCode(slotType) {
8421
8897
  }
8422
8898
  }
8423
8899
 
8900
+ const U16_MAX = 65535;
8901
+ function clampUint16(value) {
8902
+ return Math.min(value, U16_MAX);
8903
+ }
8904
+ function applySlotMultiplier(value, outputPct) {
8905
+ return clampUint16(Math.floor((value * outputPct) / 100));
8906
+ }
8907
+ function getSlotAmp(layout, slotIndex) {
8908
+ return layout[slotIndex]?.outputPct ?? 100;
8909
+ }
8910
+
8424
8911
  function computeShipHullCapabilities(stats) {
8425
- const density = stats.density ?? 500;
8426
- const strength = stats.strength ?? 500;
8427
- const hardness = stats.hardness ?? 500;
8428
- const saturation = stats.saturation ?? 500;
8429
- const hullmass = 25000 + 75 * density;
8912
+ const density = stats.density;
8913
+ const strength = stats.strength;
8914
+ const hardness = stats.hardness;
8915
+ const saturation = stats.saturation;
8916
+ const hullmass = 100000 - 75 * density;
8430
8917
  const statSum = strength + hardness + saturation;
8431
8918
  const exponent = statSum / 2997.0;
8432
8919
  const capacity = Math.floor(1000000 * 10 ** exponent);
8433
8920
  return { hullmass, capacity };
8434
8921
  }
8435
8922
  function computeEngineCapabilities(stats) {
8436
- const vol = stats.volatility ?? 500;
8437
- const thm = stats.thermal ?? 500;
8923
+ const vol = stats.volatility;
8924
+ const thm = stats.thermal;
8438
8925
  return {
8439
8926
  thrust: 400 + Math.floor((vol * 3) / 4),
8440
8927
  drain: Math.max(30, 50 - Math.floor(thm / 70)),
8441
8928
  };
8442
8929
  }
8443
8930
  function computeGeneratorCapabilities(stats) {
8444
- const res = stats.resonance ?? 500;
8445
- const ref = stats.reflectivity ?? 500;
8931
+ const com = stats.composition;
8932
+ const fin = stats.fineness;
8446
8933
  return {
8447
- capacity: 300 + Math.floor(res / 6),
8448
- recharge: 1 + Math.floor((ref * 3) / 1000),
8449
- };
8450
- }
8451
- function computeGathererCapabilities(stats) {
8452
- const str = stats.strength ?? 500;
8453
- const con = stats.conductivity ?? 500;
8454
- const ref = stats.reflectivity ?? 500;
8455
- const tol = stats.tolerance ?? 500;
8934
+ capacity: 300 + Math.floor(com / 6),
8935
+ recharge: 1 + Math.floor((fin * 3) / 1000),
8936
+ };
8937
+ }
8938
+ const GATHERER_DEPTH_TABLE = [
8939
+ { floor: 500, slope: 5 },
8940
+ { floor: 2000, slope: 11 },
8941
+ { floor: 7000, slope: 16 },
8942
+ { floor: 15000, slope: 18 },
8943
+ { floor: 25000, slope: 19 },
8944
+ { floor: 35000, slope: 16 },
8945
+ { floor: 46000, slope: 12 },
8946
+ { floor: 53500, slope: 10 },
8947
+ { floor: 60000, slope: 5 },
8948
+ { floor: 63500, slope: 2 },
8949
+ ];
8950
+ const GATHERER_DEPTH_MAX_TIER = 10;
8951
+ function gathererDepthForTier(tol, tier) {
8952
+ if (tier < 1 || tier > GATHERER_DEPTH_MAX_TIER) {
8953
+ throw new Error(`gatherer tier out of range: ${tier}`);
8954
+ }
8955
+ const p = GATHERER_DEPTH_TABLE[tier - 1];
8956
+ return p.floor + tol * p.slope;
8957
+ }
8958
+ function computeGathererCapabilities(stats, tier) {
8959
+ const str = stats.strength;
8960
+ const con = stats.conductivity;
8961
+ const ref = stats.reflectivity;
8962
+ const tol = stats.tolerance;
8456
8963
  return {
8457
8964
  yield: 200 + str,
8458
8965
  drain: Math.max(250, 1250 - Math.floor((con * 25) / 20)),
8459
- depth: 200 + Math.floor((tol * 3) / 2),
8966
+ depth: gathererDepthForTier(tol, tier),
8460
8967
  speed: 100 + Math.floor((ref * 4) / 5),
8461
8968
  };
8462
8969
  }
8463
8970
  function computeLoaderCapabilities(stats) {
8464
- const hrd = stats.hardness ?? 500;
8465
- const pla = stats.plasticity ?? 500;
8971
+ const insulation = stats.insulation;
8972
+ const plasticity = stats.plasticity;
8466
8973
  return {
8467
- mass: Math.max(200, 2000 - Math.floor(hrd * 2)),
8468
- thrust: 1 + Math.floor(pla / 500),
8974
+ mass: Math.max(200, 2000 - Math.floor(insulation * 2)),
8975
+ thrust: 1 + Math.floor(plasticity / 500),
8469
8976
  quantity: 1,
8470
8977
  };
8471
8978
  }
8472
8979
  function computeCrafterCapabilities(stats) {
8473
- const rea = stats.reactivity ?? 500;
8474
- const com = stats.composition ?? 500;
8980
+ const rea = stats.reactivity;
8981
+ const fin = stats.fineness;
8475
8982
  return {
8476
8983
  speed: 100 + Math.floor((rea * 4) / 5),
8477
- drain: Math.max(5, 30 - Math.floor(com / 33)),
8984
+ drain: Math.max(5, 30 - Math.floor(fin / 33)),
8478
8985
  };
8479
8986
  }
8480
8987
  function computeHaulerCapabilities(stats) {
8481
- const res = stats.resonance ?? 500;
8482
- const con = stats.conductivity ?? 500;
8483
- const ref = stats.reflectivity ?? 500;
8988
+ const fineness = stats.fineness;
8989
+ const conductivity = stats.conductivity;
8990
+ const composition = stats.composition;
8484
8991
  return {
8485
- capacity: Math.max(1, 1 + Math.floor(res / 400)),
8486
- efficiency: 2000 + con * 6,
8487
- drain: Math.max(3, 15 - Math.floor(ref / 80)),
8992
+ capacity: Math.max(1, 1 + Math.floor(fineness / 400)),
8993
+ efficiency: 2000 + conductivity * 6,
8994
+ drain: Math.max(3, 15 - Math.floor(composition / 80)),
8488
8995
  };
8489
8996
  }
8490
8997
  function computeStorageCapabilities(stats, baseCapacity) {
8491
- const strength = stats.strength ?? 500;
8492
- const hardness = stats.hardness ?? 500;
8493
- const saturation = stats.saturation ?? 500;
8494
- const statSum = strength + hardness + saturation;
8998
+ const strength = stats.strength;
8999
+ const density = stats.density;
9000
+ const hardness = stats.hardness;
9001
+ const saturation = stats.saturation;
9002
+ const statSum = strength + density + hardness + saturation;
8495
9003
  const capacityBonus = Math.floor((baseCapacity * (10 + Math.floor((statSum * 10) / 2997))) / 100);
8496
9004
  return { capacityBonus };
8497
9005
  }
8498
9006
  function computeWarehouseHullCapabilities(stats) {
8499
- const density = stats.density ?? 500;
8500
- const strength = stats.strength ?? 500;
8501
- const hardness = stats.hardness ?? 500;
8502
- const saturation = stats.saturation ?? 500;
8503
- const hullmass = 25000 + 75 * density;
9007
+ const density = stats.density;
9008
+ const strength = stats.strength;
9009
+ const hardness = stats.hardness;
9010
+ const saturation = stats.saturation;
9011
+ const hullmass = 100000 - 75 * density;
8504
9012
  const statSum = strength + hardness + saturation;
8505
9013
  const exponent = statSum / 2997.0;
8506
9014
  const capacity = Math.floor(20000000 * 10 ** exponent);
8507
9015
  return { hullmass, capacity };
8508
9016
  }
8509
- function computeShipCapabilities(modules) {
9017
+ function computeShipCapabilities(modules, layout) {
8510
9018
  const ship = {};
8511
9019
  const engineModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_ENGINE);
8512
9020
  if (engineModules.length > 0) {
@@ -8514,7 +9022,7 @@ function computeShipCapabilities(modules) {
8514
9022
  let totalDrain = 0;
8515
9023
  for (const m of engineModules) {
8516
9024
  const caps = computeEngineCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
8517
- totalThrust += caps.thrust;
9025
+ totalThrust += applySlotMultiplier(caps.thrust, getSlotAmp(layout, m.slotIndex));
8518
9026
  totalDrain += caps.drain;
8519
9027
  }
8520
9028
  ship.engines = { thrust: totalThrust, drain: totalDrain };
@@ -8525,25 +9033,37 @@ function computeShipCapabilities(modules) {
8525
9033
  let totalRecharge = 0;
8526
9034
  for (const m of generatorModules) {
8527
9035
  const caps = computeGeneratorCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
8528
- totalCapacity += caps.capacity;
8529
- totalRecharge += caps.recharge;
9036
+ const amp = getSlotAmp(layout, m.slotIndex);
9037
+ totalCapacity += applySlotMultiplier(caps.capacity, amp);
9038
+ totalRecharge += applySlotMultiplier(caps.recharge, amp);
8530
9039
  }
8531
- ship.generator = { capacity: totalCapacity, recharge: totalRecharge };
9040
+ ship.generator = {
9041
+ capacity: clampUint16(totalCapacity),
9042
+ recharge: clampUint16(totalRecharge),
9043
+ };
8532
9044
  }
8533
9045
  const gathererModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GATHERER);
8534
9046
  if (gathererModules.length > 0) {
8535
9047
  let totalYield = 0;
8536
9048
  let totalDrain = 0;
8537
- let totalDepth = 0;
9049
+ let maxDepth = 0;
8538
9050
  let totalSpeed = 0;
8539
9051
  for (const m of gathererModules) {
8540
- const caps = computeGathererCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
8541
- totalYield += caps.yield;
9052
+ const tier = getItem(m.itemId).tier;
9053
+ const caps = computeGathererCapabilities(decodeCraftedItemStats(m.itemId, m.stats), tier);
9054
+ const amp = getSlotAmp(layout, m.slotIndex);
9055
+ totalYield += applySlotMultiplier(caps.yield, amp);
8542
9056
  totalDrain += caps.drain;
8543
- totalDepth += caps.depth;
8544
- totalSpeed += caps.speed;
9057
+ if (caps.depth > maxDepth)
9058
+ maxDepth = caps.depth;
9059
+ totalSpeed += applySlotMultiplier(caps.speed, amp);
8545
9060
  }
8546
- ship.gatherer = { yield: totalYield, drain: totalDrain, depth: totalDepth, speed: totalSpeed };
9061
+ ship.gatherer = {
9062
+ yield: clampUint16(totalYield),
9063
+ drain: totalDrain,
9064
+ depth: maxDepth,
9065
+ speed: clampUint16(totalSpeed),
9066
+ };
8547
9067
  }
8548
9068
  const haulerModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_HAULER);
8549
9069
  if (haulerModules.length > 0) {
@@ -8552,13 +9072,15 @@ function computeShipCapabilities(modules) {
8552
9072
  let totalDrain = 0;
8553
9073
  for (const m of haulerModules) {
8554
9074
  const caps = computeHaulerCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
9075
+ const eff = applySlotMultiplier(caps.efficiency, getSlotAmp(layout, m.slotIndex));
8555
9076
  totalCapacity += caps.capacity;
8556
- weightedEffNum += caps.efficiency * caps.capacity;
9077
+ weightedEffNum += eff * caps.capacity;
8557
9078
  totalDrain += caps.drain;
8558
9079
  }
9080
+ const efficiency = totalCapacity > 0 ? Math.floor(weightedEffNum / totalCapacity) : 0;
8559
9081
  ship.hauler = {
8560
9082
  capacity: totalCapacity,
8561
- efficiency: totalCapacity > 0 ? Math.floor(weightedEffNum / totalCapacity) : 0,
9083
+ efficiency: clampUint16(efficiency),
8562
9084
  drain: totalDrain,
8563
9085
  };
8564
9086
  }
@@ -8570,10 +9092,14 @@ function computeShipCapabilities(modules) {
8570
9092
  for (const m of loaderModules) {
8571
9093
  const caps = computeLoaderCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
8572
9094
  totalMass += caps.mass;
8573
- totalThrust += caps.thrust;
9095
+ totalThrust += applySlotMultiplier(caps.thrust, getSlotAmp(layout, m.slotIndex));
8574
9096
  totalQuantity += caps.quantity;
8575
9097
  }
8576
- ship.loaders = { mass: totalMass, thrust: totalThrust, quantity: totalQuantity };
9098
+ ship.loaders = {
9099
+ mass: totalMass,
9100
+ thrust: clampUint16(totalThrust),
9101
+ quantity: totalQuantity,
9102
+ };
8577
9103
  }
8578
9104
  const crafterModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_CRAFTER);
8579
9105
  if (crafterModules.length > 0) {
@@ -8581,10 +9107,10 @@ function computeShipCapabilities(modules) {
8581
9107
  let totalDrain = 0;
8582
9108
  for (const m of crafterModules) {
8583
9109
  const caps = computeCrafterCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
8584
- totalSpeed += caps.speed;
9110
+ totalSpeed += applySlotMultiplier(caps.speed, getSlotAmp(layout, m.slotIndex));
8585
9111
  totalDrain += caps.drain;
8586
9112
  }
8587
- ship.crafter = { speed: totalSpeed, drain: totalDrain };
9113
+ ship.crafter = { speed: clampUint16(totalSpeed), drain: totalDrain };
8588
9114
  }
8589
9115
  return ship;
8590
9116
  }
@@ -8593,6 +9119,12 @@ class Warehouse extends Types.entity_info {
8593
9119
  get name() {
8594
9120
  return this.entity_name;
8595
9121
  }
9122
+ get entityClass() {
9123
+ return 'planetary';
9124
+ }
9125
+ get canDemolish() {
9126
+ return true;
9127
+ }
8596
9128
  get inv() {
8597
9129
  this._inv ?? (this._inv = new InventoryAccessor(this));
8598
9130
  return this._inv;
@@ -8643,7 +9175,7 @@ class Warehouse extends Types.entity_info {
8643
9175
  return hull.adding(this.totalCargoMass);
8644
9176
  }
8645
9177
  }
8646
- function computeWarehouseCapabilities(modules) {
9178
+ function computeWarehouseCapabilities(modules, layout) {
8647
9179
  const warehouse = {};
8648
9180
  const loaderModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_LOADER);
8649
9181
  if (loaderModules.length > 0) {
@@ -8653,10 +9185,14 @@ function computeWarehouseCapabilities(modules) {
8653
9185
  for (const m of loaderModules) {
8654
9186
  const caps = computeLoaderCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
8655
9187
  totalMass += caps.mass;
8656
- totalThrust += caps.thrust;
9188
+ totalThrust += applySlotMultiplier(caps.thrust, getSlotAmp(layout, m.slotIndex));
8657
9189
  totalQuantity += caps.quantity;
8658
9190
  }
8659
- warehouse.loaders = { mass: totalMass, thrust: totalThrust, quantity: totalQuantity };
9191
+ warehouse.loaders = {
9192
+ mass: totalMass,
9193
+ thrust: clampUint16(totalThrust),
9194
+ quantity: totalQuantity,
9195
+ };
8660
9196
  }
8661
9197
  return warehouse;
8662
9198
  }
@@ -8665,6 +9201,12 @@ class Container extends Types.entity_info {
8665
9201
  get name() {
8666
9202
  return this.entity_name;
8667
9203
  }
9204
+ get entityClass() {
9205
+ return 'orbital';
9206
+ }
9207
+ get canUndeploy() {
9208
+ return true;
9209
+ }
8668
9210
  get sched() {
8669
9211
  this._sched ?? (this._sched = new ScheduleAccessor(this));
8670
9212
  return this._sched;
@@ -8672,6 +9214,11 @@ class Container extends Types.entity_info {
8672
9214
  get isIdle() {
8673
9215
  return this.is_idle;
8674
9216
  }
9217
+ interpolatedPositionAt(now) {
9218
+ const taskIndex = this.sched.currentTaskIndex(now);
9219
+ const progress = this.sched.currentTaskProgressFloat(now);
9220
+ return getInterpolatedPosition(this, taskIndex, progress);
9221
+ }
8675
9222
  isLoading(now) {
8676
9223
  return isLoading(this, now);
8677
9224
  }
@@ -8702,32 +9249,214 @@ class Container extends Types.entity_info {
8702
9249
  }
8703
9250
  }
8704
9251
  function computeContainerCapabilities(stats) {
8705
- const density = stats['density'] ?? 500;
8706
- const strength = stats['strength'] ?? 500;
8707
- const hardness = stats['hardness'] ?? 500;
8708
- const saturation = stats['saturation'] ?? 500;
8709
- const hullmass = 25000 + 75 * density;
9252
+ const density = stats.density;
9253
+ const strength = stats.strength;
9254
+ const hardness = stats.hardness;
9255
+ const saturation = stats.saturation;
9256
+ const hullmass = 100000 - 75 * density;
8710
9257
  const statSum = strength + hardness + saturation;
8711
9258
  const exponent = statSum / 2997;
8712
9259
  const capacity = Math.floor(1000000 * 10 ** exponent);
8713
9260
  return { hullmass, capacity };
8714
9261
  }
8715
9262
  function computeContainerT2Capabilities(stats) {
8716
- const strength = stats['strength'] ?? 0;
8717
- const density = stats['density'] ?? 0;
8718
- const hardness = stats['hardness'] ?? 0;
8719
- const saturation = stats['saturation'] ?? 0;
8720
- const hullmass = 20000 + 50 * density;
9263
+ const strength = stats.strength;
9264
+ const density = stats.density;
9265
+ const hardness = stats.hardness;
9266
+ const saturation = stats.saturation;
9267
+ const hullmass = 70000 - 50 * density;
8721
9268
  const statSum = strength + hardness + saturation;
8722
9269
  const exponent = statSum / 2500;
8723
9270
  const capacity = Math.floor(1500000 * 10 ** exponent);
8724
9271
  return { hullmass, capacity };
8725
9272
  }
8726
9273
 
9274
+ class Extractor extends Types.entity_info {
9275
+ get name() {
9276
+ return this.entity_name;
9277
+ }
9278
+ get entityClass() {
9279
+ return 'planetary';
9280
+ }
9281
+ get canDemolish() {
9282
+ return true;
9283
+ }
9284
+ get inv() {
9285
+ this._inv ?? (this._inv = new InventoryAccessor(this));
9286
+ return this._inv;
9287
+ }
9288
+ get inventory() {
9289
+ return this.inv.items;
9290
+ }
9291
+ get sched() {
9292
+ this._sched ?? (this._sched = new ScheduleAccessor(this));
9293
+ return this._sched;
9294
+ }
9295
+ get isIdle() {
9296
+ return this.is_idle;
9297
+ }
9298
+ get location() {
9299
+ return Location.from(this.coordinates);
9300
+ }
9301
+ get totalCargoMass() {
9302
+ return this.inv.totalMass;
9303
+ }
9304
+ get maxCapacity() {
9305
+ return UInt64.from(this.capacity);
9306
+ }
9307
+ get availableCapacity() {
9308
+ const cargo = this.totalCargoMass;
9309
+ return cargo.gte(this.maxCapacity) ? UInt64.from(0) : this.maxCapacity.subtracting(cargo);
9310
+ }
9311
+ get isFull() {
9312
+ return this.totalCargoMass.gte(this.maxCapacity);
9313
+ }
9314
+ get totalMass() {
9315
+ const hull = this.hullmass ? UInt64.from(this.hullmass) : UInt64.from(0);
9316
+ return hull.adding(this.totalCargoMass);
9317
+ }
9318
+ }
9319
+ function computeExtractorCapabilities(modules, layout) {
9320
+ const out = {};
9321
+ const genModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GENERATOR);
9322
+ if (genModules.length > 0) {
9323
+ let totalCapacity = 0;
9324
+ let totalRecharge = 0;
9325
+ for (const m of genModules) {
9326
+ const caps = computeGeneratorCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
9327
+ const amp = getSlotAmp(layout, m.slotIndex);
9328
+ totalCapacity += applySlotMultiplier(caps.capacity, amp);
9329
+ totalRecharge += applySlotMultiplier(caps.recharge, amp);
9330
+ }
9331
+ out.generator = {
9332
+ capacity: clampUint16(totalCapacity),
9333
+ recharge: clampUint16(totalRecharge),
9334
+ };
9335
+ }
9336
+ const gathModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GATHERER);
9337
+ if (gathModules.length > 0) {
9338
+ let totalYield = 0;
9339
+ let totalDrain = 0;
9340
+ let maxDepth = 0;
9341
+ let totalSpeed = 0;
9342
+ for (const m of gathModules) {
9343
+ const tier = getItem(m.itemId).tier;
9344
+ const caps = computeGathererCapabilities(decodeCraftedItemStats(m.itemId, m.stats), tier);
9345
+ const amp = getSlotAmp(layout, m.slotIndex);
9346
+ totalYield += applySlotMultiplier(caps.yield, amp);
9347
+ totalDrain += caps.drain;
9348
+ if (caps.depth > maxDepth)
9349
+ maxDepth = caps.depth;
9350
+ totalSpeed += applySlotMultiplier(caps.speed, amp);
9351
+ }
9352
+ out.gatherer = {
9353
+ yield: clampUint16(totalYield),
9354
+ drain: totalDrain,
9355
+ depth: maxDepth,
9356
+ speed: clampUint16(totalSpeed),
9357
+ };
9358
+ }
9359
+ return out;
9360
+ }
9361
+
9362
+ class Factory extends Types.entity_info {
9363
+ get name() {
9364
+ return this.entity_name;
9365
+ }
9366
+ get entityClass() {
9367
+ return 'planetary';
9368
+ }
9369
+ get canDemolish() {
9370
+ return true;
9371
+ }
9372
+ get inv() {
9373
+ this._inv ?? (this._inv = new InventoryAccessor(this));
9374
+ return this._inv;
9375
+ }
9376
+ get inventory() {
9377
+ return this.inv.items;
9378
+ }
9379
+ get sched() {
9380
+ this._sched ?? (this._sched = new ScheduleAccessor(this));
9381
+ return this._sched;
9382
+ }
9383
+ get isIdle() {
9384
+ return this.is_idle;
9385
+ }
9386
+ get location() {
9387
+ return Location.from(this.coordinates);
9388
+ }
9389
+ get totalCargoMass() {
9390
+ return this.inv.totalMass;
9391
+ }
9392
+ get maxCapacity() {
9393
+ return UInt64.from(this.capacity);
9394
+ }
9395
+ get availableCapacity() {
9396
+ const cargo = this.totalCargoMass;
9397
+ return cargo.gte(this.maxCapacity) ? UInt64.from(0) : this.maxCapacity.subtracting(cargo);
9398
+ }
9399
+ get isFull() {
9400
+ return this.totalCargoMass.gte(this.maxCapacity);
9401
+ }
9402
+ get totalMass() {
9403
+ const hull = this.hullmass ? UInt64.from(this.hullmass) : UInt64.from(0);
9404
+ return hull.adding(this.totalCargoMass);
9405
+ }
9406
+ }
9407
+ function computeFactoryCapabilities(modules, layout) {
9408
+ const out = {};
9409
+ const genModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_GENERATOR);
9410
+ if (genModules.length > 0) {
9411
+ let totalCapacity = 0;
9412
+ let totalRecharge = 0;
9413
+ for (const m of genModules) {
9414
+ const caps = computeGeneratorCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
9415
+ const amp = getSlotAmp(layout, m.slotIndex);
9416
+ totalCapacity += applySlotMultiplier(caps.capacity, amp);
9417
+ totalRecharge += applySlotMultiplier(caps.recharge, amp);
9418
+ }
9419
+ out.generator = {
9420
+ capacity: clampUint16(totalCapacity),
9421
+ recharge: clampUint16(totalRecharge),
9422
+ };
9423
+ }
9424
+ const crafterModules = modules.filter((m) => getModuleCapabilityType(m.itemId) === MODULE_CRAFTER);
9425
+ if (crafterModules.length > 0) {
9426
+ let totalSpeed = 0;
9427
+ let totalDrain = 0;
9428
+ for (const m of crafterModules) {
9429
+ const caps = computeCrafterCapabilities(decodeCraftedItemStats(m.itemId, m.stats));
9430
+ const amp = getSlotAmp(layout, m.slotIndex);
9431
+ totalSpeed += applySlotMultiplier(caps.speed, amp);
9432
+ totalDrain += caps.drain;
9433
+ }
9434
+ out.crafter = {
9435
+ speed: clampUint16(totalSpeed),
9436
+ drain: totalDrain,
9437
+ };
9438
+ }
9439
+ return out;
9440
+ }
9441
+
9442
+ class Nexus extends Types.entity_info {
9443
+ get name() {
9444
+ return this.entity_name;
9445
+ }
9446
+ get entityClass() {
9447
+ return 'orbital';
9448
+ }
9449
+ get location() {
9450
+ return Location.from(this.coordinates);
9451
+ }
9452
+ get orbitalAltitude() {
9453
+ return this.coordinates.z?.toNumber() || 0;
9454
+ }
9455
+ }
9456
+
8727
9457
  class EntitiesManager extends BaseManager {
8728
- async getEntity(type, id) {
9458
+ async getEntity(id) {
8729
9459
  const result = await this.server.readonly('getentity', {
8730
- entity_type: Name.from(type),
8731
9460
  entity_id: id,
8732
9461
  });
8733
9462
  const entityInfo = result;
@@ -8737,7 +9466,7 @@ class EntitiesManager extends BaseManager {
8737
9466
  const ownerName = this.resolveOwner(owner);
8738
9467
  const result = await this.server.readonly('getentities', {
8739
9468
  owner: ownerName,
8740
- entity_type: type ? Name.from(type) : null,
9469
+ entity_type: type,
8741
9470
  });
8742
9471
  const entities = result;
8743
9472
  return entities.map((entity) => this.wrapEntity(entity));
@@ -8746,18 +9475,24 @@ class EntitiesManager extends BaseManager {
8746
9475
  const ownerName = this.resolveOwner(owner);
8747
9476
  const result = await this.server.readonly('getsummaries', {
8748
9477
  owner: ownerName,
8749
- entity_type: type ? Name.from(type) : null,
9478
+ entity_type: type,
8750
9479
  });
8751
9480
  return result;
8752
9481
  }
8753
9482
  async getShip(id) {
8754
- return (await this.getEntity('ship', id));
9483
+ return (await this.getEntity(id));
8755
9484
  }
8756
9485
  async getWarehouse(id) {
8757
- return (await this.getEntity('warehouse', id));
9486
+ return (await this.getEntity(id));
8758
9487
  }
8759
9488
  async getContainer(id) {
8760
- return (await this.getEntity('container', id));
9489
+ return (await this.getEntity(id));
9490
+ }
9491
+ async getExtractor(id) {
9492
+ return (await this.getEntity(id));
9493
+ }
9494
+ async getFactory(id) {
9495
+ return (await this.getEntity(id));
8761
9496
  }
8762
9497
  async getShips(owner) {
8763
9498
  return (await this.getEntities(owner, 'ship'));
@@ -8768,6 +9503,12 @@ class EntitiesManager extends BaseManager {
8768
9503
  async getContainers(owner) {
8769
9504
  return (await this.getEntities(owner, 'container'));
8770
9505
  }
9506
+ async getExtractors(owner) {
9507
+ return (await this.getEntities(owner, 'extractor'));
9508
+ }
9509
+ async getFactories(owner) {
9510
+ return (await this.getEntities(owner, 'factory'));
9511
+ }
8771
9512
  async getShipSummaries(owner) {
8772
9513
  return this.getSummaries(owner, 'ship');
8773
9514
  }
@@ -8777,16 +9518,35 @@ class EntitiesManager extends BaseManager {
8777
9518
  async getContainerSummaries(owner) {
8778
9519
  return this.getSummaries(owner, 'container');
8779
9520
  }
9521
+ async getExtractorSummaries(owner) {
9522
+ return this.getSummaries(owner, 'extractor');
9523
+ }
9524
+ async getFactorySummaries(owner) {
9525
+ return this.getSummaries(owner, 'factory');
9526
+ }
9527
+ async getNexus(id) {
9528
+ return (await this.getEntity(id));
9529
+ }
9530
+ async getNexuses(owner) {
9531
+ return (await this.getEntities(owner, 'nexus'));
9532
+ }
9533
+ async getNexusSummaries(owner) {
9534
+ return this.getSummaries(owner, 'nexus');
9535
+ }
8780
9536
  wrapEntity(entity) {
8781
- if (entity.type.equals('ship')) {
9537
+ if (entity.type.equals('ship'))
8782
9538
  return new Ship(entity);
8783
- }
8784
- else if (entity.type.equals('warehouse')) {
9539
+ if (entity.type.equals('warehouse'))
8785
9540
  return new Warehouse(entity);
8786
- }
8787
- else {
9541
+ if (entity.type.equals('extractor'))
9542
+ return new Extractor(entity);
9543
+ if (entity.type.equals('factory'))
9544
+ return new Factory(entity);
9545
+ if (entity.type.equals('container'))
8788
9546
  return new Container(entity);
8789
- }
9547
+ if (entity.type.equals('nexus'))
9548
+ return new Nexus(entity);
9549
+ throw new Error(`unknown entity type: ${entity.type}`);
8790
9550
  }
8791
9551
  resolveOwner(owner) {
8792
9552
  if (typeof owner === 'object' && owner !== null && 'owner' in owner) {
@@ -8870,17 +9630,6 @@ class LocationsManager extends BaseManager {
8870
9630
  reserve: overrideMap.get(s.index) ?? s.reserve,
8871
9631
  }));
8872
9632
  }
8873
- async getLocationEntity(id) {
8874
- const row = await this.server.table('location').get(UInt64.from(id));
8875
- return row ?? undefined;
8876
- }
8877
- async getLocationEntityAt(coords) {
8878
- const id = coordsToLocationId(coords);
8879
- return this.getLocationEntity(id);
8880
- }
8881
- async getAllLocationEntities() {
8882
- return this.server.table('location').all();
8883
- }
8884
9633
  }
8885
9634
 
8886
9635
  class EpochsManager extends BaseManager {
@@ -8927,7 +9676,6 @@ class ActionsManager extends BaseManager {
8927
9676
  const x = Int64.from(destination.x);
8928
9677
  const y = Int64.from(destination.y);
8929
9678
  return this.server.action('travel', {
8930
- entity_type: EntityType.SHIP,
8931
9679
  id: UInt64.from(shipId),
8932
9680
  x,
8933
9681
  y,
@@ -8948,9 +9696,8 @@ class ActionsManager extends BaseManager {
8948
9696
  recharge,
8949
9697
  });
8950
9698
  }
8951
- resolve(entityId, entityType = EntityType.SHIP, count) {
9699
+ resolve(entityId, count) {
8952
9700
  const params = {
8953
- entity_type: entityType,
8954
9701
  id: UInt64.from(entityId),
8955
9702
  };
8956
9703
  if (count !== undefined) {
@@ -8958,28 +9705,27 @@ class ActionsManager extends BaseManager {
8958
9705
  }
8959
9706
  return this.server.action('resolve', params);
8960
9707
  }
8961
- cancel(entityId, count, entityType = EntityType.SHIP) {
9708
+ cancel(entityId, count) {
8962
9709
  return this.server.action('cancel', {
8963
- entity_type: entityType,
8964
9710
  id: UInt64.from(entityId),
8965
9711
  count: UInt64.from(count),
8966
9712
  });
8967
9713
  }
8968
- recharge(entityId, entityType = EntityType.SHIP) {
9714
+ recharge(entityId) {
8969
9715
  return this.server.action('recharge', {
8970
- entity_type: entityType,
8971
9716
  id: UInt64.from(entityId),
8972
9717
  });
8973
9718
  }
8974
- transfer(sourceType, sourceId, destType, destId, itemId, stats, quantity) {
9719
+ refrshentity(entityId) {
9720
+ return this.server.action('refrshentity', {
9721
+ entity_id: UInt64.from(entityId),
9722
+ });
9723
+ }
9724
+ transfer(sourceId, destId, items) {
8975
9725
  return this.server.action('transfer', {
8976
- source_type: sourceType,
8977
9726
  source_id: UInt64.from(sourceId),
8978
- dest_type: destType,
8979
9727
  dest_id: UInt64.from(destId),
8980
- item_id: UInt16.from(itemId),
8981
- stats: UInt64.from(stats),
8982
- quantity: UInt32.from(quantity),
9728
+ items,
8983
9729
  });
8984
9730
  }
8985
9731
  foundCompany(account, name) {
@@ -8993,84 +9739,85 @@ class ActionsManager extends BaseManager {
8993
9739
  account: Name.from(account),
8994
9740
  });
8995
9741
  }
8996
- gather(source, destination, stratum, quantity) {
9742
+ gather(sourceId, destinationId, stratum, quantity) {
8997
9743
  return this.server.action('gather', {
8998
- source: Types.entity_ref.from({
8999
- entity_type: source.entityType,
9000
- entity_id: UInt64.from(source.entityId),
9001
- }),
9002
- destination: Types.entity_ref.from({
9003
- entity_type: destination.entityType,
9004
- entity_id: UInt64.from(destination.entityId),
9005
- }),
9744
+ source_id: UInt64.from(sourceId),
9745
+ destination_id: UInt64.from(destinationId),
9006
9746
  stratum: UInt16.from(stratum),
9007
9747
  quantity: UInt32.from(quantity),
9008
9748
  });
9009
9749
  }
9010
- warp(entityId, destination, entityType = EntityType.SHIP) {
9750
+ warp(entityId, destination) {
9011
9751
  const x = Int64.from(destination.x);
9012
9752
  const y = Int64.from(destination.y);
9013
9753
  return this.server.action('warp', {
9014
- entity_type: entityType,
9015
9754
  id: UInt64.from(entityId),
9016
9755
  x,
9017
9756
  y,
9018
9757
  });
9019
9758
  }
9020
- craft(entityType, entityId, recipeId, quantity, inputs) {
9021
- const cargoInputs = inputs.map((i) => Types.cargo_item.from(i));
9759
+ craft(entityId, recipeId, quantity, inputs) {
9022
9760
  return this.server.action('craft', {
9023
- entity_type: entityType,
9024
9761
  id: UInt64.from(entityId),
9025
9762
  recipe_id: UInt16.from(recipeId),
9026
9763
  quantity: UInt32.from(quantity),
9027
- inputs: cargoInputs,
9764
+ inputs,
9028
9765
  });
9029
9766
  }
9030
- blend(entityType, entityId, inputs) {
9031
- const cargoInputs = inputs.map((i) => Types.cargo_item.from(i));
9767
+ blend(entityId, inputs) {
9032
9768
  return this.server.action('blend', {
9033
- entity_type: entityType,
9034
9769
  id: UInt64.from(entityId),
9035
- inputs: cargoInputs,
9770
+ inputs,
9036
9771
  });
9037
9772
  }
9038
- deploy(entityType, entityId, packedItemId, stats) {
9773
+ deploy(entityId, ref) {
9039
9774
  return this.server.action('deploy', {
9040
- entity_type: entityType,
9041
9775
  id: UInt64.from(entityId),
9042
- packed_item_id: UInt16.from(packedItemId),
9043
- stats: UInt64.from(stats),
9776
+ ref,
9044
9777
  });
9045
9778
  }
9046
- addmodule(entityType, entityId, moduleIndex, moduleCargoId, targetCargoId = UInt64.from(0)) {
9779
+ addmodule(entityId, moduleIndex, moduleRef, targetRef = null) {
9047
9780
  return this.server.action('addmodule', {
9048
- entity_type: entityType,
9049
9781
  entity_id: UInt64.from(entityId),
9050
9782
  module_index: moduleIndex,
9051
- module_cargo_id: UInt64.from(moduleCargoId),
9052
- target_cargo_id: UInt64.from(targetCargoId),
9783
+ module_ref: moduleRef,
9784
+ target_ref: targetRef ?? undefined,
9053
9785
  });
9054
9786
  }
9055
- rmmodule(entityType, entityId, moduleIndex, targetCargoId = UInt64.from(0)) {
9787
+ rmmodule(entityId, moduleIndex, targetRef = null) {
9056
9788
  return this.server.action('rmmodule', {
9057
- entity_type: entityType,
9058
9789
  entity_id: UInt64.from(entityId),
9059
9790
  module_index: moduleIndex,
9060
- target_cargo_id: UInt64.from(targetCargoId),
9791
+ target_ref: targetRef ?? undefined,
9061
9792
  });
9062
9793
  }
9063
- wrap(owner, entityType, entityId, cargoId, quantity) {
9794
+ wrap(owner, entityId, nexusId, items) {
9064
9795
  return this.server.action('wrap', {
9065
9796
  owner: Name.from(owner),
9066
- entity_type: entityType,
9067
9797
  entity_id: UInt64.from(entityId),
9068
- cargo_id: UInt64.from(cargoId),
9069
- quantity: UInt64.from(quantity),
9798
+ nexus_id: UInt64.from(nexusId),
9799
+ items,
9070
9800
  });
9071
9801
  }
9072
- joinGame(account, companyName) {
9073
- return [this.foundCompany(account, companyName), this.join(account)];
9802
+ undeploy(hostId, targetId) {
9803
+ return this.server.action('undeploy', {
9804
+ host_id: UInt64.from(hostId),
9805
+ target_id: UInt64.from(targetId),
9806
+ });
9807
+ }
9808
+ wrapEntity(entityId, nexusId) {
9809
+ return this.server.action('wrapentity', {
9810
+ entity_id: UInt64.from(entityId),
9811
+ nexus_id: UInt64.from(nexusId),
9812
+ });
9813
+ }
9814
+ demolish(entityId) {
9815
+ return this.server.action('demolish', {
9816
+ entity_id: UInt64.from(entityId),
9817
+ });
9818
+ }
9819
+ joinGame(account, companyName) {
9820
+ return [this.foundCompany(account, companyName), this.join(account)];
9074
9821
  }
9075
9822
  }
9076
9823
 
@@ -9095,9 +9842,15 @@ class WebSocketConnection {
9095
9842
  this._state = 'disconnected';
9096
9843
  this.shouldReconnect = true;
9097
9844
  this.sendQueue = [];
9845
+ this.pingTimer = null;
9846
+ this.staleTimer = null;
9098
9847
  this.url = options.url;
9099
9848
  this.onMessage = options.onMessage;
9100
9849
  this.onStateChange = options.onStateChange;
9850
+ this.minReconnectDelay =
9851
+ options.minReconnectDelay ?? WebSocketConnection.DEFAULT_MIN_RECONNECT_DELAY;
9852
+ this.pingIntervalMs = options.pingIntervalMs ?? WebSocketConnection.DEFAULT_PING_INTERVAL_MS;
9853
+ this.pongTimeoutMs = options.pongTimeoutMs ?? WebSocketConnection.DEFAULT_PONG_TIMEOUT_MS;
9101
9854
  }
9102
9855
  get state() {
9103
9856
  return this._state;
@@ -9126,8 +9879,10 @@ class WebSocketConnection {
9126
9879
  this.ws.readyState === WebSocket.OPEN) {
9127
9880
  this.ws.send(this.sendQueue.shift());
9128
9881
  }
9882
+ this.startHeartbeat();
9129
9883
  };
9130
9884
  this.ws.onmessage = (event) => {
9885
+ this.resetStaleTimer();
9131
9886
  try {
9132
9887
  const message = JSON.parse(event.data);
9133
9888
  this.onMessage(message);
@@ -9137,6 +9892,7 @@ class WebSocketConnection {
9137
9892
  }
9138
9893
  };
9139
9894
  this.ws.onclose = () => {
9895
+ this.stopHeartbeat();
9140
9896
  this.ws = null;
9141
9897
  this.sendQueue.length = 0;
9142
9898
  if (this.shouldReconnect) {
@@ -9161,7 +9917,7 @@ class WebSocketConnection {
9161
9917
  if (this.reconnectTimeout) {
9162
9918
  return;
9163
9919
  }
9164
- const delay = Math.min(WebSocketConnection.MIN_RECONNECT_DELAY *
9920
+ const delay = Math.min(this.minReconnectDelay *
9165
9921
  WebSocketConnection.RECONNECT_MULTIPLIER ** this.reconnectAttempts, WebSocketConnection.MAX_RECONNECT_DELAY);
9166
9922
  debug(`Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts + 1})`);
9167
9923
  this.reconnectTimeout = setTimeout(() => {
@@ -9176,6 +9932,7 @@ class WebSocketConnection {
9176
9932
  clearTimeout(this.reconnectTimeout);
9177
9933
  this.reconnectTimeout = null;
9178
9934
  }
9935
+ this.stopHeartbeat();
9179
9936
  if (this.ws) {
9180
9937
  this.ws.close();
9181
9938
  this.ws = null;
@@ -9183,6 +9940,34 @@ class WebSocketConnection {
9183
9940
  this.sendQueue.length = 0;
9184
9941
  this.setState('disconnected');
9185
9942
  }
9943
+ startHeartbeat() {
9944
+ this.stopHeartbeat();
9945
+ this.resetStaleTimer();
9946
+ this.pingTimer = setInterval(() => {
9947
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
9948
+ this.ws.send(JSON.stringify({ type: 'ping' }));
9949
+ }
9950
+ }, this.pingIntervalMs);
9951
+ }
9952
+ stopHeartbeat() {
9953
+ if (this.pingTimer) {
9954
+ clearInterval(this.pingTimer);
9955
+ this.pingTimer = null;
9956
+ }
9957
+ if (this.staleTimer) {
9958
+ clearTimeout(this.staleTimer);
9959
+ this.staleTimer = null;
9960
+ }
9961
+ }
9962
+ resetStaleTimer() {
9963
+ if (this.staleTimer)
9964
+ clearTimeout(this.staleTimer);
9965
+ this.staleTimer = setTimeout(() => {
9966
+ debug('No frames within ping interval + pong timeout — forcing reconnect');
9967
+ if (this.ws)
9968
+ this.ws.close();
9969
+ }, this.pingIntervalMs + this.pongTimeoutMs);
9970
+ }
9186
9971
  close() {
9187
9972
  this.disconnect();
9188
9973
  }
@@ -9198,9 +9983,11 @@ class WebSocketConnection {
9198
9983
  return this._state === 'connected';
9199
9984
  }
9200
9985
  }
9201
- WebSocketConnection.MIN_RECONNECT_DELAY = 1000;
9986
+ WebSocketConnection.DEFAULT_MIN_RECONNECT_DELAY = 1000;
9202
9987
  WebSocketConnection.MAX_RECONNECT_DELAY = 30000;
9203
9988
  WebSocketConnection.RECONNECT_MULTIPLIER = 2;
9989
+ WebSocketConnection.DEFAULT_PING_INTERVAL_MS = 25000;
9990
+ WebSocketConnection.DEFAULT_PONG_TIMEOUT_MS = 10000;
9204
9991
 
9205
9992
  function mapEntity(ei) {
9206
9993
  if (ei.type.equals('ship'))
@@ -9209,6 +9996,8 @@ function mapEntity(ei) {
9209
9996
  return new Warehouse(ei);
9210
9997
  if (ei.type.equals('container'))
9211
9998
  return new Container(ei);
9999
+ if (ei.type.equals('nexus'))
10000
+ return new Nexus(ei);
9212
10001
  throw new Error(`mapEntity: unknown entity type ${ei.type.toString()}`);
9213
10002
  }
9214
10003
  function parseWireEntity(raw) {
@@ -9229,9 +10018,14 @@ class SubscriptionsManager {
9229
10018
  this.entitySubs = new Map();
9230
10019
  this.boundsSubs = new Map();
9231
10020
  this.subCounter = 0;
10021
+ this.hasConnected = false;
9232
10022
  this.conn = new WebSocketConnection({
9233
10023
  url: opts.url,
9234
10024
  onMessage: (m) => this.onMessage(m),
10025
+ onStateChange: (s) => this.onStateChange(s),
10026
+ minReconnectDelay: opts.minReconnectDelay,
10027
+ pingIntervalMs: opts.pingIntervalMs,
10028
+ pongTimeoutMs: opts.pongTimeoutMs,
9235
10029
  });
9236
10030
  this.conn.connect();
9237
10031
  }
@@ -9288,6 +10082,9 @@ class SubscriptionsManager {
9288
10082
  current: new Map(),
9289
10083
  };
9290
10084
  this.boundsSubs.set(subId, {
10085
+ bounds,
10086
+ owner: handlers.owner,
10087
+ prioritizeOwner: handlers.prioritizeOwner,
9291
10088
  onSnapshot: handlers.onSnapshot,
9292
10089
  onUpdate: handlers.onUpdate,
9293
10090
  onBoundsDelta: handlers.onBoundsDelta,
@@ -9296,14 +10093,67 @@ class SubscriptionsManager {
9296
10093
  this.sendMessage(msg);
9297
10094
  return handle;
9298
10095
  }
10096
+ subscribeOwner(owner, handlers = {}) {
10097
+ const subId = this.generateSubID('own');
10098
+ const msg = {
10099
+ type: 'subscribe',
10100
+ sub_id: subId,
10101
+ owner,
10102
+ };
10103
+ const handle = {
10104
+ subId,
10105
+ unsubscribe: () => this.unsubscribeBounds(subId),
10106
+ current: new Map(),
10107
+ };
10108
+ this.boundsSubs.set(subId, {
10109
+ bounds: undefined,
10110
+ owner,
10111
+ prioritizeOwner: undefined,
10112
+ onSnapshot: handlers.onSnapshot,
10113
+ onUpdate: handlers.onUpdate,
10114
+ handle,
10115
+ });
10116
+ this.sendMessage(msg);
10117
+ return handle;
10118
+ }
9299
10119
  unsubscribeBounds(subId) {
9300
10120
  this.boundsSubs.delete(subId);
9301
10121
  this.sendMessage({ type: 'unsubscribe', sub_id: subId });
9302
10122
  }
9303
10123
  updateBounds(subId, bounds) {
10124
+ const entry = this.boundsSubs.get(subId);
10125
+ if (entry)
10126
+ entry.bounds = bounds;
9304
10127
  const msg = { type: 'update_bounds', sub_id: subId, bounds };
9305
10128
  this.sendMessage(msg);
9306
10129
  }
10130
+ onStateChange(state) {
10131
+ if (state !== 'connected')
10132
+ return;
10133
+ if (!this.hasConnected) {
10134
+ this.hasConnected = true;
10135
+ return;
10136
+ }
10137
+ for (const [subId, entry] of this.entitySubs) {
10138
+ const msg = {
10139
+ type: 'subscribe_entity',
10140
+ sub_id: subId,
10141
+ entity_type: entry.type,
10142
+ entity_id: entry.id,
10143
+ };
10144
+ this.sendMessage(msg);
10145
+ }
10146
+ for (const [subId, entry] of this.boundsSubs) {
10147
+ const msg = {
10148
+ type: 'subscribe',
10149
+ sub_id: subId,
10150
+ bounds: entry.bounds,
10151
+ owner: entry.owner,
10152
+ prioritize_owner: entry.prioritizeOwner,
10153
+ };
10154
+ this.sendMessage(msg);
10155
+ }
10156
+ }
9307
10157
  onMessage(msg) {
9308
10158
  switch (msg.type) {
9309
10159
  case 'snapshot':
@@ -9565,15 +10415,22 @@ function assignModulesToSlots(packedEntityItemId, modules, entityLabel) {
9565
10415
  installed: r.installed,
9566
10416
  }));
9567
10417
  }
9568
- function decodePackedInput(m) {
9569
- return {
9570
- itemId: Number(UInt16.from(m.itemId).value.toString()),
9571
- stats: BigInt(UInt64.from(m.stats).toString()),
9572
- };
10418
+ function toInstalledModules(entries) {
10419
+ const installed = [];
10420
+ entries.forEach((entry, slotIndex) => {
10421
+ if (!entry.installed)
10422
+ return;
10423
+ installed.push({
10424
+ slotIndex,
10425
+ itemId: Number(UInt16.from(entry.installed.item_id).value.toString()),
10426
+ stats: BigInt(UInt64.from(entry.installed.stats).toString()),
10427
+ });
10428
+ });
10429
+ return installed;
9573
10430
  }
9574
- function computeStorageBonus(decoded, baseCapacity) {
10431
+ function computeStorageBonus(modules, baseCapacity) {
9575
10432
  let totalBonus = 0;
9576
- for (const m of decoded) {
10433
+ for (const m of modules) {
9577
10434
  if (getModuleCapabilityType(m.itemId) !== MODULE_STORAGE)
9578
10435
  continue;
9579
10436
  const stats = decodeCraftedItemStats(m.itemId, m.stats);
@@ -9582,10 +10439,10 @@ function computeStorageBonus(decoded, baseCapacity) {
9582
10439
  }
9583
10440
  return totalBonus;
9584
10441
  }
9585
- function deriveShipFromModules(modules, baseCapacity) {
9586
- const decoded = modules.map(decodePackedInput);
9587
- const capabilities = computeShipCapabilities(decoded);
9588
- const totalBonus = computeStorageBonus(decoded, baseCapacity);
10442
+ function deriveShipFromModules(moduleEntries, layout, baseCapacity) {
10443
+ const installed = toInstalledModules(moduleEntries);
10444
+ const capabilities = computeShipCapabilities(installed, layout);
10445
+ const totalBonus = computeStorageBonus(installed, baseCapacity);
9589
10446
  return { capabilities, finalCapacity: baseCapacity + totalBonus };
9590
10447
  }
9591
10448
  function makeShip(state) {
@@ -9609,9 +10466,10 @@ function makeShip(state) {
9609
10466
  if (state.schedule)
9610
10467
  info.schedule = state.schedule;
9611
10468
  let moduleEntries = [];
10469
+ const shipLayout = getEntityLayout(ITEM_SHIP_T1_PACKED)?.slots ?? [];
9612
10470
  if (state.modules && state.modules.length > 0) {
9613
10471
  moduleEntries = assignModulesToSlots(ITEM_SHIP_T1_PACKED, state.modules, 'Ship T1');
9614
- const { capabilities, finalCapacity } = deriveShipFromModules(state.modules, state.capacity ?? 0);
10472
+ const { capabilities, finalCapacity } = deriveShipFromModules(moduleEntries, shipLayout, state.capacity ?? 0);
9615
10473
  if (capabilities.engines)
9616
10474
  info.engines = capabilities.engines;
9617
10475
  if (capabilities.generator)
@@ -9656,13 +10514,14 @@ function makeWarehouse(state) {
9656
10514
  if (state.schedule)
9657
10515
  info.schedule = state.schedule;
9658
10516
  let moduleEntries = [];
10517
+ const warehouseLayout = getEntityLayout(ITEM_WAREHOUSE_T1_PACKED)?.slots ?? [];
9659
10518
  if (state.modules && state.modules.length > 0) {
9660
10519
  moduleEntries = assignModulesToSlots(ITEM_WAREHOUSE_T1_PACKED, state.modules, 'Warehouse T1');
9661
- const decoded = state.modules.map(decodePackedInput);
9662
- const capabilities = computeWarehouseCapabilities(decoded);
10520
+ const installed = toInstalledModules(moduleEntries);
10521
+ const capabilities = computeWarehouseCapabilities(installed, warehouseLayout);
9663
10522
  if (capabilities.loaders)
9664
10523
  info.loaders = capabilities.loaders;
9665
- const totalBonus = computeStorageBonus(decoded, state.capacity);
10524
+ const totalBonus = computeStorageBonus(installed, state.capacity);
9666
10525
  info.capacity = UInt32.from(state.capacity + totalBonus);
9667
10526
  }
9668
10527
  else {
@@ -9672,6 +10531,78 @@ function makeWarehouse(state) {
9672
10531
  const entityInfo = Types.entity_info.from(info);
9673
10532
  return new Warehouse(entityInfo);
9674
10533
  }
10534
+ function makeExtractor(state) {
10535
+ const info = {
10536
+ type: Name.from('extractor'),
10537
+ id: UInt64.from(state.id),
10538
+ owner: Name.from(state.owner),
10539
+ entity_name: state.name,
10540
+ coordinates: Types.coordinates.from(state.coordinates),
10541
+ cargomass: UInt32.from(0),
10542
+ cargo: state.cargo || [],
10543
+ is_idle: !state.schedule,
10544
+ current_task_elapsed: UInt32.from(0),
10545
+ current_task_remaining: UInt32.from(0),
10546
+ pending_tasks: [],
10547
+ };
10548
+ if (state.hullmass !== undefined)
10549
+ info.hullmass = UInt32.from(state.hullmass);
10550
+ if (state.energy !== undefined)
10551
+ info.energy = UInt16.from(state.energy);
10552
+ if (state.schedule)
10553
+ info.schedule = state.schedule;
10554
+ if (state.capacity !== undefined)
10555
+ info.capacity = UInt32.from(state.capacity);
10556
+ const moduleEntries = assignModulesToSlots(ITEM_EXTRACTOR_T1_PACKED, state.modules ?? [], 'Extractor T1');
10557
+ if (state.modules && state.modules.length > 0) {
10558
+ const layout = getEntityLayout(ITEM_EXTRACTOR_T1_PACKED)?.slots ?? [];
10559
+ const installed = toInstalledModules(moduleEntries);
10560
+ const capabilities = computeExtractorCapabilities(installed, layout);
10561
+ if (capabilities.generator)
10562
+ info.generator = capabilities.generator;
10563
+ if (capabilities.gatherer)
10564
+ info.gatherer = capabilities.gatherer;
10565
+ }
10566
+ info.modules = moduleEntries;
10567
+ const entityInfo = Types.entity_info.from(info);
10568
+ return new Extractor(entityInfo);
10569
+ }
10570
+ function makeFactory(state) {
10571
+ const info = {
10572
+ type: Name.from('factory'),
10573
+ id: UInt64.from(state.id),
10574
+ owner: Name.from(state.owner),
10575
+ entity_name: state.name,
10576
+ coordinates: Types.coordinates.from(state.coordinates),
10577
+ cargomass: UInt32.from(0),
10578
+ cargo: state.cargo || [],
10579
+ is_idle: !state.schedule,
10580
+ current_task_elapsed: UInt32.from(0),
10581
+ current_task_remaining: UInt32.from(0),
10582
+ pending_tasks: [],
10583
+ };
10584
+ if (state.hullmass !== undefined)
10585
+ info.hullmass = UInt32.from(state.hullmass);
10586
+ if (state.energy !== undefined)
10587
+ info.energy = UInt16.from(state.energy);
10588
+ if (state.schedule)
10589
+ info.schedule = state.schedule;
10590
+ if (state.capacity !== undefined)
10591
+ info.capacity = UInt32.from(state.capacity);
10592
+ const moduleEntries = assignModulesToSlots(ITEM_FACTORY_T1_PACKED, state.modules ?? [], 'Factory T1');
10593
+ if (state.modules && state.modules.length > 0) {
10594
+ const layout = getEntityLayout(ITEM_FACTORY_T1_PACKED)?.slots ?? [];
10595
+ const installed = toInstalledModules(moduleEntries);
10596
+ const capabilities = computeFactoryCapabilities(installed, layout);
10597
+ if (capabilities.generator)
10598
+ info.generator = capabilities.generator;
10599
+ if (capabilities.crafter)
10600
+ info.crafter = capabilities.crafter;
10601
+ }
10602
+ info.modules = moduleEntries;
10603
+ const entityInfo = Types.entity_info.from(info);
10604
+ return new Factory(entityInfo);
10605
+ }
9675
10606
  function makeContainer(state) {
9676
10607
  const entityInfo = Types.entity_info.from({
9677
10608
  type: Name.from('container'),
@@ -9692,6 +10623,23 @@ function makeContainer(state) {
9692
10623
  });
9693
10624
  return new Container(entityInfo);
9694
10625
  }
10626
+ function makeNexus(state) {
10627
+ const entityInfo = Types.entity_info.from({
10628
+ type: Name.from('nexus'),
10629
+ id: UInt64.from(state.id),
10630
+ owner: Name.from(state.owner),
10631
+ entity_name: state.name,
10632
+ coordinates: Types.coordinates.from(state.coordinates),
10633
+ cargomass: UInt32.from(0),
10634
+ cargo: [],
10635
+ modules: [],
10636
+ is_idle: true,
10637
+ current_task_elapsed: UInt32.from(0),
10638
+ current_task_remaining: UInt32.from(0),
10639
+ pending_tasks: [],
10640
+ });
10641
+ return new Nexus(entityInfo);
10642
+ }
9695
10643
 
9696
10644
  function totalCargoMass(cargo) {
9697
10645
  return cargo.reduce((sum, c) => {
@@ -9753,6 +10701,178 @@ var cargoUtils = /*#__PURE__*/Object.freeze({
9753
10701
  afterRemoveAllItems: afterRemoveAllItems
9754
10702
  });
9755
10703
 
10704
+ function cargoRef(src) {
10705
+ return {
10706
+ item_id: src.item_id,
10707
+ stats: src.stats,
10708
+ modules: src.modules ?? [],
10709
+ };
10710
+ }
10711
+ function cargoItem(src, quantity) {
10712
+ return {
10713
+ ...cargoRef(src),
10714
+ quantity,
10715
+ };
10716
+ }
10717
+
10718
+ function toChange(item, direction) {
10719
+ return {
10720
+ direction,
10721
+ item_id: Number(item.item_id),
10722
+ stats: BigInt(item.stats.toString()),
10723
+ modules: item.modules ?? [],
10724
+ quantity: Number(item.quantity),
10725
+ };
10726
+ }
10727
+ function taskCargoChanges(task) {
10728
+ const items = task.cargo ?? [];
10729
+ if (items.length === 0)
10730
+ return [];
10731
+ switch (Number(task.type)) {
10732
+ case TaskType.LOAD:
10733
+ case TaskType.UNWRAP:
10734
+ return items.map((i) => toChange(i, 'in'));
10735
+ case TaskType.GATHER:
10736
+ return task.entitytarget ? [] : items.map((i) => toChange(i, 'in'));
10737
+ case TaskType.UNLOAD:
10738
+ case TaskType.WRAP:
10739
+ return items.map((i) => toChange(i, 'out'));
10740
+ case TaskType.CRAFT:
10741
+ return [
10742
+ ...items.slice(0, -1).map((i) => toChange(i, 'out')),
10743
+ toChange(items[items.length - 1], 'in'),
10744
+ ];
10745
+ default:
10746
+ return [];
10747
+ }
10748
+ }
10749
+
10750
+ const ENTITY_SHIP = Name.from('ship');
10751
+ const ENTITY_WAREHOUSE = Name.from('warehouse');
10752
+ const ENTITY_EXTRACTOR = Name.from('extractor');
10753
+ const ENTITY_FACTORY = Name.from('factory');
10754
+ const ENTITY_CONTAINER = Name.from('container');
10755
+ const ENTITY_NEXUS = Name.from('nexus');
10756
+ var EntityClass;
10757
+ (function (EntityClass) {
10758
+ EntityClass[EntityClass["OrbitalVessel"] = 0] = "OrbitalVessel";
10759
+ EntityClass[EntityClass["PlanetaryStructure"] = 1] = "PlanetaryStructure";
10760
+ })(EntityClass || (EntityClass = {}));
10761
+ function getEntityClass(entityType) {
10762
+ const typeName = typeof entityType === 'string' ? entityType : entityType.toString();
10763
+ switch (typeName) {
10764
+ case 'ship':
10765
+ case 'container':
10766
+ case 'nexus':
10767
+ return EntityClass.OrbitalVessel;
10768
+ case 'warehouse':
10769
+ case 'extractor':
10770
+ case 'factory':
10771
+ return EntityClass.PlanetaryStructure;
10772
+ default:
10773
+ throw new Error(`Entity type has no class: ${typeName}`);
10774
+ }
10775
+ }
10776
+ function getPackedEntityType(itemId) {
10777
+ switch (itemId) {
10778
+ case ITEM_SHIP_T1_PACKED:
10779
+ return ENTITY_SHIP;
10780
+ case ITEM_CONTAINER_T1_PACKED:
10781
+ case ITEM_CONTAINER_T2_PACKED:
10782
+ return ENTITY_CONTAINER;
10783
+ case ITEM_WAREHOUSE_T1_PACKED:
10784
+ return ENTITY_WAREHOUSE;
10785
+ case ITEM_EXTRACTOR_T1_PACKED:
10786
+ return ENTITY_EXTRACTOR;
10787
+ case ITEM_FACTORY_T1_PACKED:
10788
+ return ENTITY_FACTORY;
10789
+ default:
10790
+ return null;
10791
+ }
10792
+ }
10793
+ const shipTraits = {
10794
+ typeName: ENTITY_SHIP,
10795
+ isMovable: true,
10796
+ hasEnergy: true,
10797
+ hasLoaders: true,
10798
+ hasModules: true,
10799
+ notFoundError: 'ship not found',
10800
+ };
10801
+ const warehouseTraits = {
10802
+ typeName: ENTITY_WAREHOUSE,
10803
+ isMovable: false,
10804
+ hasEnergy: false,
10805
+ hasLoaders: true,
10806
+ hasModules: true,
10807
+ notFoundError: 'warehouse not found',
10808
+ };
10809
+ const extractorTraits = {
10810
+ typeName: ENTITY_EXTRACTOR,
10811
+ isMovable: false,
10812
+ hasEnergy: true,
10813
+ hasLoaders: false,
10814
+ hasModules: true,
10815
+ notFoundError: 'extractor not found',
10816
+ };
10817
+ const factoryTraits = {
10818
+ typeName: ENTITY_FACTORY,
10819
+ isMovable: false,
10820
+ hasEnergy: true,
10821
+ hasLoaders: false,
10822
+ hasModules: true,
10823
+ notFoundError: 'factory not found',
10824
+ };
10825
+ const containerTraits = {
10826
+ typeName: ENTITY_CONTAINER,
10827
+ isMovable: true,
10828
+ hasEnergy: false,
10829
+ hasLoaders: false,
10830
+ hasModules: false,
10831
+ notFoundError: 'container not found',
10832
+ };
10833
+ const nexusTraits = {
10834
+ typeName: ENTITY_NEXUS,
10835
+ isMovable: false,
10836
+ hasEnergy: false,
10837
+ hasLoaders: false,
10838
+ hasModules: false,
10839
+ notFoundError: 'nexus not found',
10840
+ };
10841
+ function getEntityTraits(entityType) {
10842
+ const typeName = typeof entityType === 'string' ? entityType : entityType.toString();
10843
+ switch (typeName) {
10844
+ case 'ship':
10845
+ return shipTraits;
10846
+ case 'warehouse':
10847
+ return warehouseTraits;
10848
+ case 'extractor':
10849
+ return extractorTraits;
10850
+ case 'factory':
10851
+ return factoryTraits;
10852
+ case 'container':
10853
+ return containerTraits;
10854
+ case 'nexus':
10855
+ return nexusTraits;
10856
+ default:
10857
+ throw new Error(`Unknown entity type: ${typeName}`);
10858
+ }
10859
+ }
10860
+ function isShip(entity) {
10861
+ return entity.type?.equals(ENTITY_SHIP) ?? false;
10862
+ }
10863
+ function isWarehouse(entity) {
10864
+ return entity.type?.equals(ENTITY_WAREHOUSE) ?? false;
10865
+ }
10866
+ function isExtractor(entity) {
10867
+ return entity.type?.equals(ENTITY_EXTRACTOR) ?? false;
10868
+ }
10869
+ function isFactory(entity) {
10870
+ return entity.type?.equals(ENTITY_FACTORY) ?? false;
10871
+ }
10872
+ function isContainer(entity) {
10873
+ return entity.type?.equals(ENTITY_CONTAINER) ?? false;
10874
+ }
10875
+
9756
10876
  function canMove(e) {
9757
10877
  return 'engines' in e && 'generator' in e && 'energy' in e;
9758
10878
  }
@@ -9825,10 +10945,72 @@ function computeHaulPenalty(totalThrust, haulCount, avgEfficiency) {
9825
10945
  HAULER_EFFICIENCY_DENOM);
9826
10946
  return Math.floor((totalThrust * 1000) / penaltyMilli);
9827
10947
  }
9828
- function computeHaulerDrain(distance, drain, haulCount) {
10948
+ function computeHaulerDrain$1(distance, drain, haulCount) {
9829
10949
  return Math.floor(distance / PRECISION) * drain * haulCount;
9830
10950
  }
9831
10951
 
10952
+ const categoryColors = {
10953
+ ore: '#C26D3F',
10954
+ crystal: '#4ADBFF',
10955
+ gas: '#B8E4A0',
10956
+ regolith: '#C4A57B',
10957
+ biomass: '#5A8B3E',
10958
+ };
10959
+ const tierColors = {
10960
+ 1: '#8b8b8b',
10961
+ 2: '#4ade80',
10962
+ 3: '#818cf8',
10963
+ 4: '#c084fc',
10964
+ 5: '#fbbf24',
10965
+ 6: '#f97316',
10966
+ 7: '#ef4444',
10967
+ 8: '#ec4899',
10968
+ 9: '#06b6d4',
10969
+ 10: '#ffffff',
10970
+ };
10971
+ const categoryIcons = {
10972
+ ore: '⬡',
10973
+ crystal: '◈',
10974
+ gas: '◎',
10975
+ regolith: '■',
10976
+ biomass: '❋',
10977
+ };
10978
+ const categoryIconShapes = {
10979
+ ore: 'hex',
10980
+ crystal: 'diamond',
10981
+ gas: 'circle',
10982
+ regolith: 'square',
10983
+ biomass: 'star',
10984
+ };
10985
+ const componentIcon = '▣';
10986
+ const moduleIcon = '⬢';
10987
+ const itemAbbreviations = {
10988
+ 10001: 'HP',
10989
+ 10002: 'CL',
10990
+ 10003: 'TC',
10991
+ 10004: 'PC',
10992
+ 10005: 'DS',
10993
+ 10006: 'EP',
10994
+ 10007: 'CA',
10995
+ 10008: 'TB',
10996
+ 10009: 'RC',
10997
+ 10010: 'FA',
10998
+ 10100: 'EN',
10999
+ 10101: 'GN',
11000
+ 10102: 'EX',
11001
+ 10103: 'LD',
11002
+ 10104: 'MF',
11003
+ 10105: 'ST',
11004
+ 10106: 'HL',
11005
+ 10107: 'WP',
11006
+ 10200: 'CT',
11007
+ 10201: 'SH',
11008
+ 10202: 'WH',
11009
+ 20001: 'HP',
11010
+ 20002: 'CL',
11011
+ 20200: 'CT',
11012
+ };
11013
+
9832
11014
  const ITEM_TYPE_RESOURCE = 0;
9833
11015
  const ITEM_TYPE_COMPONENT = 1;
9834
11016
  const ITEM_TYPE_MODULE = 2;
@@ -9975,6 +11157,11 @@ const capabilityNames = [
9975
11157
  const capabilityAttributes = [
9976
11158
  { capability: 'Hull', attribute: 'mass', description: 'Total mass of the hull' },
9977
11159
  { capability: 'Storage', attribute: 'capacity', description: 'Maximum mass that can be stored' },
11160
+ {
11161
+ capability: 'Storage',
11162
+ attribute: 'bonus',
11163
+ description: 'Capacity bonus added by an installed Storage module',
11164
+ },
9978
11165
  { capability: 'Movement', attribute: 'thrust', description: 'Propulsion force' },
9979
11166
  { capability: 'Movement', attribute: 'drain', description: 'Energy consumed per movement' },
9980
11167
  { capability: 'Energy', attribute: 'capacity', description: 'Maximum energy storage' },
@@ -10012,338 +11199,151 @@ const capabilityAttributes = [
10012
11199
  description: 'Energy consumed per target during haul-beam operation',
10013
11200
  },
10014
11201
  ];
10015
- const statMappings = [
10016
- {
10017
- stat: 'Strength',
10018
- capability: 'Gathering',
10019
- attribute: 'yield',
10020
- rationale: 'Raw mechanical force drives faster gathering',
10021
- },
10022
- {
10023
- stat: 'Strength',
10024
- capability: 'Storage',
10025
- attribute: 'capacity',
10026
- rationale: 'Stronger walls hold more capacity per mass',
10027
- },
10028
- {
10029
- stat: 'Strength',
10030
- capability: 'Launch',
10031
- attribute: 'capacity',
10032
- rationale: 'Stronger housing handles larger launch loads',
10033
- },
10034
- {
10035
- stat: 'Tolerance',
10036
- capability: 'Movement',
10037
- attribute: 'thrust',
10038
- rationale: 'Engine components that tolerate more can push harder',
10039
- },
10040
- {
10041
- stat: 'Tolerance',
10042
- capability: 'Energy',
10043
- attribute: 'recharge',
10044
- rationale: 'Generator housing withstands stress for faster recharge',
10045
- },
10046
- {
10047
- stat: 'Tolerance',
10048
- capability: 'Gathering',
10049
- attribute: 'depth',
10050
- rationale: 'Housing withstands pressure/heat at extreme depths',
10051
- },
10052
- {
10053
- stat: 'Tolerance',
10054
- capability: 'Warp',
10055
- attribute: 'range',
10056
- rationale: 'Warp drive housing withstands extreme forces',
10057
- },
10058
- {
10059
- stat: 'Density',
10060
- capability: 'Hull',
10061
- attribute: 'mass',
10062
- rationale: 'Lighter metal = lighter hull',
10063
- },
10064
- {
10065
- stat: 'Density',
10066
- capability: 'Loader',
10067
- attribute: 'mass',
10068
- rationale: 'Lighter metal = lighter loader units',
10069
- },
10070
- {
10071
- stat: 'Density',
10072
- capability: 'Movement',
10073
- attribute: 'drain',
10074
- rationale: 'Lighter components require less energy to move',
10075
- },
10076
- {
10077
- stat: 'Conductivity',
10078
- capability: 'Movement',
10079
- attribute: 'drain',
10080
- rationale: 'Efficient energy transfer reduces movement energy cost',
10081
- },
10082
- {
10083
- stat: 'Conductivity',
10084
- capability: 'Gathering',
10085
- attribute: 'drain',
10086
- rationale: 'Efficient energy transfer reduces gathering energy cost',
10087
- },
10088
- {
10089
- stat: 'Conductivity',
10090
- capability: 'Crafter',
10091
- attribute: 'drain',
10092
- rationale: 'Efficient energy transfer reduces crafting energy cost',
10093
- },
10094
- {
10095
- stat: 'Conductivity',
10096
- capability: 'Energy',
10097
- attribute: 'recharge',
10098
- rationale: 'Better conductivity speeds energy flow during recharge',
10099
- },
10100
- {
10101
- stat: 'Ductility',
10102
- capability: 'Crafter',
10103
- attribute: 'quality',
10104
- rationale: 'Precise shaping enables tighter crafting tolerances',
10105
- },
10106
- {
10107
- stat: 'Ductility',
10108
- capability: 'Gathering',
10109
- attribute: 'yield',
10110
- rationale: 'Precisely shaped conduit components gather faster',
10111
- },
10112
- {
10113
- stat: 'Ductility',
10114
- capability: 'Storage',
10115
- attribute: 'capacity',
10116
- rationale: 'Precision-formed container walls maximize volume',
10117
- },
10118
- {
10119
- stat: 'Ductility',
10120
- capability: 'Loader',
10121
- attribute: 'mass',
10122
- rationale: 'Precision-formed precious metal reduces loader unit mass',
10123
- },
10124
- {
10125
- stat: 'Reflectivity',
10126
- capability: 'Gathering',
10127
- attribute: 'depth',
10128
- rationale: 'Reflective heat shielding protects equipment at depth',
10129
- },
10130
- {
10131
- stat: 'Reflectivity',
10132
- capability: 'Launch',
10133
- attribute: 'range',
10134
- rationale: 'Reflective surfaces focus electromagnetic launch energy',
10135
- },
10136
- {
10137
- stat: 'Volatility',
10138
- capability: 'Gathering',
10139
- attribute: 'yield',
10140
- rationale: 'Energy release powers faster gathering',
10141
- },
10142
- {
10143
- stat: 'Volatility',
10144
- capability: 'Movement',
10145
- attribute: 'thrust',
10146
- rationale: 'Energy release drives propulsion force',
10147
- },
10148
- {
10149
- stat: 'Volatility',
10150
- capability: 'Loader',
10151
- attribute: 'thrust',
10152
- rationale: 'Energy release powers loader motors',
10153
- },
10154
- {
10155
- stat: 'Volatility',
10156
- capability: 'Launch',
10157
- attribute: 'capacity',
10158
- rationale: 'Energy release enables launching heavier payloads',
10159
- },
10160
- {
10161
- stat: 'Reactivity',
10162
- capability: 'Crafter',
10163
- attribute: 'speed',
10164
- rationale: 'Reactive gases accelerate chemical/thermal processing',
10165
- },
10166
- {
10167
- stat: 'Reactivity',
10168
- capability: 'Gathering',
10169
- attribute: 'speed',
10170
- rationale: 'Reactive gases manage heat/friction during gathering',
10171
- },
10172
- {
10173
- stat: 'Reactivity',
10174
- capability: 'Launch',
10175
- attribute: 'drain',
10176
- rationale: 'Reactive gas medium reduces electromagnetic resistance',
10177
- },
10178
- {
10179
- stat: 'Thermal',
10180
- capability: 'Crafter',
10181
- attribute: 'quality',
10182
- rationale: 'Precise thermal control during fabrication',
10183
- },
10184
- {
10185
- stat: 'Thermal',
10186
- capability: 'Gathering',
10187
- attribute: 'drain',
10188
- rationale: 'Thermal management reduces energy waste during gathering',
10189
- },
10190
- {
10191
- stat: 'Thermal',
10192
- capability: 'Energy',
10193
- attribute: 'capacity',
10194
- rationale: 'Thermal management enables denser energy storage',
10195
- },
10196
- {
10197
- stat: 'Resonance',
10198
- capability: 'Energy',
10199
- attribute: 'capacity',
10200
- rationale: 'Resonating crystals store energy in fields',
10201
- },
10202
- {
10203
- stat: 'Resonance',
10204
- capability: 'Warp',
10205
- attribute: 'range',
10206
- rationale: 'Resonant crystals amplify warp field projection',
10207
- },
10208
- {
10209
- stat: 'Resonance',
10210
- capability: 'Launch',
10211
- attribute: 'range',
10212
- rationale: 'Resonant crystals focus electromagnetic launch field',
10213
- },
10214
- {
10215
- stat: 'Resonance',
10216
- capability: 'Launch',
10217
- attribute: 'capacity',
10218
- rationale: 'Stronger resonant field launches heavier payloads',
10219
- },
10220
- {
10221
- stat: 'Hardness',
10222
- capability: 'Crafter',
10223
- attribute: 'speed',
10224
- rationale: 'Hard tooling surfaces cut and shape materials faster',
10225
- },
10226
- {
10227
- stat: 'Hardness',
10228
- capability: 'Launch',
10229
- attribute: 'drain',
10230
- rationale: 'Hard rail surfaces reduce friction, less energy wasted',
10231
- },
10232
- {
10233
- stat: 'Clarity',
10234
- capability: 'Energy',
10235
- attribute: 'recharge',
10236
- rationale: 'Flawless crystals enable smoother energy flow during recharge',
10237
- },
10238
- {
10239
- stat: 'Clarity',
10240
- capability: 'Crafter',
10241
- attribute: 'quality',
10242
- rationale: 'Precision optics for calibration during fabrication',
10243
- },
10244
- {
10245
- stat: 'Clarity',
10246
- capability: 'Crafter',
10247
- attribute: 'drain',
10248
- rationale: 'Precision computing optimizes energy routing in factory',
10249
- },
10250
- {
10251
- stat: 'Plasticity',
10252
- capability: 'Crafter',
10253
- attribute: 'speed',
10254
- rationale: 'Easily reshaped materials speed up processing',
10255
- },
10256
- {
10257
- stat: 'Plasticity',
10258
- capability: 'Movement',
10259
- attribute: 'thrust',
10260
- rationale: 'Flexible polymer seals reduce friction in propulsion',
10261
- },
10262
- {
10263
- stat: 'Plasticity',
10264
- capability: 'Loader',
10265
- attribute: 'thrust',
10266
- rationale: 'Flexible joints improve loader force transfer',
10267
- },
10268
- {
10269
- stat: 'Insulation',
10270
- capability: 'Movement',
10271
- attribute: 'drain',
10272
- rationale: 'Better insulation reduces energy loss during movement',
10273
- },
10274
- {
10275
- stat: 'Insulation',
10276
- capability: 'Gathering',
10277
- attribute: 'drain',
10278
- rationale: 'Better insulation reduces energy loss during gathering',
10279
- },
10280
- {
10281
- stat: 'Insulation',
10282
- capability: 'Crafter',
10283
- attribute: 'drain',
10284
- rationale: 'Better insulation reduces energy loss during crafting',
11202
+ const invertedAttributes = new Set(['drain', 'mass']);
11203
+ function isInvertedAttribute(attribute) {
11204
+ return invertedAttributes.has(attribute);
11205
+ }
11206
+ function getCapabilityAttributes(capability) {
11207
+ if (capability) {
11208
+ return capabilityAttributes.filter((a) => a.capability === capability);
11209
+ }
11210
+ return capabilityAttributes;
11211
+ }
11212
+
11213
+ const ENTITY_HULL_SLOTS = {
11214
+ 0: { capability: 'Storage', attribute: 'capacity' },
11215
+ 1: { capability: 'Hull', attribute: 'mass' },
11216
+ 2: { capability: 'Storage', attribute: 'capacity' },
11217
+ 3: { capability: 'Storage', attribute: 'capacity' },
11218
+ };
11219
+ const SLOT_FORMULAS = {
11220
+ engine: {
11221
+ 0: { capability: 'Movement', attribute: 'thrust' },
11222
+ 1: { capability: 'Movement', attribute: 'drain' },
10285
11223
  },
10286
- {
10287
- stat: 'Insulation',
10288
- capability: 'Launch',
10289
- attribute: 'drain',
10290
- rationale: 'Better insulation reduces energy loss during launch',
11224
+ generator: {
11225
+ 0: { capability: 'Energy', attribute: 'capacity' },
11226
+ 1: { capability: 'Energy', attribute: 'recharge' },
10291
11227
  },
10292
- {
10293
- stat: 'Purity',
10294
- capability: 'Storage',
10295
- attribute: 'capacity',
10296
- rationale: 'Purer composites make better containers',
11228
+ gatherer: {
11229
+ 0: { capability: 'Gathering', attribute: 'yield' },
11230
+ 1: { capability: 'Gathering', attribute: 'depth' },
11231
+ 3: { capability: 'Gathering', attribute: 'drain' },
11232
+ 4: { capability: 'Gathering', attribute: 'speed' },
10297
11233
  },
10298
- {
10299
- stat: 'Purity',
10300
- capability: 'Gathering',
10301
- attribute: 'speed',
10302
- rationale: 'Purer bio-lubricants reduce friction during gathering',
11234
+ loader: {
11235
+ 0: { capability: 'Loader', attribute: 'mass' },
11236
+ 1: { capability: 'Loader', attribute: 'thrust' },
10303
11237
  },
10304
- {
10305
- stat: 'Purity',
10306
- capability: 'Energy',
10307
- attribute: 'capacity',
10308
- rationale: 'Purer organic electrolytes store more charge',
11238
+ crafter: {
11239
+ 0: { capability: 'Crafter', attribute: 'speed' },
11240
+ 1: { capability: 'Crafter', attribute: 'drain' },
10309
11241
  },
10310
- {
10311
- stat: 'Resonance',
10312
- capability: 'Hauler',
10313
- attribute: 'capacity',
10314
- rationale: 'Resonant field strength determines how many targets the haul beam can lock onto simultaneously.',
11242
+ storage: {
11243
+ 0: { capability: 'Storage', attribute: 'bonus' },
11244
+ 1: { capability: 'Storage', attribute: 'bonus' },
11245
+ 2: { capability: 'Storage', attribute: 'bonus' },
11246
+ 3: { capability: 'Storage', attribute: 'bonus' },
10315
11247
  },
10316
- {
10317
- stat: 'Conductivity',
10318
- capability: 'Hauler',
10319
- attribute: 'efficiency',
10320
- rationale: 'Energy-transfer efficiency reduces the thrust penalty from each hauled target.',
11248
+ hauler: {
11249
+ 0: { capability: 'Hauler', attribute: 'capacity' },
11250
+ 1: { capability: 'Hauler', attribute: 'efficiency' },
11251
+ 2: { capability: 'Hauler', attribute: 'drain' },
10321
11252
  },
10322
- {
10323
- stat: 'Clarity',
10324
- capability: 'Hauler',
10325
- attribute: 'drain',
10326
- rationale: 'Clarity-focused energy routing reduces per-target drain during haul-beam operation.',
11253
+ warp: {
11254
+ 0: { capability: 'Warp', attribute: 'range' },
10327
11255
  },
10328
- ];
10329
- const invertedAttributes = new Set(['drain', 'mass']);
10330
- function isInvertedAttribute(attribute) {
10331
- return invertedAttributes.has(attribute);
11256
+ 'ship-t1': ENTITY_HULL_SLOTS,
11257
+ 'container-t1': ENTITY_HULL_SLOTS,
11258
+ 'warehouse-t1': ENTITY_HULL_SLOTS,
11259
+ 'extractor-t1': ENTITY_HULL_SLOTS,
11260
+ 'container-t2': ENTITY_HULL_SLOTS,
11261
+ };
11262
+
11263
+ const KIND_TO_ITEM_ID = {
11264
+ engine: ITEM_ENGINE_T1,
11265
+ generator: ITEM_GENERATOR_T1,
11266
+ gatherer: ITEM_GATHERER_T1,
11267
+ loader: ITEM_LOADER_T1,
11268
+ crafter: ITEM_CRAFTER_T1,
11269
+ storage: ITEM_STORAGE_T1,
11270
+ hauler: ITEM_HAULER_T1,
11271
+ warp: ITEM_WARP_T1,
11272
+ 'ship-t1': ITEM_SHIP_T1_PACKED,
11273
+ 'container-t1': ITEM_CONTAINER_T1_PACKED,
11274
+ 'warehouse-t1': ITEM_WAREHOUSE_T1_PACKED,
11275
+ 'extractor-t1': ITEM_EXTRACTOR_T1_PACKED,
11276
+ 'container-t2': ITEM_CONTAINER_T2_PACKED,
11277
+ };
11278
+ function isCategoryInput(input) {
11279
+ return 'category' in input;
10332
11280
  }
10333
- function getCapabilityAttributes(capability) {
10334
- if (capability) {
10335
- return capabilityAttributes.filter((a) => a.capability === capability);
11281
+ function traceToRawCategoryStat(recipe, source, visited = new Set()) {
11282
+ const input = recipe.inputs[source.inputIndex];
11283
+ if (!input)
11284
+ return undefined;
11285
+ if (isCategoryInput(input)) {
11286
+ const defs = getStatDefinitions(input.category);
11287
+ return defs[source.statIndex];
10336
11288
  }
10337
- return capabilityAttributes;
11289
+ if (visited.has(input.itemId))
11290
+ return undefined;
11291
+ const subRecipe = getRecipe(input.itemId);
11292
+ if (!subRecipe)
11293
+ return undefined;
11294
+ const subSlot = subRecipe.statSlots[source.statIndex];
11295
+ if (!subSlot)
11296
+ return undefined;
11297
+ const subSource = subSlot.sources[0];
11298
+ if (!subSource)
11299
+ return undefined;
11300
+ const nextVisited = new Set(visited);
11301
+ nextVisited.add(input.itemId);
11302
+ return traceToRawCategoryStat(subRecipe, subSource, nextVisited);
11303
+ }
11304
+ let cached;
11305
+ function deriveStatMappings() {
11306
+ if (cached)
11307
+ return cached;
11308
+ const out = [];
11309
+ const seen = new Set();
11310
+ for (const [kind, slots] of Object.entries(SLOT_FORMULAS)) {
11311
+ const itemId = KIND_TO_ITEM_ID[kind];
11312
+ const recipe = getRecipe(itemId);
11313
+ if (!recipe)
11314
+ continue;
11315
+ for (const [slotIdxStr, consumer] of Object.entries(slots)) {
11316
+ const slotIdx = Number(slotIdxStr);
11317
+ const slot = recipe.statSlots[slotIdx];
11318
+ if (!slot)
11319
+ continue;
11320
+ for (const source of slot.sources) {
11321
+ const stat = traceToRawCategoryStat(recipe, source);
11322
+ if (!stat)
11323
+ continue;
11324
+ const key = `${stat.label}|${consumer.capability}|${consumer.attribute}`;
11325
+ if (seen.has(key))
11326
+ continue;
11327
+ seen.add(key);
11328
+ out.push({
11329
+ stat: stat.label,
11330
+ capability: consumer.capability,
11331
+ attribute: consumer.attribute,
11332
+ });
11333
+ }
11334
+ }
11335
+ }
11336
+ cached = out;
11337
+ return out;
10338
11338
  }
10339
11339
  function getStatMappings() {
10340
- return statMappings;
11340
+ return deriveStatMappings();
10341
11341
  }
10342
11342
  function getStatMappingsForStat(stat) {
10343
- return statMappings.filter((m) => m.stat === stat);
11343
+ return deriveStatMappings().filter((m) => m.stat === stat);
10344
11344
  }
10345
11345
  function getStatMappingsForCapability(capability) {
10346
- return statMappings.filter((m) => m.capability === capability);
11346
+ return deriveStatMappings().filter((m) => m.capability === capability);
10347
11347
  }
10348
11348
 
10349
11349
  function toNum(v) {
@@ -10415,7 +11415,7 @@ function resolveComponent(id, stats) {
10415
11415
  stats: resolvedStats,
10416
11416
  };
10417
11417
  }
10418
- function computeCapabilityGroup(moduleType, stats) {
11418
+ function computeCapabilityGroup(moduleType, stats, tier) {
10419
11419
  switch (moduleType) {
10420
11420
  case MODULE_ENGINE: {
10421
11421
  const caps = computeEngineCapabilities(stats);
@@ -10438,7 +11438,7 @@ function computeCapabilityGroup(moduleType, stats) {
10438
11438
  };
10439
11439
  }
10440
11440
  case MODULE_GATHERER: {
10441
- const caps = computeGathererCapabilities(stats);
11441
+ const caps = computeGathererCapabilities(stats, tier);
10442
11442
  return {
10443
11443
  capability: 'Gatherer',
10444
11444
  attributes: [
@@ -10482,10 +11482,11 @@ function computeCapabilityGroup(moduleType, stats) {
10482
11482
  };
10483
11483
  }
10484
11484
  case MODULE_STORAGE: {
10485
- const str = stats.strength ?? 500;
10486
- const hrd = stats.hardness ?? 500;
10487
- const sat = stats.saturation ?? 500;
10488
- const statSum = str + hrd + sat;
11485
+ const str = stats.strength;
11486
+ const den = stats.density;
11487
+ const hrd = stats.hardness;
11488
+ const sat = stats.saturation;
11489
+ const statSum = str + den + hrd + sat;
10489
11490
  const pct = 10 + Math.floor((statSum * 10) / 2997);
10490
11491
  return { capability: 'Storage', attributes: [{ label: 'Capacity Bonus', value: pct }] };
10491
11492
  }
@@ -10499,7 +11500,7 @@ function resolveModule(id, stats) {
10499
11500
  if (stats !== undefined) {
10500
11501
  const decoded = decodeCraftedItemStats(id, toBigStats(stats));
10501
11502
  const modType = getModuleCapabilityType(id);
10502
- const group = computeCapabilityGroup(modType, decoded);
11503
+ const group = computeCapabilityGroup(modType, decoded, item.tier);
10503
11504
  if (group)
10504
11505
  attributes = [group];
10505
11506
  }
@@ -10520,6 +11521,8 @@ function hullCapsForEntity(itemId, decoded) {
10520
11521
  return computeShipHullCapabilities(decoded);
10521
11522
  case ITEM_WAREHOUSE_T1_PACKED:
10522
11523
  return computeWarehouseHullCapabilities(decoded);
11524
+ case ITEM_EXTRACTOR_T1_PACKED:
11525
+ return computeShipHullCapabilities(decoded);
10523
11526
  case ITEM_CONTAINER_T1_PACKED:
10524
11527
  return computeContainerCapabilities(decoded);
10525
11528
  case ITEM_CONTAINER_T2_PACKED:
@@ -10555,14 +11558,17 @@ function resolveEntity(id, stats, modules) {
10555
11558
  const modStats = BigInt(mod.installed.stats.toString());
10556
11559
  const decodedStats = decodeCraftedItemStats(modItemId, modStats);
10557
11560
  const modType = getModuleCapabilityType(modItemId);
10558
- const group = computeCapabilityGroup(modType, decodedStats);
10559
11561
  let modName = 'Module';
11562
+ let modTier = 1;
10560
11563
  try {
10561
- modName = getItem(modItemId).name;
11564
+ const modItem = getItem(modItemId);
11565
+ modName = modItem.name;
11566
+ modTier = modItem.tier;
10562
11567
  }
10563
11568
  catch {
10564
11569
  modName = itemMetadata[modItemId]?.name ?? 'Module';
10565
11570
  }
11571
+ const group = computeCapabilityGroup(modType, decodedStats, modTier);
10566
11572
  return {
10567
11573
  name: modName,
10568
11574
  installed: true,
@@ -10778,7 +11784,7 @@ function idiv(a, b) {
10778
11784
  }
10779
11785
  function computeBaseHullmass(stats) {
10780
11786
  const density = decodeStat(stats, 1);
10781
- return 25000 + 75 * density;
11787
+ return 100000 - 75 * density;
10782
11788
  }
10783
11789
  function computeBaseCapacityShip(stats) {
10784
11790
  const s = decodeStat(stats, 0) + decodeStat(stats, 2) + decodeStat(stats, 3);
@@ -10790,22 +11796,28 @@ function computeBaseCapacityWarehouse(stats) {
10790
11796
  }
10791
11797
  const computeEngineThrust = (vol) => 400 + idiv(vol * 3, 4);
10792
11798
  const computeEngineDrain = (thm) => Math.max(30, 50 - idiv(thm, 70));
10793
- const computeGeneratorCap = (res) => 300 + idiv(res, 6);
10794
- const computeGeneratorRech = (ref) => 1 + idiv(ref * 3, 1000);
11799
+ const computeGeneratorCap = (com) => 300 + idiv(com, 6);
11800
+ const computeGeneratorRech = (fin) => 1 + idiv(fin * 3, 1000);
10795
11801
  const computeGathererYield = (str) => 200 + str;
10796
11802
  const computeGathererDrain = (con) => Math.max(250, 1250 - idiv(con * 25, 20));
10797
- const computeGathererDepth = (tol) => 200 + idiv(tol * 3, 2);
11803
+ const computeGathererDepth = (tol, tier) => gathererDepthForTier(tol, tier);
10798
11804
  const computeGathererSpeed = (ref) => 100 + idiv(ref * 4, 5);
10799
- const computeLoaderMass = (fin) => Math.max(200, 2000 - fin * 2);
11805
+ const computeLoaderMass = (ins) => Math.max(200, 2000 - ins * 2);
10800
11806
  const computeLoaderThrust = (pla) => 1 + idiv(pla, 500);
10801
11807
  const computeCrafterSpeed = (rea) => 100 + idiv(rea * 4, 5);
10802
- const computeCrafterDrain = (com) => Math.max(5, 30 - idiv(com, 33));
11808
+ const computeCrafterDrain = (fin) => Math.max(5, 30 - idiv(fin, 33));
11809
+ const computeHaulerCapacity = (fin) => Math.max(1, 1 + idiv(fin, 400));
11810
+ const computeHaulerEfficiency = (con) => 2000 + con * 6;
11811
+ const computeHaulerDrain = (com) => Math.max(3, 15 - idiv(com, 80));
11812
+ const computeWarpRange = (stat) => 100 + stat * 3;
10803
11813
  function entityDisplayName(itemId) {
10804
11814
  switch (itemId) {
10805
11815
  case ITEM_SHIP_T1_PACKED:
10806
11816
  return 'Ship';
10807
11817
  case ITEM_WAREHOUSE_T1_PACKED:
10808
11818
  return 'Warehouse';
11819
+ case ITEM_EXTRACTOR_T1_PACKED:
11820
+ return 'Extractor';
10809
11821
  case ITEM_CONTAINER_T1_PACKED:
10810
11822
  return 'Container';
10811
11823
  case ITEM_CONTAINER_T2_PACKED:
@@ -10828,6 +11840,10 @@ function moduleDisplayName(itemId) {
10828
11840
  return 'Crafter';
10829
11841
  case ITEM_STORAGE_T1:
10830
11842
  return 'Storage';
11843
+ case ITEM_HAULER_T1:
11844
+ return 'Hauler';
11845
+ case ITEM_WARP_T1:
11846
+ return 'Warp';
10831
11847
  default:
10832
11848
  return 'Module';
10833
11849
  }
@@ -10858,7 +11874,8 @@ function formatModuleLine(slot, itemId, stats) {
10858
11874
  const tol = decodeStat(stats, 1);
10859
11875
  const con = decodeStat(stats, 3);
10860
11876
  const ref = decodeStat(stats, 4);
10861
- out += ` Yield ${computeGathererYield(str)} Depth ${computeGathererDepth(tol)} Speed ${computeGathererSpeed(ref)} Drain ${computeGathererDrain(con)}`;
11877
+ const tier = getItem(itemId).tier;
11878
+ out += ` Yield ${computeGathererYield(str)} Depth ${computeGathererDepth(tol, tier)} Speed ${computeGathererSpeed(ref)} Drain ${computeGathererDrain(con)}`;
10862
11879
  break;
10863
11880
  }
10864
11881
  case MODULE_LOADER: {
@@ -10882,6 +11899,18 @@ function formatModuleLine(slot, itemId, stats) {
10882
11899
  out += ` +${pct}% capacity`;
10883
11900
  break;
10884
11901
  }
11902
+ case MODULE_HAULER: {
11903
+ const fin = decodeStat(stats, 0);
11904
+ const con = decodeStat(stats, 1);
11905
+ const com = decodeStat(stats, 2);
11906
+ out += ` Capacity ${computeHaulerCapacity(fin)} Efficiency ${computeHaulerEfficiency(con)} Drain ${computeHaulerDrain(com)}`;
11907
+ break;
11908
+ }
11909
+ case MODULE_WARP: {
11910
+ const stat = decodeStat(stats, 0);
11911
+ out += ` Range ${computeWarpRange(stat)}`;
11912
+ break;
11913
+ }
10885
11914
  }
10886
11915
  return out;
10887
11916
  }
@@ -10894,6 +11923,9 @@ function buildEntityDescription(itemId, hullStats, moduleItems, moduleStats) {
10894
11923
  else if (itemId === ITEM_WAREHOUSE_T1_PACKED) {
10895
11924
  baseCapacity = computeBaseCapacityWarehouse(hullStats);
10896
11925
  }
11926
+ else if (itemId === ITEM_EXTRACTOR_T1_PACKED) {
11927
+ baseCapacity = computeBaseCapacityShip(hullStats);
11928
+ }
10897
11929
  let out = entityDisplayName(itemId);
10898
11930
  out += ` - Hull ${hullMass} mass`;
10899
11931
  if (baseCapacity > 0) {
@@ -10907,6 +11939,118 @@ function buildEntityDescription(itemId, hullStats, moduleItems, moduleStats) {
10907
11939
  return out;
10908
11940
  }
10909
11941
 
11942
+ function deserializeAtomicData(data, schema) {
11943
+ let rawData;
11944
+ if (data && typeof data === 'object' && 'immutable_serialized_data' in data) {
11945
+ rawData = data
11946
+ .immutable_serialized_data;
11947
+ }
11948
+ else {
11949
+ rawData = data;
11950
+ }
11951
+ let bytes;
11952
+ if (typeof rawData === 'string') {
11953
+ const hex = rawData;
11954
+ bytes = new Uint8Array(hex.length / 2);
11955
+ for (let i = 0; i < hex.length; i += 2) {
11956
+ bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);
11957
+ }
11958
+ }
11959
+ else if (Array.isArray(rawData)) {
11960
+ bytes = new Uint8Array(rawData);
11961
+ }
11962
+ else {
11963
+ bytes = rawData;
11964
+ }
11965
+ let offset = 0;
11966
+ function readVarint() {
11967
+ let result = 0;
11968
+ let multiplier = 1;
11969
+ while (bytes[offset] >= 128) {
11970
+ result += (bytes[offset] - 128) * multiplier;
11971
+ offset++;
11972
+ multiplier *= 128;
11973
+ }
11974
+ result += bytes[offset] * multiplier;
11975
+ offset++;
11976
+ return result;
11977
+ }
11978
+ function readVarint64() {
11979
+ let result = 0n;
11980
+ let multiplier = 1n;
11981
+ while (bytes[offset] >= 128) {
11982
+ result += BigInt(bytes[offset] - 128) * multiplier;
11983
+ offset++;
11984
+ multiplier *= 128n;
11985
+ }
11986
+ result += BigInt(bytes[offset]) * multiplier;
11987
+ offset++;
11988
+ return result;
11989
+ }
11990
+ function readZigzagInt64() {
11991
+ const unsigned = readVarint64();
11992
+ if (unsigned % 2n === 0n) {
11993
+ return unsigned / 2n;
11994
+ }
11995
+ else {
11996
+ return -(unsigned / 2n) - 1n;
11997
+ }
11998
+ }
11999
+ function readString() {
12000
+ const length = readVarint();
12001
+ const str = new TextDecoder().decode(bytes.slice(offset, offset + length));
12002
+ offset += length;
12003
+ return str;
12004
+ }
12005
+ const RESERVED = 4;
12006
+ const result = {};
12007
+ while (offset < bytes.length) {
12008
+ const fieldIndex = readVarint() - RESERVED;
12009
+ const field = schema[fieldIndex];
12010
+ if (!field)
12011
+ break;
12012
+ switch (field.type) {
12013
+ case 'uint16':
12014
+ result[field.name] = readVarint();
12015
+ break;
12016
+ case 'uint32':
12017
+ result[field.name] = readVarint();
12018
+ break;
12019
+ case 'uint64':
12020
+ result[field.name] = readVarint64();
12021
+ break;
12022
+ case 'int32':
12023
+ result[field.name] = readZigzagInt64();
12024
+ break;
12025
+ case 'int64':
12026
+ result[field.name] = readZigzagInt64();
12027
+ break;
12028
+ case 'string':
12029
+ result[field.name] = readString();
12030
+ break;
12031
+ case 'uint16[]': {
12032
+ const len = readVarint();
12033
+ const arr = [];
12034
+ for (let i = 0; i < len; i++)
12035
+ arr.push(readVarint());
12036
+ result[field.name] = arr;
12037
+ break;
12038
+ }
12039
+ case 'uint64[]': {
12040
+ const len = readVarint();
12041
+ const arr = [];
12042
+ for (let i = 0; i < len; i++)
12043
+ arr.push(readVarint64());
12044
+ result[field.name] = arr;
12045
+ break;
12046
+ }
12047
+ default:
12048
+ throw new Error(`Unknown type: ${field.type}`);
12049
+ }
12050
+ }
12051
+ return result;
12052
+ }
12053
+
10910
12054
  var index = /*#__PURE__*/Object.freeze({
10911
12055
  __proto__: null,
10912
12056
  readCommonBase: readCommonBase,
@@ -10931,10 +12075,15 @@ var index = /*#__PURE__*/Object.freeze({
10931
12075
  computeLoaderThrust: computeLoaderThrust,
10932
12076
  computeCrafterSpeed: computeCrafterSpeed,
10933
12077
  computeCrafterDrain: computeCrafterDrain,
12078
+ computeHaulerCapacity: computeHaulerCapacity,
12079
+ computeHaulerEfficiency: computeHaulerEfficiency,
12080
+ computeHaulerDrain: computeHaulerDrain,
12081
+ computeWarpRange: computeWarpRange,
10934
12082
  entityDisplayName: entityDisplayName,
10935
12083
  moduleDisplayName: moduleDisplayName,
10936
12084
  formatModuleLine: formatModuleLine,
10937
- buildEntityDescription: buildEntityDescription
12085
+ buildEntityDescription: buildEntityDescription,
12086
+ deserializeAtomicData: deserializeAtomicData
10938
12087
  });
10939
12088
 
10940
12089
  function formatMass(kg) {
@@ -10971,5 +12120,5 @@ function describeItem(resolved, opts) {
10971
12120
  return `${tier} ${resolved.name} · ${mass}`;
10972
12121
  }
10973
12122
 
10974
- export { ActionsManager, BASE_ORBITAL_MASS, BLEND_INPUTS_MUST_MATCH, BLEND_REQUIRES_MULTIPLE, BLEND_STAT_LESS_NOT_SUPPORTED, CANCEL_CONTAINS_GROUPED_TASK, CANCEL_PAIRED_HAS_PENDING, CATEGORY_LABELS, COMMIT_ALREADY_SET, COMMIT_CANNOT_MATCH, COMMIT_NOT_SET, COMPANY_NOT_FOUND, CONTAINER_CAPACITY_EXCEEDED, CONTAINER_NOT_FOUND, CONTAINER_Z, CRAFT_ENERGY_DIVISOR, CRAFT_EXCEEDS_ENERGY_CAPACITY, CRAFT_NOT_ENOUGH_ENERGY, Container, Coordinates, DEPLOY_ENTITY_HAS_SCHEDULE, DEPTH_THRESHOLD_T1, DEPTH_THRESHOLD_T2, DEPTH_THRESHOLD_T3, DEPTH_THRESHOLD_T4, DEPTH_THRESHOLD_T5, DESTINATION_CAPACITY_EXCEEDED, ENTITY_CAPACITY_EXCEEDED, ENTITY_NO_CRAFTER, 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, GATHER_EXCEEDS_ENERGY_CAPACITY, GATHER_NOT_ENOUGH_ENERGY, GROUP_DUPLICATE_ENTITY, GROUP_EMPTY, GROUP_ENTITY_NOT_MOVABLE, GROUP_HAUL_CAPACITY_EXCEEDED, GROUP_NOT_FOUND, GROUP_NOT_SAME_LOCATION, GROUP_NOT_SAME_OWNER, GROUP_NO_THRUST, GameState, INSUFFICIENT_BALANCE, INSUFFICIENT_ITEM_QUANTITY, INSUFFICIENT_ITEM_SUPPLY, INVALID_AMOUNT, ITEM_BIOMASS_T1, ITEM_BIOMASS_T10, ITEM_BIOMASS_T2, ITEM_BIOMASS_T3, ITEM_BIOMASS_T4, ITEM_BIOMASS_T5, ITEM_BIOMASS_T6, ITEM_BIOMASS_T7, ITEM_BIOMASS_T8, ITEM_BIOMASS_T9, ITEM_CARGO_ARM, ITEM_CARGO_LINING, ITEM_CARGO_LINING_T2, ITEM_CONTAINER_T1_PACKED, ITEM_CONTAINER_T2_PACKED, ITEM_CRAFTER_T1, ITEM_CRYSTAL_T1, ITEM_CRYSTAL_T10, ITEM_CRYSTAL_T2, ITEM_CRYSTAL_T3, ITEM_CRYSTAL_T4, ITEM_CRYSTAL_T5, ITEM_CRYSTAL_T6, ITEM_CRYSTAL_T7, ITEM_CRYSTAL_T8, ITEM_CRYSTAL_T9, ITEM_DOES_NOT_EXIST, ITEM_ENGINE_T1, ITEM_FOCUSING_ARRAY, ITEM_GAS_T1, ITEM_GAS_T10, ITEM_GAS_T2, ITEM_GAS_T3, ITEM_GAS_T4, ITEM_GAS_T5, ITEM_GAS_T6, ITEM_GAS_T7, ITEM_GAS_T8, ITEM_GAS_T9, ITEM_GATHERER_T1, ITEM_GENERATOR_T1, ITEM_HAULER_T1, ITEM_HULL_PLATES, ITEM_HULL_PLATES_T2, ITEM_LOADER_T1, ITEM_MATTER_CONDUIT, ITEM_NOT_AVAILABLE_AT_LOCATION, ITEM_NOT_DEPLOYABLE, ITEM_NOT_PACKED_ENTITY, ITEM_ORE_T1, ITEM_ORE_T10, ITEM_ORE_T2, ITEM_ORE_T3, ITEM_ORE_T4, ITEM_ORE_T5, ITEM_ORE_T6, ITEM_ORE_T7, ITEM_ORE_T8, ITEM_ORE_T9, ITEM_POWER_CELL, ITEM_REACTION_CHAMBER, ITEM_REGOLITH_T1, ITEM_REGOLITH_T10, ITEM_REGOLITH_T2, ITEM_REGOLITH_T3, ITEM_REGOLITH_T4, ITEM_REGOLITH_T5, ITEM_REGOLITH_T6, ITEM_REGOLITH_T7, ITEM_REGOLITH_T8, ITEM_REGOLITH_T9, ITEM_SHIP_T1_PACKED, ITEM_STORAGE_T1, ITEM_SURVEY_PROBE, ITEM_THRUSTER_CORE, ITEM_TOOL_BIT, ITEM_TYPE_COMPONENT, ITEM_TYPE_ENTITY, ITEM_TYPE_MODULE, ITEM_TYPE_RESOURCE, ITEM_WAREHOUSE_T1_PACKED, InventoryAccessor, LOCATION_MAX_DEPTH, LOCATION_MIN_DEPTH, Location, LocationType, LocationsManager, MAX_ORBITAL_ALTITUDE, MIN_ORBITAL_ALTITUDE, MODULE_ANY, MODULE_CARGO_NOT_FOUND, MODULE_CRAFTER, MODULE_ENGINE, MODULE_ENTITY_BUSY, MODULE_GATHERER, MODULE_GENERATOR, MODULE_HAULER, MODULE_LAUNCHER, MODULE_LOADER, MODULE_NOT_MODULE, MODULE_SLOT_EMPTY, MODULE_SLOT_INVALID, MODULE_SLOT_OCCUPIED, MODULE_STORAGE, MODULE_TYPE_MISMATCH, MODULE_WARP, index as NFT, 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, PLAYER_NOT_JOINED, PRECISION$1 as PRECISION, platform as PlatformContract, Types$1 as PlatformTypes, Player, PlayersManager, RECIPE_INPUTS_EXCESS, RECIPE_INPUTS_INSUFFICIENT, RECIPE_INPUTS_INVALID, RECIPE_INPUTS_MIXED, RECIPE_NOT_FOUND, REQUIRES_MORE_THAN_ONE, REQUIRES_POSITIVE_VALUE, RESERVE_TIERS, RESOLVE_COUNT_EXCEEDS_COMPLETED, SHIP_ALREADY_THERE, SHIP_ALREADY_TRAVELING, SHIP_CANNOT_BUY_TRAVELING, SHIP_CANNOT_CANCEL_TASK, SHIP_CANNOT_UPDATE_TRAVELING, SHIP_CAPACITY_EXCEEDED, 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, STARTER_ALREADY_CLAIMED, ScheduleAccessor, server as ServerContract, Types as ServerTypes, Ship, Shipload, SubscriptionsManager, TIER_ADJECTIVES, TIER_ROLL_MAX, TRAVEL_MAX_DURATION, TaskCancelable, TaskType, WAREHOUSE_ALREADY_AT_LOCATION, WAREHOUSE_CAPACITY_EXCEEDED, WAREHOUSE_NOT_FOUND, WAREHOUSE_Z, WARP_HAS_CARGO, WARP_HAS_SCHEDULE, WARP_NOT_FULL_ENERGY, WARP_NO_CAPABILITY, WARP_OUT_OF_RANGE, Warehouse, WebSocketConnection, availableCapacity$1 as availableCapacity, availableCapacityFromMass, blendCargoStacks, blendComponentStacks, blendCrossGroup, blendStacks, buildEntityDescription, calcCargoItemMass, calcCargoMass, calcEnergyUsage, calcLoadDuration, calcStacksMass, calc_acceleration, calc_craft_duration, calc_craft_energy, calc_energyusage, calc_flighttime, calc_gather_duration, calc_gather_energy, 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, capabilityAttributes, capabilityNames, capsHasCrafter, capsHasGatherer, capsHasHauler, capsHasLoaders, capsHasMass, capsHasMovement, capsHasStorage, cargoItemToStack, cargoUtils, categoryColors, categoryFromIndex, categoryIconShapes, categoryIcons, categoryLabel, categoryLabelFromIndex, componentIcon, computeBaseCapacityShip, computeBaseCapacityWarehouse, computeBaseHullmass, computeComponentStats, computeContainerCapabilities, computeContainerT2Capabilities, computeCraftedOutputStats, computeCrafterCapabilities, computeCrafterDrain, computeCrafterSpeed, computeEngineCapabilities, computeEngineDrain, computeEngineThrust, computeEntityStats, computeGathererCapabilities, computeGathererDepth, computeGathererDrain, computeGathererSpeed, computeGathererYield, computeGeneratorCap, computeGeneratorCapabilities, computeGeneratorRech, computeHaulPenalty, computeHaulerCapabilities, computeHaulerDrain, computeInputMass, computeLoaderCapabilities, computeLoaderMass, computeLoaderThrust, computeShipCapabilities, computeShipHullCapabilities, computeStorageCapabilities, computeWarehouseCapabilities, computeWarehouseHullCapabilities, coordsToLocationId, createInventoryAccessor, createProjectedEntity, createScheduleAccessor, decodeCraftedItemStats, decodeStat, decodeStats, Shipload as default, deriveLocation, deriveLocationEpoch, deriveLocationSize, deriveLocationStatic, deriveResourceStats, deriveStrata, deriveStratum, describeItem, describeModule, describeModuleForItem, describeModuleForSlot, deserializeAsset, deserializeComponent, deserializeEntity, deserializeModule, deserializeResource, displayName, distanceBetweenCoordinates, distanceBetweenPoints, encodeGatheredCargoStats, encodeStats, energyPercent, entityDisplayName, estimateDealTravelTime, estimateTravelTime, findItemByCategoryAndTier, findNearbyPlanets, formatMass, formatMassDelta, formatModuleLine, formatTier, getCapabilityAttributes, getCategoryInfo, getComponents, getCurrentEpoch, getDepthThreshold, getDestinationLocation, getEligibleResources, getEntityItems, getEntityLayout, getEpochInfo, getFlightOrigin, getItem, getItems, getLocationCandidates, getLocationType, getLocationTypeName, getModuleCapabilityType, getModules, getPlanetSubtype, getPlanetSubtypes, getPositionAt, getRecipe, getResourceTier, getResourceWeight, getResources, getStatDefinitions, getStatMappings, getStatMappingsForCapability, getStatMappingsForStat, getStatName, getSystemName, hasEnergy, hasEnergyForDistance$1 as hasEnergyForDistance, hasGatherer, hasLoaders, hasMass, hasSchedule, hasSpace$1 as hasSpace, hasSpaceForMass, hasStorage, hasSystem, hash, hash512, isCraftedItem, isFull$1 as isFull, isFullFromMass, isGatherableLocation, isInvertedAttribute, isModuleItem, isRelatedItem, isSubscriptionsDebugEnabled, itemAbbreviations, itemCategory, itemIds, itemOffset, itemTier, itemTypeCode, lerp$1 as lerp, makeContainer, makeShip, makeWarehouse, mapEntity, maxTravelDistance, mergeStacks, moduleAccepts, moduleDisplayName, moduleIcon, moduleSlotTypeToCode, needsRecharge, parseWireEntity, projectEntity, projectEntityAt, projectFromCurrentState, projectFromCurrentStateAt, readCommonBase, removeFromStacks, renderDescription, resolveItem, resolveItemCategory, resolveStats, rollTier, rollWithinTier, rotation, schedule, setSubscriptionsDebug, stackKey, stackToCargoItem, stacksEqual, statMappings, tierColors, tierLabel, tierLabels, toLocation, typeLabel, validateSchedule };
12123
+ export { ActionsManager, BASE_ORBITAL_MASS, BLEND_INPUTS_MUST_MATCH, BLEND_REQUIRES_MULTIPLE, BLEND_STAT_LESS_NOT_SUPPORTED, CANCEL_CONTAINS_GROUPED_TASK, CANCEL_PAIRED_HAS_PENDING, CATEGORY_LABELS, COMMIT_ALREADY_SET, COMMIT_CANNOT_MATCH, COMMIT_NOT_SET, COMPANY_NOT_FOUND, CONTAINER_NOT_FOUND, CONTAINER_Z, CRAFT_ENERGY_DIVISOR, CRAFT_EXCEEDS_ENERGY_CAPACITY, CRAFT_NOT_ENOUGH_ENERGY, Container, Coordinates, DEPLOY_ENTITY_HAS_SCHEDULE, DEPTH_THRESHOLD_T1, DEPTH_THRESHOLD_T2, DEPTH_THRESHOLD_T3, DEPTH_THRESHOLD_T4, DEPTH_THRESHOLD_T5, DESTINATION_CAPACITY_EXCEEDED, ENTITY_ALREADY_THERE, ENTITY_CAPACITY_EXCEEDED, ENTITY_CARGO_NOT_LOADED, ENTITY_CARGO_NOT_OWNED, ENTITY_CONTAINER, ENTITY_EXTRACTOR, ENTITY_FACTORY, ENTITY_INVALID_CARGO, ENTITY_INVALID_DESTINATION, ENTITY_INVALID_TRAVEL_DURATION, ENTITY_NOT_ENOUGH_ENERGY, ENTITY_NOT_ENOUGH_ENERGY_CAPACITY, ENTITY_NO_CRAFTER, ENTITY_SHIP, ENTITY_WAREHOUSE, EPOCH_NON_ZERO, EPOCH_NOT_READY, ERROR_SYSTEM_ALREADY_INITIALIZED, ERROR_SYSTEM_DISABLED, ERROR_SYSTEM_NOT_INITIALIZED, EntitiesManager, EntityClass, EntityInventory, EntityType, EpochsManager, Extractor, Factory, GAME_NOT_FOUND, GAME_SEED_NOT_SET, GATHERER_DEPTH_MAX_TIER, GATHERER_DEPTH_TABLE, GATHER_EXCEEDS_ENERGY_CAPACITY, GATHER_NOT_ENOUGH_ENERGY, GROUP_DUPLICATE_ENTITY, GROUP_EMPTY, GROUP_ENTITY_NOT_MOVABLE, GROUP_HAUL_CAPACITY_EXCEEDED, GROUP_NOT_FOUND, GROUP_NOT_SAME_LOCATION, GROUP_NOT_SAME_OWNER, GROUP_NO_THRUST, GameState, INSUFFICIENT_BALANCE, INSUFFICIENT_ITEM_QUANTITY, INSUFFICIENT_ITEM_SUPPLY, INVALID_AMOUNT, ITEM_BIOMASS_T1, ITEM_BIOMASS_T10, ITEM_BIOMASS_T2, ITEM_BIOMASS_T3, ITEM_BIOMASS_T4, ITEM_BIOMASS_T5, ITEM_BIOMASS_T6, ITEM_BIOMASS_T7, ITEM_BIOMASS_T8, ITEM_BIOMASS_T9, ITEM_CARGO_ARM, ITEM_CARGO_LINING, ITEM_CARGO_LINING_T2, ITEM_CONTAINER_T1_PACKED, ITEM_CONTAINER_T2_PACKED, ITEM_CRAFTER_T1, ITEM_CRYSTAL_T1, ITEM_CRYSTAL_T10, ITEM_CRYSTAL_T2, ITEM_CRYSTAL_T3, ITEM_CRYSTAL_T4, ITEM_CRYSTAL_T5, ITEM_CRYSTAL_T6, ITEM_CRYSTAL_T7, ITEM_CRYSTAL_T8, ITEM_CRYSTAL_T9, ITEM_DOES_NOT_EXIST, ITEM_ENGINE_T1, ITEM_EXTRACTOR_T1_PACKED, ITEM_FACTORY_T1_PACKED, ITEM_FOCUSING_ARRAY, ITEM_GAS_T1, ITEM_GAS_T10, ITEM_GAS_T2, ITEM_GAS_T3, ITEM_GAS_T4, ITEM_GAS_T5, ITEM_GAS_T6, ITEM_GAS_T7, ITEM_GAS_T8, ITEM_GAS_T9, ITEM_GATHERER_T1, ITEM_GENERATOR_T1, ITEM_HAULER_T1, ITEM_HULL_PLATES, ITEM_HULL_PLATES_T2, ITEM_LOADER_T1, ITEM_MATTER_CONDUIT, ITEM_NOT_AVAILABLE_AT_LOCATION, ITEM_NOT_DEPLOYABLE, ITEM_NOT_PACKED_ENTITY, ITEM_ORE_T1, ITEM_ORE_T10, ITEM_ORE_T2, ITEM_ORE_T3, ITEM_ORE_T4, ITEM_ORE_T5, ITEM_ORE_T6, ITEM_ORE_T7, ITEM_ORE_T8, ITEM_ORE_T9, ITEM_POWER_CELL, ITEM_REACTION_CHAMBER, ITEM_REGOLITH_T1, ITEM_REGOLITH_T10, ITEM_REGOLITH_T2, ITEM_REGOLITH_T3, ITEM_REGOLITH_T4, ITEM_REGOLITH_T5, ITEM_REGOLITH_T6, ITEM_REGOLITH_T7, ITEM_REGOLITH_T8, ITEM_REGOLITH_T9, ITEM_SHIP_T1_PACKED, ITEM_STORAGE_T1, ITEM_SURVEY_PROBE, ITEM_THRUSTER_CORE, ITEM_TOOL_BIT, ITEM_TYPE_COMPONENT, ITEM_TYPE_ENTITY, ITEM_TYPE_MODULE, ITEM_TYPE_RESOURCE, ITEM_WAREHOUSE_T1_PACKED, ITEM_WARP_T1, InventoryAccessor, LOCATION_MAX_DEPTH, LOCATION_MIN_DEPTH, Location, LocationType, LocationsManager, MAX_ORBITAL_ALTITUDE, MIN_ORBITAL_ALTITUDE, MIN_TRANSFER_DISTANCE, MODULE_ANY, MODULE_CARGO_NOT_FOUND, MODULE_CRAFTER, MODULE_ENGINE, MODULE_ENTITY_BUSY, MODULE_GATHERER, MODULE_GENERATOR, MODULE_HAULER, MODULE_LAUNCHER, MODULE_LOADER, MODULE_NOT_MODULE, MODULE_SLOT_EMPTY, MODULE_SLOT_INVALID, MODULE_SLOT_OCCUPIED, MODULE_STORAGE, MODULE_TYPE_MISMATCH, MODULE_WARP, index as NFT, NO_SCHEDULE, Nexus, PLANETARY_STRUCTURE_Z, 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, PLAYER_NOT_JOINED, PRECISION$1 as PRECISION, platform as PlatformContract, Types$1 as PlatformTypes, Player, PlayersManager, RECIPE_INPUTS_EXCESS, RECIPE_INPUTS_INSUFFICIENT, RECIPE_INPUTS_INVALID, RECIPE_INPUTS_MIXED, RECIPE_NOT_FOUND, REQUIRES_MORE_THAN_ONE, REQUIRES_POSITIVE_VALUE, RESERVE_TIERS, RESOLVE_COUNT_EXCEEDS_COMPLETED, SHIP_ALREADY_TRAVELING, SHIP_CANNOT_BUY_TRAVELING, SHIP_CANNOT_CANCEL_TASK, SHIP_CANNOT_UPDATE_TRAVELING, SHIP_NOT_ARRIVED, SHIP_NOT_FOUND, SHIP_NOT_IDLE, SHIP_NOT_OWNED, SHIP_NO_COMPLETED_TASKS, SHIP_NO_TASKS_TO_CANCEL, SLOT_FORMULAS, STARTER_ALREADY_CLAIMED, ScheduleAccessor, server as ServerContract, Types as ServerTypes, Ship, Shipload, SubscriptionsManager, TIER_ADJECTIVES, TIER_ROLL_MAX, TRAVEL_MAX_DURATION, TaskCancelable, TaskType, WAREHOUSE_ALREADY_AT_LOCATION, WAREHOUSE_NOT_FOUND, WARP_HAS_CARGO, WARP_HAS_SCHEDULE, WARP_NOT_FULL_ENERGY, WARP_NO_CAPABILITY, WARP_OUT_OF_RANGE, Warehouse, WebSocketConnection, availableCapacity$1 as availableCapacity, availableCapacityFromMass, blendCargoStacks, blendComponentStacks, blendCrossGroup, blendStacks, buildEntityDescription, calcCargoItemMass, calcCargoMass, calcEnergyUsage, calcLoadDuration, calcStacksMass, calc_acceleration, calc_craft_duration, calc_craft_energy, calc_energyusage, calc_flighttime, calc_gather_duration, calc_gather_energy, 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, capabilityAttributes, capabilityNames, capsHasCrafter, capsHasGatherer, capsHasHauler, capsHasLoaders, capsHasMass, capsHasMovement, capsHasStorage, cargoItem, cargoItemToStack, cargoRef, cargoUtils, categoryColors, categoryFromIndex, categoryIconShapes, categoryIcons, categoryLabel, categoryLabelFromIndex, componentIcon, computeBaseCapacityShip, computeBaseCapacityWarehouse, computeBaseHullmass, computeComponentStats, computeContainerCapabilities, computeContainerT2Capabilities, computeCraftedOutputStats, computeCrafterCapabilities, computeCrafterDrain, computeCrafterSpeed, computeEngineCapabilities, computeEngineDrain, computeEngineThrust, computeEntityStats, computeExtractorCapabilities, computeFactoryCapabilities, computeGathererCapabilities, computeGathererDepth, computeGathererDrain, computeGathererSpeed, computeGathererYield, computeGeneratorCap, computeGeneratorCapabilities, computeGeneratorRech, computeHaulPenalty, computeHaulerCapabilities, computeHaulerCapacity, computeHaulerDrain$1 as computeHaulerDrain, computeHaulerEfficiency, computeInputMass, computeLoaderCapabilities, computeLoaderMass, computeLoaderThrust, computeShipCapabilities, computeShipHullCapabilities, computeStorageCapabilities, computeWarehouseCapabilities, computeWarehouseHullCapabilities, computeWarpRange, containerTraits, coordsToLocationId, createInventoryAccessor, createProjectedEntity, createScheduleAccessor, decodeCraftedItemStats, decodeStat, decodeStats, Shipload as default, deriveLocation, deriveLocationSize, deriveLocationStatic, deriveResourceStats, deriveStatMappings, deriveStrata, deriveStratum, describeItem, describeModule, describeModuleForItem, describeModuleForSlot, deserializeAsset, deserializeAtomicData, deserializeComponent, deserializeEntity, deserializeModule, deserializeResource, displayName, distanceBetweenCoordinates, distanceBetweenPoints, easeFlightProgress, encodeGatheredCargoStats, encodeStats, energyPercent, entityDisplayName, estimateDealTravelTime, estimateTravelTime, extractorTraits, factoryTraits, findItemByCategoryAndTier, findNearbyPlanets, flightSpeedFactor, formatMass, formatMassDelta, formatModuleLine, formatTier, gathererDepthForTier, getCapabilityAttributes, getCategoryInfo, getComponents, getCurrentEpoch, getDepthThreshold, getDestinationLocation, getEligibleResources, getEntityClass, getEntityItems, getEntityLayout, getEntityTraits, getEpochInfo, getFlightOrigin, getInterpolatedPosition, getItem, getItems, getLocationCandidates, getLocationProfile, getLocationType, getLocationTypeName, getModuleCapabilityType, getModules, getPackedEntityType, getPlanetSubtype, getPlanetSubtypes, getPositionAt, getRecipe, getResourceTier, getResourceWeight, getResources, getStatDefinitions, getStatMappings, getStatMappingsForCapability, getStatMappingsForStat, getStatName, getSystemName, hasEnergy, hasEnergyForDistance$1 as hasEnergyForDistance, hasGatherer, hasLoaders, hasMass, hasSchedule, hasSpace$1 as hasSpace, hasSpaceForMass, hasStorage, hasSystem, hash, hash512, interpolateFlightPosition, isContainer, isCraftedItem, isExtractor, isFactory, isFull$1 as isFull, isFullFromMass, isGatherableLocation, isInvertedAttribute, isLocationBuildable, isModuleItem, isRelatedItem, isShip, isSubscriptionsDebugEnabled, isWarehouse, itemAbbreviations, itemCategory, itemIds, itemOffset, itemTier, itemTypeCode, lerp$1 as lerp, makeContainer, makeExtractor, makeFactory, makeNexus, makeShip, makeWarehouse, mapEntity, maxTravelDistance, mergeStacks, moduleAccepts, moduleDisplayName, moduleIcon, moduleSlotTypeToCode, needsRecharge, parseWireEntity, projectEntity, projectEntityAt, projectFromCurrentState, projectFromCurrentStateAt, readCommonBase, removeFromStacks, renderDescription, resolveItem, resolveItemCategory, resolveStats, rollTier, rollWithinTier, rotation, schedule, setSubscriptionsDebug, shipTraits, stackKey, stackToCargoItem, stacksEqual, taskCargoChanges, tierAdjective, tierColors, toLocation, typeLabel, validateSchedule, warehouseTraits };
10975
12124
  //# sourceMappingURL=shipload.m.js.map