@aztec/blob-client 3.0.0-nightly.20251223
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.
- package/README.md +62 -0
- package/dest/archive/blobscan_archive_client.d.ts +147 -0
- package/dest/archive/blobscan_archive_client.d.ts.map +1 -0
- package/dest/archive/blobscan_archive_client.js +141 -0
- package/dest/archive/config.d.ts +7 -0
- package/dest/archive/config.d.ts.map +1 -0
- package/dest/archive/config.js +11 -0
- package/dest/archive/factory.d.ts +4 -0
- package/dest/archive/factory.d.ts.map +1 -0
- package/dest/archive/factory.js +7 -0
- package/dest/archive/index.d.ts +3 -0
- package/dest/archive/index.d.ts.map +1 -0
- package/dest/archive/index.js +2 -0
- package/dest/archive/instrumentation.d.ts +11 -0
- package/dest/archive/instrumentation.d.ts.map +1 -0
- package/dest/archive/instrumentation.js +33 -0
- package/dest/archive/interface.d.ts +13 -0
- package/dest/archive/interface.d.ts.map +1 -0
- package/dest/archive/interface.js +1 -0
- package/dest/blobstore/blob_store_test_suite.d.ts +3 -0
- package/dest/blobstore/blob_store_test_suite.d.ts.map +1 -0
- package/dest/blobstore/blob_store_test_suite.js +164 -0
- package/dest/blobstore/index.d.ts +3 -0
- package/dest/blobstore/index.d.ts.map +1 -0
- package/dest/blobstore/index.js +2 -0
- package/dest/blobstore/interface.d.ts +12 -0
- package/dest/blobstore/interface.d.ts.map +1 -0
- package/dest/blobstore/interface.js +1 -0
- package/dest/blobstore/memory_blob_store.d.ts +8 -0
- package/dest/blobstore/memory_blob_store.d.ts.map +1 -0
- package/dest/blobstore/memory_blob_store.js +24 -0
- package/dest/client/bin/index.d.ts +3 -0
- package/dest/client/bin/index.d.ts.map +1 -0
- package/dest/client/bin/index.js +30 -0
- package/dest/client/config.d.ts +50 -0
- package/dest/client/config.d.ts.map +1 -0
- package/dest/client/config.js +55 -0
- package/dest/client/factory.d.ts +39 -0
- package/dest/client/factory.d.ts.map +1 -0
- package/dest/client/factory.js +53 -0
- package/dest/client/http.d.ts +63 -0
- package/dest/client/http.d.ts.map +1 -0
- package/dest/client/http.js +536 -0
- package/dest/client/index.d.ts +6 -0
- package/dest/client/index.d.ts.map +1 -0
- package/dest/client/index.js +5 -0
- package/dest/client/interface.d.ts +23 -0
- package/dest/client/interface.d.ts.map +1 -0
- package/dest/client/interface.js +1 -0
- package/dest/client/local.d.ts +12 -0
- package/dest/client/local.d.ts.map +1 -0
- package/dest/client/local.js +18 -0
- package/dest/client/tests.d.ts +11 -0
- package/dest/client/tests.d.ts.map +1 -0
- package/dest/client/tests.js +65 -0
- package/dest/encoding/index.d.ts +15 -0
- package/dest/encoding/index.d.ts.map +1 -0
- package/dest/encoding/index.js +19 -0
- package/dest/filestore/factory.d.ts +50 -0
- package/dest/filestore/factory.d.ts.map +1 -0
- package/dest/filestore/factory.js +67 -0
- package/dest/filestore/filestore_blob_client.d.ts +56 -0
- package/dest/filestore/filestore_blob_client.d.ts.map +1 -0
- package/dest/filestore/filestore_blob_client.js +99 -0
- package/dest/filestore/index.d.ts +3 -0
- package/dest/filestore/index.d.ts.map +1 -0
- package/dest/filestore/index.js +2 -0
- package/dest/types/api.d.ts +65 -0
- package/dest/types/api.d.ts.map +1 -0
- package/dest/types/api.js +22 -0
- package/dest/types/blob_with_index.d.ts +25 -0
- package/dest/types/blob_with_index.d.ts.map +1 -0
- package/dest/types/blob_with_index.js +43 -0
- package/dest/types/index.d.ts +2 -0
- package/dest/types/index.d.ts.map +1 -0
- package/dest/types/index.js +1 -0
- package/package.json +95 -0
- package/src/archive/blobscan_archive_client.ts +178 -0
- package/src/archive/config.ts +14 -0
- package/src/archive/factory.ts +11 -0
- package/src/archive/fixtures/blobscan_get_blob_data.json +1 -0
- package/src/archive/fixtures/blobscan_get_block.json +56 -0
- package/src/archive/index.ts +2 -0
- package/src/archive/instrumentation.ts +41 -0
- package/src/archive/interface.ts +9 -0
- package/src/blobstore/blob_store_test_suite.ts +137 -0
- package/src/blobstore/index.ts +2 -0
- package/src/blobstore/interface.ts +12 -0
- package/src/blobstore/memory_blob_store.ts +31 -0
- package/src/client/bin/index.ts +35 -0
- package/src/client/config.ts +117 -0
- package/src/client/factory.ts +88 -0
- package/src/client/http.ts +620 -0
- package/src/client/index.ts +5 -0
- package/src/client/interface.ts +30 -0
- package/src/client/local.ts +32 -0
- package/src/client/tests.ts +78 -0
- package/src/encoding/index.ts +21 -0
- package/src/filestore/factory.ts +145 -0
- package/src/filestore/filestore_blob_client.ts +129 -0
- package/src/filestore/index.ts +2 -0
- package/src/types/api.ts +50 -0
- package/src/types/blob_with_index.ts +48 -0
- package/src/types/index.ts +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/blobstore/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BlobWithIndex } from '../types/index.js';
|
|
2
|
+
export interface BlobStore {
|
|
3
|
+
/**
|
|
4
|
+
* Get blobs by their hashes
|
|
5
|
+
*/
|
|
6
|
+
getBlobsByHashes: (blobHashes: Buffer[]) => Promise<BlobWithIndex[]>;
|
|
7
|
+
/**
|
|
8
|
+
* Add blobs to the store, indexed by their hashes
|
|
9
|
+
*/
|
|
10
|
+
addBlobs: (blobs: BlobWithIndex[]) => Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmxvYnN0b3JlL2ludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUV2RCxNQUFNLFdBQVcsU0FBUztJQUN4Qjs7T0FFRztJQUNILGdCQUFnQixFQUFFLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFOztPQUVHO0lBQ0gsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNyRCJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/blobstore/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACrE;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BlobWithIndex } from '../types/index.js';
|
|
2
|
+
import type { BlobStore } from './interface.js';
|
|
3
|
+
export declare class MemoryBlobStore implements BlobStore {
|
|
4
|
+
private blobs;
|
|
5
|
+
getBlobsByHashes(blobHashes: Buffer[]): Promise<BlobWithIndex[]>;
|
|
6
|
+
addBlobs(blobs: BlobWithIndex[]): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5X2Jsb2Jfc3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ibG9ic3RvcmUvbWVtb3J5X2Jsb2Jfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhELHFCQUFhLGVBQWdCLFlBQVcsU0FBUztJQUMvQyxPQUFPLENBQUMsS0FBSyxDQUFrQztJQUV4QyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBWXRFO0lBRU0sUUFBUSxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBT3JEO0NBQ0YifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory_blob_store.d.ts","sourceRoot":"","sources":["../../src/blobstore/memory_blob_store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,qBAAa,eAAgB,YAAW,SAAS;IAC/C,OAAO,CAAC,KAAK,CAAkC;IAExC,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAYtE;IAEM,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAOrD;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { bufferToHex } from '@aztec/foundation/string';
|
|
2
|
+
import { BlobWithIndex } from '../types/index.js';
|
|
3
|
+
export class MemoryBlobStore {
|
|
4
|
+
blobs = new Map();
|
|
5
|
+
getBlobsByHashes(blobHashes) {
|
|
6
|
+
const results = [];
|
|
7
|
+
for (const blobHash of blobHashes){
|
|
8
|
+
const key = bufferToHex(blobHash);
|
|
9
|
+
const blobBuffer = this.blobs.get(key);
|
|
10
|
+
if (blobBuffer) {
|
|
11
|
+
results.push(BlobWithIndex.fromBuffer(blobBuffer));
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return Promise.resolve(results);
|
|
15
|
+
}
|
|
16
|
+
addBlobs(blobs) {
|
|
17
|
+
for (const blob of blobs){
|
|
18
|
+
const blobHash = blob.blob.getEthVersionedBlobHash();
|
|
19
|
+
const key = bufferToHex(blobHash);
|
|
20
|
+
this.blobs.set(key, blob.toBuffer());
|
|
21
|
+
}
|
|
22
|
+
return Promise.resolve();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/bin/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* eslint-disable no-console */ import { createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { bufferToHex, hexToBuffer } from '@aztec/foundation/string';
|
|
4
|
+
import { getBlobClientConfigFromEnv } from '../config.js';
|
|
5
|
+
import { createBlobClient } from '../factory.js';
|
|
6
|
+
async function main() {
|
|
7
|
+
const logger = createLogger('blob-client');
|
|
8
|
+
const blockHash = process.argv[2];
|
|
9
|
+
if (!blockHash) {
|
|
10
|
+
logger.error('Please provide a block hash as an argument.');
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
const blobHashes = process.argv.slice(3).map(hexToBuffer);
|
|
14
|
+
logger.info(`Fetching blobs for block hash ${blockHash}`);
|
|
15
|
+
if (blobHashes.length > 0) {
|
|
16
|
+
logger.info(`Filtering by blob hashes ${blobHashes.map(bufferToHex).join(', ')}`);
|
|
17
|
+
}
|
|
18
|
+
const blobClient = createBlobClient(getBlobClientConfigFromEnv());
|
|
19
|
+
const blobs = await blobClient.getBlobSidecar(blockHash, blobHashes);
|
|
20
|
+
logger.info(`Got ${blobs.length} blobs`);
|
|
21
|
+
for (const blob of blobs){
|
|
22
|
+
console.log(blob.toJSON());
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Example usage:
|
|
26
|
+
// $ L1_CHAIN_ID=11155111 LOG_LEVEL=trace yarn blob-client 0x7d81980a40426c40544f0f729ada953be406730b877b5865d6cdc35cc8f9c84e 0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014
|
|
27
|
+
main().catch((err)=>{
|
|
28
|
+
console.error(err);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type ConfigMappingsType, SecretValue } from '@aztec/foundation/config';
|
|
2
|
+
import { type BlobArchiveApiConfig } from '../archive/config.js';
|
|
3
|
+
/**
|
|
4
|
+
* The configuration for the blob client
|
|
5
|
+
*/
|
|
6
|
+
export interface BlobClientConfig extends BlobArchiveApiConfig {
|
|
7
|
+
/**
|
|
8
|
+
* List of URLs for L1 RPC Execution clients
|
|
9
|
+
*/
|
|
10
|
+
l1RpcUrls?: string[];
|
|
11
|
+
/**
|
|
12
|
+
* List of URLs of the Ethereum consensus nodes that services will connect to (comma separated)
|
|
13
|
+
*/
|
|
14
|
+
l1ConsensusHostUrls?: string[];
|
|
15
|
+
/**
|
|
16
|
+
* List of API keys for the corresponding L1 consensus client URLs. Added at the end of the URL as "?key=<api-key>" unless a header is defined
|
|
17
|
+
*/
|
|
18
|
+
l1ConsensusHostApiKeys?: SecretValue<string>[];
|
|
19
|
+
/**
|
|
20
|
+
* List of header names for the corresponding L1 consensus client API keys, if needed. Added as "<api-key-header>: <api-key>"
|
|
21
|
+
*/
|
|
22
|
+
l1ConsensusHostApiKeyHeaders?: string[];
|
|
23
|
+
/**
|
|
24
|
+
* The map size to be provided to LMDB for each blob sink DB, optional, will inherit from the general dataStoreMapSizeKb if not specified
|
|
25
|
+
*/
|
|
26
|
+
blobSinkMapSizeKb?: number;
|
|
27
|
+
/**
|
|
28
|
+
* Whether to allow having no blob sources configured during startup
|
|
29
|
+
*/
|
|
30
|
+
blobAllowEmptySources?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* URLs for reading blobs from filestore (s3://, gs://, file://, https://). Tried in order until blobs are found.
|
|
33
|
+
*/
|
|
34
|
+
blobFileStoreUrls?: string[];
|
|
35
|
+
/**
|
|
36
|
+
* URL for uploading blobs to filestore (s3://, gs://, file://)
|
|
37
|
+
*/
|
|
38
|
+
blobFileStoreUploadUrl?: string;
|
|
39
|
+
}
|
|
40
|
+
export declare const blobClientConfigMapping: ConfigMappingsType<BlobClientConfig>;
|
|
41
|
+
/**
|
|
42
|
+
* Returns the blob client configuration from the environment variables.
|
|
43
|
+
* @returns The blob client configuration.
|
|
44
|
+
*/
|
|
45
|
+
export declare function getBlobClientConfigFromEnv(): BlobClientConfig;
|
|
46
|
+
/**
|
|
47
|
+
* Returns whether the given blob client config has any remote sources defined.
|
|
48
|
+
*/
|
|
49
|
+
export declare function hasRemoteBlobSources(config?: BlobClientConfig): boolean;
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsS0FBSyxrQkFBa0IsRUFDdkIsV0FBVyxFQUdaLE1BQU0sMEJBQTBCLENBQUM7QUFFbEMsT0FBTyxFQUFFLEtBQUssb0JBQW9CLEVBQWdDLE1BQU0sc0JBQXNCLENBQUM7QUFFL0Y7O0dBRUc7QUFDSCxNQUFNLFdBQVcsZ0JBQWlCLFNBQVEsb0JBQW9CO0lBQzVEOztPQUVHO0lBQ0gsU0FBUyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFFckI7O09BRUc7SUFDSCxtQkFBbUIsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBRS9COztPQUVHO0lBQ0gsc0JBQXNCLENBQUMsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUUvQzs7T0FFRztJQUNILDRCQUE0QixDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFFeEM7O09BRUc7SUFDSCxpQkFBaUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUUzQjs7T0FFRztJQUNILHFCQUFxQixDQUFDLEVBQUUsT0FBTyxDQUFDO0lBRWhDOztPQUVHO0lBQ0gsaUJBQWlCLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUU3Qjs7T0FFRztJQUNILHNCQUFzQixDQUFDLEVBQUUsTUFBTSxDQUFDO0NBQ2pDO0FBRUQsZUFBTyxNQUFNLHVCQUF1QixFQUFFLGtCQUFrQixDQUFDLGdCQUFnQixDQStDeEUsQ0FBQztBQUVGOzs7R0FHRztBQUNILHdCQUFnQiwwQkFBMEIsSUFBSSxnQkFBZ0IsQ0FFN0Q7QUFFRDs7R0FFRztBQUNILHdCQUFnQixvQkFBb0IsQ0FBQyxNQUFNLEdBQUUsZ0JBQXFCLEdBQUcsT0FBTyxDQUUzRSJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/client/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,WAAW,EAGZ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,KAAK,oBAAoB,EAAgC,MAAM,sBAAsB,CAAC;AAE/F;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,oBAAoB;IAC5D;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE/B;;OAEG;IACH,sBAAsB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;IAE/C;;OAEG;IACH,4BAA4B,CAAC,EAAE,MAAM,EAAE,CAAC;IAExC;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B;;OAEG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,eAAO,MAAM,uBAAuB,EAAE,kBAAkB,CAAC,gBAAgB,CA+CxE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,gBAAgB,CAE7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,GAAE,gBAAqB,GAAG,OAAO,CAE3E"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { SecretValue, booleanConfigHelper, getConfigFromMappings } from '@aztec/foundation/config';
|
|
2
|
+
import { blobArchiveApiConfigMappings } from '../archive/config.js';
|
|
3
|
+
export const blobClientConfigMapping = {
|
|
4
|
+
l1RpcUrls: {
|
|
5
|
+
env: 'ETHEREUM_HOSTS',
|
|
6
|
+
description: 'List of URLs for L1 RPC Execution clients',
|
|
7
|
+
parseEnv: (val)=>val.split(',').map((url)=>url.trim())
|
|
8
|
+
},
|
|
9
|
+
l1ConsensusHostUrls: {
|
|
10
|
+
env: 'L1_CONSENSUS_HOST_URLS',
|
|
11
|
+
description: 'List of URLs of the Ethereum consensus nodes that services will connect to (comma separated)',
|
|
12
|
+
parseEnv: (val)=>val.split(',').map((url)=>url.trim().replace(/\/$/, ''))
|
|
13
|
+
},
|
|
14
|
+
l1ConsensusHostApiKeys: {
|
|
15
|
+
env: 'L1_CONSENSUS_HOST_API_KEYS',
|
|
16
|
+
description: 'List of API keys for the corresponding L1 consensus clients, if needed. Added to the end of the corresponding URL as "?key=<api-key>" unless a header is defined',
|
|
17
|
+
parseEnv: (val)=>val.split(',').map((key)=>new SecretValue(key.trim()))
|
|
18
|
+
},
|
|
19
|
+
l1ConsensusHostApiKeyHeaders: {
|
|
20
|
+
env: 'L1_CONSENSUS_HOST_API_KEY_HEADERS',
|
|
21
|
+
description: 'List of header names for the corresponding L1 consensus client API keys, if needed. Added to the corresponding request as "<api-key-header>: <api-key>"',
|
|
22
|
+
parseEnv: (val)=>val.split(',').map((url)=>url.trim())
|
|
23
|
+
},
|
|
24
|
+
blobSinkMapSizeKb: {
|
|
25
|
+
env: 'BLOB_SINK_MAP_SIZE_KB',
|
|
26
|
+
description: 'The maximum possible size of the blob sink DB in KB. Overwrites the general dataStoreMapSizeKb.',
|
|
27
|
+
parseEnv: (val)=>val ? +val : undefined
|
|
28
|
+
},
|
|
29
|
+
blobAllowEmptySources: {
|
|
30
|
+
env: 'BLOB_ALLOW_EMPTY_SOURCES',
|
|
31
|
+
description: 'Whether to allow having no blob sources configured during startup',
|
|
32
|
+
...booleanConfigHelper(false)
|
|
33
|
+
},
|
|
34
|
+
blobFileStoreUrls: {
|
|
35
|
+
env: 'BLOB_FILE_STORE_URLS',
|
|
36
|
+
description: 'URLs for filestore blob archive, comma-separated. Tried in order until blobs are found.',
|
|
37
|
+
parseEnv: (val)=>val.split(',').map((url)=>url.trim()).filter((url)=>url.length > 0)
|
|
38
|
+
},
|
|
39
|
+
blobFileStoreUploadUrl: {
|
|
40
|
+
env: 'BLOB_FILE_STORE_UPLOAD_URL',
|
|
41
|
+
description: 'URL for uploading blobs to filestore (s3://, gs://, file://)'
|
|
42
|
+
},
|
|
43
|
+
...blobArchiveApiConfigMappings
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Returns the blob client configuration from the environment variables.
|
|
47
|
+
* @returns The blob client configuration.
|
|
48
|
+
*/ export function getBlobClientConfigFromEnv() {
|
|
49
|
+
return getConfigFromMappings(blobClientConfigMapping);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Returns whether the given blob client config has any remote sources defined.
|
|
53
|
+
*/ export function hasRemoteBlobSources(config = {}) {
|
|
54
|
+
return !!(config.l1ConsensusHostUrls?.length || config.archiveApiUrl || config.blobFileStoreUrls?.length);
|
|
55
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type Logger } from '@aztec/foundation/log';
|
|
2
|
+
import type { FileStoreBlobClient } from '../filestore/filestore_blob_client.js';
|
|
3
|
+
import { type BlobClientConfig } from './config.js';
|
|
4
|
+
import type { BlobClientInterface } from './interface.js';
|
|
5
|
+
export interface CreateBlobClientDeps {
|
|
6
|
+
logger?: Logger;
|
|
7
|
+
/** FileStore clients for reading blobs */
|
|
8
|
+
fileStoreClients?: FileStoreBlobClient[];
|
|
9
|
+
/** FileStore client for uploading blobs */
|
|
10
|
+
fileStoreUploadClient?: FileStoreBlobClient;
|
|
11
|
+
}
|
|
12
|
+
export declare function createBlobClient(config?: BlobClientConfig, deps?: CreateBlobClientDeps): BlobClientInterface;
|
|
13
|
+
/**
|
|
14
|
+
* Configuration required for creating a blob client with file stores.
|
|
15
|
+
* Extends BlobClientConfig with the metadata needed to construct file store paths.
|
|
16
|
+
*/
|
|
17
|
+
export interface BlobClientWithFileStoresConfig extends BlobClientConfig {
|
|
18
|
+
l1ChainId: number;
|
|
19
|
+
rollupVersion: number;
|
|
20
|
+
l1Contracts: {
|
|
21
|
+
rollupAddress: {
|
|
22
|
+
toString(): string;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Creates a BlobClient with FileStore clients for reading and uploading blobs.
|
|
28
|
+
* This is a convenience function that handles the common pattern of:
|
|
29
|
+
* 1. Building BlobFileStoreMetadata from config
|
|
30
|
+
* 2. Creating read-only FileStore clients
|
|
31
|
+
* 3. Creating a writable FileStore client for uploads
|
|
32
|
+
* 4. Creating the BlobClient with these dependencies
|
|
33
|
+
*
|
|
34
|
+
* @param config - Configuration containing blob client settings and chain metadata
|
|
35
|
+
* @param logger - Optional logger for the blob client
|
|
36
|
+
* @returns A BlobClientInterface configured with file store support
|
|
37
|
+
*/
|
|
38
|
+
export declare function createBlobClientWithFileStores(config: BlobClientWithFileStoresConfig, logger?: Logger): Promise<BlobClientInterface>;
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQVFsRSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxLQUFLLGdCQUFnQixFQUF3QixNQUFNLGFBQWEsQ0FBQztBQUUxRSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzFELE1BQU0sV0FBVyxvQkFBb0I7SUFDbkMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLDBDQUEwQztJQUMxQyxnQkFBZ0IsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUM7SUFDekMsMkNBQTJDO0lBQzNDLHFCQUFxQixDQUFDLEVBQUUsbUJBQW1CLENBQUM7Q0FDN0M7QUFFRCx3QkFBZ0IsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEVBQUUsb0JBQW9CLEdBQUcsbUJBQW1CLENBbUI1RztBQUVEOzs7R0FHRztBQUNILE1BQU0sV0FBVyw4QkFBK0IsU0FBUSxnQkFBZ0I7SUFDdEUsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUNsQixhQUFhLEVBQUUsTUFBTSxDQUFDO0lBQ3RCLFdBQVcsRUFBRTtRQUFFLGFBQWEsRUFBRTtZQUFFLFFBQVEsSUFBSSxNQUFNLENBQUE7U0FBRSxDQUFBO0tBQUUsQ0FBQztDQUN4RDtBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsd0JBQXNCLDhCQUE4QixDQUNsRCxNQUFNLEVBQUUsOEJBQThCLEVBQ3RDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FDZCxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FtQjlCIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/client/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAQlE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,KAAK,gBAAgB,EAAwB,MAAM,aAAa,CAAC;AAE1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1D,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,gBAAgB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACzC,2CAA2C;IAC3C,qBAAqB,CAAC,EAAE,mBAAmB,CAAC;CAC7C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,mBAAmB,CAmB5G;AAED;;;GAGG;AACH,MAAM,WAAW,8BAA+B,SAAQ,gBAAgB;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE;QAAE,aAAa,EAAE;YAAE,QAAQ,IAAI,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CACxD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,8BAA8B,EACtC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,mBAAmB,CAAC,CAmB9B"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { MemoryBlobStore } from '../blobstore/memory_blob_store.js';
|
|
3
|
+
import { createReadOnlyFileStoreBlobClients, createWritableFileStoreBlobClient } from '../filestore/factory.js';
|
|
4
|
+
import { hasRemoteBlobSources } from './config.js';
|
|
5
|
+
import { HttpBlobClient } from './http.js';
|
|
6
|
+
import { LocalBlobClient } from './local.js';
|
|
7
|
+
export function createBlobClient(config, deps) {
|
|
8
|
+
const log = deps?.logger ?? createLogger('blob-client');
|
|
9
|
+
if (!hasRemoteBlobSources(config)) {
|
|
10
|
+
log.info(`Creating local blob client.`);
|
|
11
|
+
const blobStore = new MemoryBlobStore();
|
|
12
|
+
return new LocalBlobClient(blobStore);
|
|
13
|
+
}
|
|
14
|
+
log.info(`Creating blob client.`, {
|
|
15
|
+
l1ConsensusHostUrls: config?.l1ConsensusHostUrls,
|
|
16
|
+
archiveApiUrl: config?.archiveApiUrl,
|
|
17
|
+
fileStoreCount: deps?.fileStoreClients?.length ?? 0,
|
|
18
|
+
hasFileStoreUpload: !!deps?.fileStoreUploadClient
|
|
19
|
+
});
|
|
20
|
+
return new HttpBlobClient(config, {
|
|
21
|
+
logger: log,
|
|
22
|
+
fileStoreClients: deps?.fileStoreClients,
|
|
23
|
+
fileStoreUploadClient: deps?.fileStoreUploadClient
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Creates a BlobClient with FileStore clients for reading and uploading blobs.
|
|
28
|
+
* This is a convenience function that handles the common pattern of:
|
|
29
|
+
* 1. Building BlobFileStoreMetadata from config
|
|
30
|
+
* 2. Creating read-only FileStore clients
|
|
31
|
+
* 3. Creating a writable FileStore client for uploads
|
|
32
|
+
* 4. Creating the BlobClient with these dependencies
|
|
33
|
+
*
|
|
34
|
+
* @param config - Configuration containing blob client settings and chain metadata
|
|
35
|
+
* @param logger - Optional logger for the blob client
|
|
36
|
+
* @returns A BlobClientInterface configured with file store support
|
|
37
|
+
*/ export async function createBlobClientWithFileStores(config, logger) {
|
|
38
|
+
const log = logger ?? createLogger('blob-client');
|
|
39
|
+
const fileStoreMetadata = {
|
|
40
|
+
l1ChainId: config.l1ChainId,
|
|
41
|
+
rollupVersion: config.rollupVersion,
|
|
42
|
+
rollupAddress: config.l1Contracts.rollupAddress.toString()
|
|
43
|
+
};
|
|
44
|
+
const [fileStoreClients, fileStoreUploadClient] = await Promise.all([
|
|
45
|
+
createReadOnlyFileStoreBlobClients(config.blobFileStoreUrls, fileStoreMetadata, log),
|
|
46
|
+
createWritableFileStoreBlobClient(config.blobFileStoreUploadUrl, fileStoreMetadata, log)
|
|
47
|
+
]);
|
|
48
|
+
return createBlobClient(config, {
|
|
49
|
+
logger: log,
|
|
50
|
+
fileStoreClients,
|
|
51
|
+
fileStoreUploadClient
|
|
52
|
+
});
|
|
53
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Blob, type BlobJson } from '@aztec/blob-lib';
|
|
2
|
+
import { type Logger } from '@aztec/foundation/log';
|
|
3
|
+
import type { BlobArchiveClient } from '../archive/interface.js';
|
|
4
|
+
import type { FileStoreBlobClient } from '../filestore/filestore_blob_client.js';
|
|
5
|
+
import { BlobWithIndex } from '../types/blob_with_index.js';
|
|
6
|
+
import { type BlobClientConfig } from './config.js';
|
|
7
|
+
import type { BlobClientInterface, GetBlobSidecarOptions } from './interface.js';
|
|
8
|
+
export declare class HttpBlobClient implements BlobClientInterface {
|
|
9
|
+
private readonly opts;
|
|
10
|
+
protected readonly log: Logger;
|
|
11
|
+
protected readonly config: BlobClientConfig;
|
|
12
|
+
protected readonly archiveClient: BlobArchiveClient | undefined;
|
|
13
|
+
protected readonly fetch: typeof fetch;
|
|
14
|
+
protected readonly fileStoreClients: FileStoreBlobClient[];
|
|
15
|
+
protected readonly fileStoreUploadClient: FileStoreBlobClient | undefined;
|
|
16
|
+
private disabled;
|
|
17
|
+
constructor(config?: BlobClientConfig, opts?: {
|
|
18
|
+
logger?: Logger;
|
|
19
|
+
archiveClient?: BlobArchiveClient;
|
|
20
|
+
fileStoreClients?: FileStoreBlobClient[];
|
|
21
|
+
fileStoreUploadClient?: FileStoreBlobClient;
|
|
22
|
+
/** Callback fired when blobs are successfully fetched from any source */
|
|
23
|
+
onBlobsFetched?: (blobs: BlobWithIndex[]) => void;
|
|
24
|
+
});
|
|
25
|
+
/**
|
|
26
|
+
* Upload fetched blobs to filestore (fire-and-forget).
|
|
27
|
+
* Called automatically when blobs are fetched from any source.
|
|
28
|
+
*/
|
|
29
|
+
private uploadBlobsToFileStore;
|
|
30
|
+
/**
|
|
31
|
+
* Disables or enables blob storage operations.
|
|
32
|
+
* When disabled, getBlobSidecar returns empty arrays and sendBlobsToFilestore returns false.
|
|
33
|
+
* Useful for testing scenarios where blob storage failure needs to be simulated.
|
|
34
|
+
* @param value - True to disable blob storage, false to enable
|
|
35
|
+
*/
|
|
36
|
+
setDisabled(value: boolean): void;
|
|
37
|
+
testSources(): Promise<void>;
|
|
38
|
+
sendBlobsToFilestore(blobs: Blob[]): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Get the blob sidecar
|
|
41
|
+
*
|
|
42
|
+
* If requesting from the blob client, we send the blobkHash
|
|
43
|
+
* If requesting from the beacon node, we send the slot number
|
|
44
|
+
*
|
|
45
|
+
* Source ordering depends on sync state:
|
|
46
|
+
* - Historical sync: blob client → FileStore → L1 consensus → Archive
|
|
47
|
+
* - Near tip sync: blob client → FileStore → L1 consensus → FileStore (with retries) → Archive (eg blobscan)
|
|
48
|
+
*
|
|
49
|
+
* @param blockHash - The block hash
|
|
50
|
+
* @param blobHashes - The blob hashes to fetch
|
|
51
|
+
* @param indices - The indices of the blobs to get
|
|
52
|
+
* @param opts - Options including isHistoricalSync flag
|
|
53
|
+
* @returns The blobs
|
|
54
|
+
*/
|
|
55
|
+
getBlobSidecar(blockHash: `0x${string}`, blobHashes: Buffer[], indices?: number[], opts?: GetBlobSidecarOptions): Promise<BlobWithIndex[]>;
|
|
56
|
+
private tryFileStores;
|
|
57
|
+
getBlobSidecarFrom(hostUrl: string, blockHashOrSlot: string | number, blobHashes?: Buffer[], indices?: number[], l1ConsensusHostIndex?: number): Promise<BlobWithIndex[]>;
|
|
58
|
+
getBlobsFromHost(hostUrl: string, blockHashOrSlot: string | number, indices?: number[], l1ConsensusHostIndex?: number): Promise<BlobJson[]>;
|
|
59
|
+
private fetchBlobSidecars;
|
|
60
|
+
private getLatestSlotNumber;
|
|
61
|
+
private getSlotNumber;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC9odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxRQUFRLEVBQStCLE1BQU0saUJBQWlCLENBQUM7QUFFbkYsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBT2xFLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLEtBQUssZ0JBQWdCLEVBQThCLE1BQU0sYUFBYSxDQUFDO0FBQ2hGLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakYscUJBQWEsY0FBZSxZQUFXLG1CQUFtQjtJQVl0RCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUk7SUFYdkIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0lBQy9CLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDO0lBQzVDLFNBQVMsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztJQUNoRSxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxPQUFPLEtBQUssQ0FBQztJQUN2QyxTQUFTLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLENBQUM7SUFDM0QsU0FBUyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxtQkFBbUIsR0FBRyxTQUFTLENBQUM7SUFFMUUsT0FBTyxDQUFDLFFBQVEsQ0FBUztJQUV6QixZQUNFLE1BQU0sQ0FBQyxFQUFFLGdCQUFnQixFQUNSLElBQUksR0FBRTtRQUNyQixNQUFNLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDaEIsYUFBYSxDQUFDLEVBQUUsaUJBQWlCLENBQUM7UUFDbEMsZ0JBQWdCLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3pDLHFCQUFxQixDQUFDLEVBQUUsbUJBQW1CLENBQUM7UUFDNUMseUVBQXlFO1FBQ3pFLGNBQWMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLElBQUksQ0FBQztLQUM5QyxFQXdCUDtJQUVEOzs7T0FHRztJQUNILE9BQU8sQ0FBQyxzQkFBc0I7SUFVOUI7Ozs7O09BS0c7SUFDSSxXQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sR0FBRyxJQUFJLENBR3ZDO0lBRVksV0FBVyxrQkFvRXZCO0lBRVksb0JBQW9CLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FtQmpFO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ1UsY0FBYyxDQUN6QixTQUFTLEVBQUUsS0FBSyxNQUFNLEVBQUUsRUFDeEIsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUNwQixPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFDbEIsSUFBSSxDQUFDLEVBQUUscUJBQXFCLEdBQzNCLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQTZJMUI7WUFRYSxhQUFhO0lBc0NkLGtCQUFrQixDQUM3QixPQUFPLEVBQUUsTUFBTSxFQUNmLGVBQWUsRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUNoQyxVQUFVLEdBQUUsTUFBTSxFQUFPLEVBQ3pCLE9BQU8sR0FBRSxNQUFNLEVBQU8sRUFDdEIsb0JBQW9CLENBQUMsRUFBRSxNQUFNLEdBQzVCLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUcxQjtJQUVZLGdCQUFnQixDQUMzQixPQUFPLEVBQUUsTUFBTSxFQUNmLGVBQWUsRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUNoQyxPQUFPLEdBQUUsTUFBTSxFQUFPLEVBQ3RCLG9CQUFvQixDQUFDLEVBQUUsTUFBTSxHQUM1QixPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FzQ3JCO0lBRUQsT0FBTyxDQUFDLGlCQUFpQjtZQWdCWCxtQkFBbUI7WUFtQ25CLGFBQWE7Q0E0RDVCIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/client/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,QAAQ,EAA+B,MAAM,iBAAiB,CAAC;AAEnF,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAOlE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,KAAK,gBAAgB,EAA8B,MAAM,aAAa,CAAC;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEjF,qBAAa,cAAe,YAAW,mBAAmB;IAYtD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAXvB,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAC5C,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAChE,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC;IACvC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,CAAC;IAC3D,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAE1E,OAAO,CAAC,QAAQ,CAAS;IAEzB,YACE,MAAM,CAAC,EAAE,gBAAgB,EACR,IAAI,GAAE;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,aAAa,CAAC,EAAE,iBAAiB,CAAC;QAClC,gBAAgB,CAAC,EAAE,mBAAmB,EAAE,CAAC;QACzC,qBAAqB,CAAC,EAAE,mBAAmB,CAAC;QAC5C,yEAAyE;QACzE,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;KAC9C,EAwBP;IAED;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;;;;OAKG;IACI,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAGvC;IAEY,WAAW,kBAoEvB;IAEY,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBjE;IAED;;;;;;;;;;;;;;;OAeG;IACU,cAAc,CACzB,SAAS,EAAE,KAAK,MAAM,EAAE,EACxB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,CAAC,EAAE,MAAM,EAAE,EAClB,IAAI,CAAC,EAAE,qBAAqB,GAC3B,OAAO,CAAC,aAAa,EAAE,CAAC,CA6I1B;YAQa,aAAa;IAsCd,kBAAkB,CAC7B,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,GAAG,MAAM,EAChC,UAAU,GAAE,MAAM,EAAO,EACzB,OAAO,GAAE,MAAM,EAAO,EACtB,oBAAoB,CAAC,EAAE,MAAM,GAC5B,OAAO,CAAC,aAAa,EAAE,CAAC,CAG1B;IAEY,gBAAgB,CAC3B,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,GAAG,MAAM,EAChC,OAAO,GAAE,MAAM,EAAO,EACtB,oBAAoB,CAAC,EAAE,MAAM,GAC5B,OAAO,CAAC,QAAQ,EAAE,CAAC,CAsCrB;IAED,OAAO,CAAC,iBAAiB;YAgBX,mBAAmB;YAmCnB,aAAa;CA4D5B"}
|