@volter/world-core 3.0.38 → 3.0.40

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 (179) hide show
  1. package/app-route.cjs +26 -25
  2. package/app-route.d.cts +1 -0
  3. package/dist/app-route.cjs +26 -25
  4. package/dist/app-route.d.cts +1 -0
  5. package/dist/generated/pack-facts.json +409 -352
  6. package/dist/inject.cjs +474 -95
  7. package/dist/network-policy.cjs +110 -13
  8. package/dist/network-policy.d.cts +8 -3
  9. package/dist/src/actions.js +2 -1
  10. package/dist/src/anthropic-wire.d.ts +2 -0
  11. package/dist/src/anthropic-wire.js +5 -0
  12. package/dist/src/attestation.d.ts +6 -0
  13. package/dist/src/attestation.js +27 -0
  14. package/dist/src/bytes.d.ts +3 -0
  15. package/dist/src/bytes.js +17 -0
  16. package/dist/src/changeset.js +2 -1
  17. package/dist/src/clickhouse/sql.js +73 -14
  18. package/dist/src/derived-core.d.ts +210 -32
  19. package/dist/src/derived-core.js +510 -244
  20. package/dist/src/derived-real.d.ts +1 -1
  21. package/dist/src/derived-real.js +704 -93
  22. package/dist/src/derived.d.ts +18 -2
  23. package/dist/src/derived.js +21 -2
  24. package/dist/src/events.d.ts +28 -45
  25. package/dist/src/events.js +40 -58
  26. package/dist/src/exact-json.d.ts +10 -0
  27. package/dist/src/exact-json.js +98 -0
  28. package/dist/src/executor.d.ts +17 -0
  29. package/dist/src/executor.js +91 -30
  30. package/dist/src/file-response.js +1 -1
  31. package/dist/src/form.d.ts +8 -0
  32. package/dist/src/form.js +76 -0
  33. package/dist/src/git/format.d.ts +16 -0
  34. package/dist/src/git/format.js +110 -0
  35. package/dist/src/git/index.d.ts +1 -0
  36. package/dist/src/git/index.js +1 -0
  37. package/dist/src/git/lfs.d.ts +1 -1
  38. package/dist/src/git/lfs.js +4 -3
  39. package/dist/src/graphql-wire.d.ts +6 -0
  40. package/dist/src/graphql-wire.js +6 -3
  41. package/dist/src/grpc-wire.js +2 -1
  42. package/dist/src/head.d.ts +1 -0
  43. package/dist/src/head.js +15 -4
  44. package/dist/src/held-reads.d.ts +6 -0
  45. package/dist/src/held-reads.js +60 -0
  46. package/dist/src/history.js +5 -4
  47. package/dist/src/host-port.d.ts +5 -0
  48. package/dist/src/host-port.js +14 -0
  49. package/dist/src/index.d.ts +11 -3
  50. package/dist/src/index.js +9 -4
  51. package/dist/src/log.js +12 -7
  52. package/dist/src/machines.d.ts +81 -5
  53. package/dist/src/machines.js +125 -9
  54. package/dist/src/managed-database.d.ts +15 -11
  55. package/dist/src/managed-database.js +38 -37
  56. package/dist/src/multipart.d.ts +21 -3
  57. package/dist/src/multipart.js +112 -38
  58. package/dist/src/observe.d.ts +3 -0
  59. package/dist/src/observe.js +6 -2
  60. package/dist/src/openai-wire.d.ts +16 -0
  61. package/dist/src/openai-wire.js +43 -12
  62. package/dist/src/pack-fetch.d.ts +4 -6
  63. package/dist/src/pack-fetch.js +189 -57
  64. package/dist/src/packRegistry.d.ts +7 -1
  65. package/dist/src/packRegistry.js +20 -3
  66. package/dist/src/private-transport.d.ts +1 -0
  67. package/dist/src/private-transport.js +11 -0
  68. package/dist/src/protobuf.js +10 -4
  69. package/dist/src/rateBudget.d.ts +8 -1
  70. package/dist/src/rateBudget.js +1 -0
  71. package/dist/src/redis/engine.d.ts +14 -5
  72. package/dist/src/redis/engine.js +271 -72
  73. package/dist/src/redis/frames.d.ts +17 -0
  74. package/dist/src/redis/frames.js +123 -0
  75. package/dist/src/redis/index.d.ts +6 -0
  76. package/dist/src/redis/index.js +6 -0
  77. package/dist/src/redis/json.d.ts +2 -0
  78. package/dist/src/redis/json.js +14 -0
  79. package/dist/src/redis/lua-libs.d.ts +4 -0
  80. package/dist/src/redis/lua-libs.js +173 -0
  81. package/dist/src/redis/lua.d.ts +1 -0
  82. package/dist/src/redis/lua.js +36 -0
  83. package/dist/src/redis/member-storage.d.ts +5 -0
  84. package/dist/src/redis/member-storage.js +75 -0
  85. package/dist/src/redis/resp2.d.ts +4 -0
  86. package/dist/src/redis/resp2.js +29 -0
  87. package/dist/src/redis/stream.d.ts +14 -0
  88. package/dist/src/redis/stream.js +335 -0
  89. package/dist/src/remote-execute.d.ts +2 -2
  90. package/dist/src/request-body.d.ts +11 -0
  91. package/dist/src/request-body.js +11 -0
  92. package/dist/src/runtime.d.ts +6 -5
  93. package/dist/src/runtime.js +5 -5
  94. package/dist/src/s3/wire.d.ts +4 -4
  95. package/dist/src/s3/wire.js +5 -3
  96. package/dist/src/scenario.d.ts +22 -0
  97. package/dist/src/scenario.js +35 -31
  98. package/dist/src/serve-http.d.ts +2 -1
  99. package/dist/src/serve-http.js +10 -1
  100. package/dist/src/serve.js +7 -4
  101. package/dist/src/signing.d.ts +23 -5
  102. package/dist/src/signing.js +74 -11
  103. package/dist/src/sigv4.d.ts +3 -1
  104. package/dist/src/sigv4.js +4 -2
  105. package/dist/src/smtp.js +2 -1
  106. package/dist/src/sockets.js +8 -3
  107. package/dist/src/state-system.d.ts +3 -0
  108. package/dist/src/storage.js +5 -2
  109. package/dist/src/twin-fetch.d.ts +3 -1
  110. package/dist/src/twin-fetch.js +3 -2
  111. package/dist/src/vendor-call.d.ts +10 -3
  112. package/dist/src/vendor-call.js +58 -14
  113. package/dist/test-fixtures/attestation.SOURCE.md +1 -0
  114. package/dist/test-fixtures/attestation.json +50 -0
  115. package/generated/pack-facts.json +409 -352
  116. package/inject.cjs +474 -95
  117. package/network-policy.cjs +110 -13
  118. package/network-policy.d.cts +8 -3
  119. package/package.json +11 -4
  120. package/src/actions.ts +2 -1
  121. package/src/anthropic-wire.ts +6 -0
  122. package/src/attestation.ts +23 -0
  123. package/src/bytes.ts +21 -0
  124. package/src/changeset.ts +2 -1
  125. package/src/clickhouse/sql.ts +50 -16
  126. package/src/derived-core.ts +573 -249
  127. package/src/derived-real.ts +552 -42
  128. package/src/derived.ts +23 -4
  129. package/src/events.ts +54 -85
  130. package/src/exact-json.ts +71 -0
  131. package/src/executor.ts +86 -27
  132. package/src/file-response.ts +1 -1
  133. package/src/form.ts +66 -0
  134. package/src/git/format.ts +89 -0
  135. package/src/git/index.ts +1 -0
  136. package/src/git/lfs.ts +5 -4
  137. package/src/graphql-wire.ts +8 -3
  138. package/src/grpc-wire.ts +2 -1
  139. package/src/head.ts +15 -5
  140. package/src/held-reads.ts +54 -0
  141. package/src/history.ts +5 -4
  142. package/src/host-port.ts +9 -0
  143. package/src/index.ts +10 -4
  144. package/src/log.ts +11 -7
  145. package/src/machines.ts +135 -13
  146. package/src/managed-database.ts +48 -40
  147. package/src/multipart.ts +110 -35
  148. package/src/observe.ts +6 -3
  149. package/src/openai-wire.ts +45 -14
  150. package/src/pack-fetch.ts +173 -50
  151. package/src/packRegistry.ts +27 -4
  152. package/src/private-transport.ts +8 -0
  153. package/src/protobuf.ts +8 -4
  154. package/src/rateBudget.ts +6 -1
  155. package/src/redis/engine.ts +168 -63
  156. package/src/redis/frames.ts +53 -0
  157. package/src/redis/index.ts +6 -0
  158. package/src/redis/json.ts +13 -0
  159. package/src/redis/lua-libs.ts +62 -0
  160. package/src/redis/lua.ts +20 -0
  161. package/src/redis/member-storage.ts +58 -0
  162. package/src/redis/resp2.ts +25 -0
  163. package/src/redis/stream.ts +102 -0
  164. package/src/remote-execute.ts +2 -2
  165. package/src/request-body.ts +12 -0
  166. package/src/runtime.ts +6 -5
  167. package/src/s3/wire.ts +8 -5
  168. package/src/scenario.ts +34 -13
  169. package/src/serve-http.ts +11 -2
  170. package/src/serve.ts +4 -3
  171. package/src/signing.ts +71 -17
  172. package/src/sigv4.ts +5 -3
  173. package/src/smtp.ts +3 -2
  174. package/src/sockets.ts +8 -3
  175. package/src/state-system.ts +3 -0
  176. package/src/storage.ts +5 -2
  177. package/src/twin-fetch.ts +4 -3
  178. package/src/vendor-call.ts +59 -12
  179. package/test-fixtures/attestation.json +50 -0
@@ -3,12 +3,21 @@
3
3
  // Google's token endpoint — and in a World that other vendor is the World's twin of it. The call is addressed as the
4
4
  // vendor's own URL and reaches that twin by the same host rules the injector routes an application by (vendor-hosts.cjs),
5
5
  // carrying the World's twins key; a vendor the World runs no twin of is refused, never reached: a twin makes no direct
6
- // vendor call (simulated execution is deterministic and stays inside the World). This is the one network a handler has;
7
- // importing this module does nothing.
6
+ // vendor call (simulated execution is deterministic and stays inside the World). A twin this process answers itself (a
7
+ // journey walk's companions, `setInProcessTwins`) is reached first, in process; the instance's twins otherwise. This is
8
+ // the one network a handler has; importing this module does nothing.
8
9
  import { twinOrigins, VENDOR_HOSTS } from '../vendor-hosts.cjs';
9
10
  /** A call to a vendor the World runs no twin of. */
10
11
  export class VendorUnreachableError extends Error {
11
- constructor(message) { super(message); this.name = 'VendorUnreachableError'; }
12
+ constructor(message, options) { super(message, options); this.name = 'VendorUnreachableError'; }
13
+ }
14
+ let inProcessTwins = {};
15
+ /** The twins this process answers itself, by routing key (a key of VENDOR_HOSTS: a journey walk's companions, over the
16
+ * walk's own World), consulted before the instance's; returns those set before, which the caller puts back. */
17
+ export function setInProcessTwins(twins) {
18
+ const previous = inProcessTwins;
19
+ inProcessTwins = twins;
20
+ return previous;
12
21
  }
13
22
  /** The World's twins by vendor: the instance's env (every twin's URL, whenever this process started) over this
14
23
  * process's own. */
@@ -25,17 +34,52 @@ async function worldTwins() {
25
34
  }
26
35
  return { ...twinOrigins(env), ...twinOrigins(instanceEnv) };
27
36
  }
28
- /** `url`, a vendor's own address, answered by the World's twin of that vendor. */
29
- export async function vendorFetch(url, init = {}) {
30
- const target = new URL(String(url));
37
+ /** One URL answered only by a World-held application or vendor twin: the fetch's application stand-in first (its answer
38
+ * is the application's; `'unreachable'` leaves no application to reach, the World's twins still reachable). */
39
+ async function worldResponse(target, init, standIn) {
40
+ const scripted = await standIn?.(target.toString(), init);
41
+ if (scripted !== undefined && scripted !== 'unreachable') {
42
+ // A source may answer its headers then lose its body transport. Preserve that failure until the caller reads.
43
+ const body = scripted.bodyError === undefined ? scripted.body : new ReadableStream({
44
+ start(controller) { controller.error(new TypeError(scripted.bodyError)); },
45
+ });
46
+ return new Response([204, 205, 304].includes(scripted.status) || init.method === 'HEAD' ? null : body, { status: scripted.status, headers: scripted.headers });
47
+ }
48
+ const local = Object.keys(VENDOR_HOSTS).find(v => inProcessTwins[v] !== undefined && VENDOR_HOSTS[v](target.hostname, target.pathname));
49
+ if (local !== undefined) {
50
+ const headers = new Headers(init.headers);
51
+ headers.set('x-volter-twin-original-host', target.host);
52
+ return inProcessTwins[local](new Request(target, { ...init, headers, redirect: 'manual' }));
53
+ }
31
54
  const twins = await worldTwins();
32
55
  const vendor = Object.keys(VENDOR_HOSTS).find((v) => twins[v] !== undefined && VENDOR_HOSTS[v](target.hostname, target.pathname));
33
- if (vendor === undefined)
34
- throw new VendorUnreachableError(`${target.host}${target.pathname}: this World runs no twin of it, and a twin calls only the World's twins`);
35
- const headers = new Headers(init.headers);
36
- headers.set('x-volter-twin-original-host', target.host);
37
- const key = process.env.VOLTER_TWINS_KEY;
38
- if (key && !headers.has('x-twins-key'))
39
- headers.set('x-twins-key', key);
40
- return fetch(`${twins[vendor].replace(/\/$/, '')}${target.pathname}${target.search}`, { ...init, headers });
56
+ if (vendor !== undefined) {
57
+ const headers = new Headers(init.headers);
58
+ headers.set('x-volter-twin-original-host', target.host);
59
+ const key = process.env.VOLTER_TWINS_KEY;
60
+ if (key && !headers.has('x-twins-key'))
61
+ headers.set('x-twins-key', key);
62
+ return fetch(`${twins[vendor].replace(/\/$/, '')}${target.pathname}${target.search}`, { ...init, headers, redirect: 'manual' });
63
+ }
64
+ const { appDestination, appFetch } = await import('../app-route.cjs');
65
+ if (scripted !== 'unreachable' && appDestination(target))
66
+ return appFetch(target, { ...init, redirect: 'manual' });
67
+ throw new VendorUnreachableError(`${target.host}${target.pathname}: this World holds no application or vendor twin at this URL`);
68
+ }
69
+ /** A vendor URL (or the World's application), including redirects, always answered inside the World; `standIn` is the
70
+ * calling fetch's application stand-in (PackFetchOptions.application), consulted at every hop. */
71
+ export async function vendorFetch(url, init = {}, standIn) {
72
+ const { followRedirects } = await import('../app-route.cjs');
73
+ try {
74
+ return await followRedirects(url, init, async (target, request) => {
75
+ if (!['http:', 'https:'].includes(target.protocol))
76
+ throw new VendorUnreachableError(`A twin cannot fetch ${target.protocol} URLs`);
77
+ return worldResponse(target, request, standIn);
78
+ }, ['x-twins-key', 'x-volter-twin-original-host']);
79
+ }
80
+ catch (error) {
81
+ if (error instanceof VendorUnreachableError)
82
+ throw error;
83
+ throw new VendorUnreachableError(error instanceof Error ? error.message : String(error), { cause: error });
84
+ }
41
85
  }
@@ -0,0 +1 @@
1
+ Synthetic test attestation created on 2026-10-01 by the World Fulcio DER issuer and Rekor canonical DSSE entry helpers. Fresh local Ed25519 keys are used; private keys are not retained. The leaf is valid for ten minutes from 2026-01-06T14:00Z; the signed log witness authenticates that signing time. No vendor records or credentials are present.
@@ -0,0 +1,50 @@
1
+ {
2
+ "bundle": {
3
+ "mediaType": "application/vnd.dev.sigstore.bundle+json;version=0.1",
4
+ "dsseEnvelope": {
5
+ "payloadType": "application/vnd.in-toto+json",
6
+ "payload": "eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjEiLCJzdWJqZWN0IjpbeyJuYW1lIjoicGtnOm5wbS9maXh0dXJlQDEuMC4wIiwiZGlnZXN0Ijp7InNoYTUxMiI6IjZhNzkzMjU0ZjQ0YjMwODY1MDUxZTZjNWQ0ZjRiYmFlMzI3OTc0MzIwZjdhYzYwZjg0ZDEzMWY0N2I3YjQ1MGJlOGRhMmRkNGQ4YzkyNThkNWVjMWJiOWNjNDliY2QzZDlkY2NiNTIyNmY0YjM4ODkyNzQyNWZjODVkNjU0MWRlIn19XSwicHJlZGljYXRlVHlwZSI6Imh0dHBzOi8vc2xzYS5kZXYvcHJvdmVuYW5jZS92MSIsInByZWRpY2F0ZSI6e319",
7
+ "signatures": [
8
+ {
9
+ "keyid": "",
10
+ "sig": "7nKq9VXFF3a1J7rj4tFMbM6UhafUKaXXtV5yhkubs8U/SocLU7m0E0cgxdr8ixMZbwYExsX1d46kncIZ1wCjBQ=="
11
+ }
12
+ ]
13
+ },
14
+ "verificationMaterial": {
15
+ "x509CertificateChain": {
16
+ "certificates": [
17
+ {
18
+ "rawBytes": "MIIDTTCCAv+gAwIBAgIQBUiE8XK0h+xFHqyfZxbTXjAFBgMrZXAwKjEVMBMGA1UECgwMc2lnc3RvcmUuZGV2MREwDwYDVQQDDAhzaWdzdG9yZTAeFw0yNjAxMDYxNDAwMDBaFw0yNjAxMDYxNDEwMDBaMAAwKjAFBgMrZXADIQC4nHlTkS1xW0AQsB+d05CE0PzyBGyWvNGEP+EJHrgYY6OCAmMwggJfMA4GA1UdDwEB/wQEAwIAgDATBgNVHSUEDDAKBggrBgEFBQcDAzBhBgNVHREBAf8EVzBVhlNodHRwczovL2dpdGh1Yi5jb20vZml4dHVyZS9yZXBvc2l0b3J5Ly5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQHJlZnMvaGVhZHMvbWFpbjAQBgorBgEEAYO/MAEIBAIMADBjBgorBgEEAYO/MAEJBFUMU2h0dHBzOi8vZ2l0aHViLmNvbS9maXh0dXJlL3JlcG9zaXRvcnkvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAcmVmcy9oZWFkcy9tYWluMBAGCisGAQQBg78wAQoEAgwAMBAGCisGAQQBg78wAQsEAgwAMCMGCisGAQQBg78wAQwEFQwTaHR0cHM6Ly9naXRodWIuY29tLzAQBgorBgEEAYO/MAENBAIMADAQBgorBgEEAYO/MAEOBAIMADAQBgorBgEEAYO/MAEPBAIMADAjBgorBgEEAYO/MAEQBBUME2h0dHBzOi8vZ2l0aHViLmNvbS8wEAYKKwYBBAGDvzABEQQCDAAwIwYKKwYBBAGDvzABEgQVDBNodHRwczovL2dpdGh1Yi5jb20vMBAGCisGAQQBg78wARMEAgwAMBAGCisGAQQBg78wARQEAgwAMDsGCisGAQQBg78wARUELQwraHR0cHM6Ly9naXRodWIuY29tLy9hY3Rpb25zL3J1bnMvL2F0dGVtcHRzLzAQBgorBgEEAYO/MAEWBAIMADAQBgorBgEEAYO/MAEYBAIMADAFBgMrZXADQQAwr/lCtMpb0F+w6OzzNVHwjnQtMxTO1WN7W1J3NeIPC8mWcWASE8c41uXJflOk3cXWpV3dFRqZ2c9cjBJszjkI"
19
+ }
20
+ ]
21
+ },
22
+ "tlogEntries": [
23
+ {
24
+ "logIndex": "0",
25
+ "logId": {
26
+ "keyId": "dF/sfCyHqi/AtAHN6MyKhdQjWjwmAUydfFFJIBxj/xU="
27
+ },
28
+ "kindVersion": {
29
+ "kind": "dsse",
30
+ "version": "0.0.1"
31
+ },
32
+ "integratedTime": "1767708000",
33
+ "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiNjEyNGVlZjYyMmQ0MDgwYTVhM2Q2NGMxNWU0NWZjODk3NTBmNzJiYWNmYjEwN2MzMTY5MzY5YTI2OGZhNGIzZSJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6IjdhOTgyY2I1ZjczMTc5NDhiM2FlZmFlMDljYjNiYzMzNDdkMDFiNTFlNDdjMDJhZTE2ZTk1NjhiODkxMGVlNTEifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiN25LcTlWWEZGM2ExSjdyajR0Rk1iTTZVaGFmVUthWFh0VjV5aGt1YnM4VS9Tb2NMVTdtMEUwY2d4ZHI4aXhNWmJ3WUV4c1gxZDQ2a25jSVoxd0NqQlE9PSIsInZlcmlmaWVyIjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVUlVWRU5EUVhZclowRjNTVUpCWjBsUlFsVnBSVGhZU3pCb0szaEdTSEY1WmxwNFlsUllha0ZHUW1kTmNscFlRWGRMYWtWV1RVSk5SMEV4VlVVS1EyZDNUV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5Va1YzUkhkWlJGWlJVVVJFUVdoNllWZGtlbVJIT1hsYVZFRmxSbmN3ZVU1cVFYaE5SRmw0VGtSQmR3cE5SRUpoUm5jd2VVNXFRWGhOUkZsNFRrUkZkMDFFUW1GTlFVRjNTMnBCUmtKblRYSmFXRUZFU1ZGRE5HNUliRlJyVXpGNFZ6QkJVWE5DSzJRd05VTkZDakJRZW5sQ1IzbFhkazVIUlZBclJVcEljbWRaV1RaUFEwRnRUWGRuWjBwbVRVRTBSMEV4VldSRWQwVkNMM2RSUlVGM1NVRm5SRUZVUW1kT1ZraFRWVVVLUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UW1oQ1owNVdTRkpGUWtGbU9FVldla0pXYUd4T2IyUklVbmRqZW05MlRESmtjR1JIYURGWmFUVnFZakl3ZGdwYWJXdzBaRWhXZVZwVE9YbGFXRUoyWXpKc01HSXpTalZNZVRWdVlWaFNiMlJYU1haa01qbDVZVEphYzJJelpIcE1NMHBzWWtkV2FHTXlWWFZsVnpGekNsRklTbXhhYmsxMllVZFdhRnBJVFhaaVYwWndZbXBCVVVKbmIzSkNaMFZGUVZsUEwwMUJSVWxDUVVsTlFVUkNha0puYjNKQ1owVkZRVmxQTDAxQlJVb0tRa1pWVFZVeWFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1cxaFdHZ3daRmhLYkV3elNteGpSemw2WVZoU2RtTnVhM1pNYldSd1pFZG9NUXBaYVRrellqTktjbHB0ZUhaa00wMTJZMjFXYzFwWFJucGFVelUxWWxkNFFXTnRWbTFqZVRsdldsZEdhMk41T1hSWlYyeDFUVUpCUjBOcGMwZEJVVkZDQ21jM09IZEJVVzlGUVdkM1FVMUNRVWREYVhOSFFWRlJRbWMzT0hkQlVYTkZRV2QzUVUxRFRVZERhWE5IUVZGUlFtYzNPSGRCVVhkRlJsRjNWR0ZJVWpBS1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1la0ZSUW1kdmNrSm5SVVZCV1U4dlRVRkZUa0pCU1UxQlJFRlJRbWR2Y2tKblJVVkJXVTh2VFVGRlR3cENRVWxOUVVSQlVVSm5iM0pDWjBWRlFWbFBMMDFCUlZCQ1FVbE5RVVJCYWtKbmIzSkNaMFZGUVZsUEwwMUJSVkZDUWxWTlJUSm9NR1JJUW5wUGFUaDJDbG95YkRCaFNGWnBURzFPZG1KVE9IZEZRVmxMUzNkWlFrSkJSMFIyZWtGQ1JWRlJRMFJCUVhkSmQxbExTM2RaUWtKQlIwUjJla0ZDUldkUlZrUkNUbThLWkVoU2QyTjZiM1pNTW1Sd1pFZG9NVmxwTldwaU1qQjJUVUpCUjBOcGMwZEJVVkZDWnpjNGQwRlNUVVZCWjNkQlRVSkJSME5wYzBkQlVWRkNaemM0ZHdwQlVsRkZRV2QzUVUxRWMwZERhWE5IUVZGUlFtYzNPSGRCVWxWRlRGRjNjbUZJVWpCalNFMDJUSGs1Ym1GWVVtOWtWMGwxV1RJNWRFeDVPV2haTTFKd0NtSXlOWHBNTTBveFltNU5ka3d5UmpCa1IxWjBZMGhTZWt4NlFWRkNaMjl5UW1kRlJVRlpUeTlOUVVWWFFrRkpUVUZFUVZGQ1oyOXlRbWRGUlVGWlR5OEtUVUZGV1VKQlNVMUJSRUZHUW1kTmNscFlRVVJSVVVGM2NpOXNRM1JOY0dJd1JpdDNOazk2ZWs1V1NIZHFibEYwVFhoVVR6RlhUamRYTVVvelRtVkpVQXBET0cxWFkxZEJVMFU0WXpReGRWaEtabXhQYXpOaldGZHdWak5rUmxKeFdqSmpPV05xUWtwemVtcHJTUW90TFMwdExVVk9SQ0JEUlZKVVNVWkpRMEZVUlMwdExTMHRDZz09In1dfX0=",
34
+ "inclusionPromise": {
35
+ "signedEntryTimestamp": "ak9H7xUyGle+Y9ffFmG7fcJhmuebWzMA20XrRdW8iCoauQr05gHY7SKB/Ol3Eim/PkWbeXEVh6OE8zBFhmjcDA=="
36
+ }
37
+ }
38
+ ]
39
+ }
40
+ },
41
+ "trust": {
42
+ "certificates": [
43
+ "-----BEGIN CERTIFICATE-----\nMIIBezCCAS2gAwIBAgIUaz/8CSoFR9V9lm1MgOxfV29zAfQwBQYDK2VwMCoxFTAT\nBgNVBAoMDHNpZ3N0b3JlLmRldjERMA8GA1UEAwwIc2lnc3RvcmUwIBcNMjAwMTAx\nMDAwMDAwWhgPMjEyMDAxMDEwMDAwMDBaMCoxFTATBgNVBAoMDHNpZ3N0b3JlLmRl\ndjERMA8GA1UEAwwIc2lnc3RvcmUwKjAFBgMrZXADIQDE41ebQe3wxijT90pJKpcI\ncMLr3RWwHjbTcE0wFY8MZ6NjMGEwHQYDVR0OBBYEFCCwTCsZsoFzvP8pW8nIipgg\n1APNMB8GA1UdIwQYMBaAFCCwTCsZsoFzvP8pW8nIipgg1APNMA8GA1UdEwEB/wQF\nMAMBAf8wDgYDVR0PAQH/BAQDAgAGMAUGAytlcANBAG5I7Hn72nt51DGymOMMFimq\n7UQ/RqT8zGPUcRC36HTxmW0p5GS62VbT/X9B+Hl/k+xAOMXfD1OdE0zt4N+V3AY=\n-----END CERTIFICATE-----\n"
44
+ ],
45
+ "logKeys": [
46
+ "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEA6ndE8AARgTs3biA59jhDL22PH2EgZqWnk4I5vugGtl8=\n-----END PUBLIC KEY-----\n"
47
+ ]
48
+ },
49
+ "otherLogKey": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAE8WDvbqLEaI2gSsDadEZGTtJz1L1qvL8hqLgXFR0qpg=\n-----END PUBLIC KEY-----\n"
50
+ }