Files
speckle-server/scratch/edge-debug-selection/Default/Cache/Cache_Data/f_0000f9
T

114 lines
17 KiB
Plaintext

import AggregateQueue from "/_nuxt/@fs/D:/speckle-server/packages/objectloader2/dist/esm/queues/aggregateQueue.js";
import AsyncGeneratorQueue from "/_nuxt/@fs/D:/speckle-server/packages/objectloader2/dist/esm/queues/asyncGeneratorQueue.js";
import { take } from "/_nuxt/@fs/D:/speckle-server/packages/objectloader2/dist/esm/types/functions.js";
import { ObjectLoader2Factory } from "/_nuxt/@fs/D:/speckle-server/packages/objectloader2/dist/esm/core/objectLoader2Factory.js";
import { CacheReader } from "/_nuxt/@fs/D:/speckle-server/packages/objectloader2/dist/esm/core/stages/cacheReader.js";
import { CacheWriter } from "/_nuxt/@fs/D:/speckle-server/packages/objectloader2/dist/esm/core/stages/cacheWriter.js";
const MAX_CLOSURES_TO_TAKE = 100;
const EXPECTED_CLOSURE_VALUE = 100;
export class ObjectLoader2 {
#rootId;
#logger;
#database;
#downloader;
#cacheReader;
#cacheWriter;
#deferments;
#gathered;
#root = undefined;
#isRootStored = false;
constructor(options) {
this.#rootId = options.rootId;
this.#logger = options.logger || (() => { });
this.#logger('ObjectLoader2 initialized with rootId:', this.#rootId);
const cacheOptions = {
logger: this.#logger,
maxCacheReadSize: 10_000,
maxCacheWriteSize: 10_000,
maxWriteQueueSize: 40_000,
maxCacheBatchWriteWait: 100, //100 ms, next to nothing!
maxCacheBatchReadWait: 100 //100 ms, next to nothing!
};
this.#gathered = new AsyncGeneratorQueue();
this.#database = options.database;
this.#deferments = options.deferments;
this.#downloader = options.downloader;
this.#cacheReader = new CacheReader(this.#database, this.#deferments, this.#logger, cacheOptions);
this.#cacheReader.initializeQueue(this.#gathered, this.#downloader);
this.#cacheWriter = new CacheWriter(this.#database, this.#logger, this.#deferments, cacheOptions, (id) => {
this.#cacheReader.requestItem(id);
});
}
async disposeAsync() {
await Promise.all([
this.#gathered.disposeAsync(),
this.#downloader.disposeAsync(),
this.#cacheWriter.disposeAsync(),
this.#cacheReader.disposeAsync()
]);
this.#deferments.dispose();
}
async getRootObject() {
if (!this.#root) {
this.#root = (await this.#database.getAll([this.#rootId]))[0];
if (!this.#root) {
this.#root = await this.#downloader.downloadSingle();
}
else {
this.#isRootStored = true;
}
}
return this.#root;
}
async getObject(params) {
return await this.#cacheReader.getObject({ id: params.id });
}
async getTotalObjectCount() {
const rootObj = await this.getRootObject();
const totalChildrenCount = Object.keys(rootObj?.base?.__closure || {}).length;
return totalChildrenCount + 1; //count the root
}
async *getObjectIterator() {
const rootItem = await this.getRootObject();
if (rootItem?.base === undefined) {
this.#logger('No root object found!');
return;
}
if (!rootItem.base.__closure) {
yield rootItem.base;
return;
}
//sort the closures by their values descending
const sortedClosures = Object.entries(rootItem.base.__closure ?? []).sort((a, b) => b[1] - a[1]);
this.#logger('calculated closures: ', !take(sortedClosures.values(), MAX_CLOSURES_TO_TAKE).every((x) => x[1] === EXPECTED_CLOSURE_VALUE));
const children = sortedClosures.map((x) => x[0]);
const total = children.length + 1; // +1 for the root object
this.#downloader.initialize({
results: new AggregateQueue(this.#gathered, this.#cacheWriter),
total
});
//only for root
this.#gathered.add(rootItem);
this.#cacheReader.requestAll(children);
let count = 0;
for await (const item of this.#gathered.consume()) {
yield item.base; //always defined, as we add it to the queue
count++;
if (count >= total) {
break;
}
}
if (!this.#isRootStored) {
await this.#database.putAll([rootItem]);
this.#isRootStored = true;
}
}
static createFromObjects(objects) {
return ObjectLoader2Factory.createFromObjects(objects);
}
static createFromJSON(json) {
return ObjectLoader2Factory.createFromJSON(json);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0TG9hZGVyMi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL29iamVjdExvYWRlcjIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxjQUFjLE1BQU0sNkJBQTZCLENBQUE7QUFDeEQsT0FBTyxtQkFBbUIsTUFBTSxrQ0FBa0MsQ0FBQTtBQUNsRSxPQUFPLEVBQWdCLElBQUksRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBRzFELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBRWhFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFFckQsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUE7QUFDaEMsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUE7QUFFbEMsTUFBTSxPQUFPLGFBQWE7SUFDeEIsT0FBTyxDQUFRO0lBRWYsT0FBTyxDQUFjO0lBRXJCLFNBQVMsQ0FBVTtJQUNuQixXQUFXLENBQVk7SUFDdkIsWUFBWSxDQUFhO0lBQ3pCLFlBQVksQ0FBYTtJQUV6QixXQUFXLENBQVc7SUFFdEIsU0FBUyxDQUEyQjtJQUVwQyxLQUFLLEdBQVUsU0FBUyxDQUFBO0lBQ3hCLGFBQWEsR0FBRyxLQUFLLENBQUE7SUFFckIsWUFBWSxPQUE2QjtRQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUE7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBUyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUE7UUFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFcEUsTUFBTSxZQUFZLEdBQWlCO1lBQ2pDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNw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QUFZLENBQUM7WUFDOUQsS0FBSztTQUNOLENBQUMsQ0FBQTtRQUNGLGVBQWU7UUFDZixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN0QyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUE7UUFDYixJQUFJLEtBQUssRUFBRSxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLENBQUMsSUFBSyxDQUFBLENBQUMsMkNBQTJDO1lBQzVELEtBQUssRUFBRSxDQUFBO1lBQ1AsSUFBSSxLQUFLLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ25CLE1BQUs7WUFDUCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7WUFDdkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUE7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsT0FBZTtRQUN0QyxPQUFPLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hELENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQVk7UUFDaEMsT0FBTyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDbEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVmZXJtZW50IH0gZnJvbSAnLi4vZGVmZXJtZW50L2RlZmVybWVudE1hbmFnZXIuanMnXHJcbmltcG9ydCBBZ2dyZWdhdGVRdWV1ZSBmcm9tICcuLi9xdWV1ZXMvYWdncmVnYXRlUXVldWUuanMnXHJcbmltcG9ydCBBc3luY0dlbmVyYXRvclF1ZXVlIGZyb20gJy4uL3F1ZXVlcy9hc3luY0dlbmVyYXRvclF1ZXVlLmpzJ1xyXG5pbXBvcnQgeyBDdXN0b21Mb2dnZXIsIHRha2UgfSBmcm9tICcuLi90eXBlcy9mdW5jdGlvbnMuanMnXHJcbmltcG9ydCB7IEl0ZW0sIEJhc2UgfSBmcm9tICcuLi90eXBlcy90eXBlcy5qcydcclxuaW1wb3J0IHsgRGF0YWJhc2UsIERvd25sb2FkZXIgfSBmcm9tICcuL2ludGVyZmFjZXMuanMnXHJcbmltcG9ydCB7IE9iamVjdExvYWRlcjJGYWN0b3J5IH0gZnJvbSAnLi9vYmplY3RMb2FkZXIyRmFjdG9yeS5qcydcclxuaW1wb3J0IHsgT2JqZWN0TG9hZGVyMk9wdGlvbnMsIENhY2hlT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcydcclxuaW1wb3J0IHsgQ2FjaGVSZWFkZXIgfSBmcm9tICcuL3N0YWdlcy9jYWNoZVJlYWRlci5qcydcclxuaW1wb3J0IHsgQ2FjaGVXcml0ZXIgfSBmcm9tICcuL3N0YWdlcy9jYWNoZVdyaXRlci5qcydcclxuXHJcbmNvbnN0IE1BWF9DTE9TVVJFU19UT19UQUtFID0gMTAwXHJcbmNvbnN0IEVYUEVDVEVEX0NMT1NVUkVfVkFMVUUgPSAxMDBcclxuXHJcbmV4cG9ydCBjbGFzcyBPYmplY3RMb2FkZXIyIHtcclxuICAjcm9vdElkOiBzdHJpbmdcclxuXHJcbiAgI2xvZ2dlcjogQ3VzdG9tTG9nZ2VyXHJcblxyXG4gICNkYXRhYmFzZTogRGF0YWJhc2VcclxuICAjZG93bmxvYWRlcjogRG93bmxvYWRlclxyXG4gICNjYWNoZVJlYWRlcjogQ2FjaGVSZWFkZXJcclxuICAjY2FjaGVXcml0ZXI6IENhY2hlV3JpdGVyXHJcblxyXG4gICNkZWZlcm1lbnRzOiBEZWZlcm1lbnRcclxuXHJcbiAgI2dhdGhlcmVkOiBBc3luY0dlbmVyYXRvclF1ZXVlPEl0ZW0+XHJcblxyXG4gICNyb290PzogSXRlbSA9IHVuZGVmaW5lZFxyXG4gICNpc1Jvb3RTdG9yZWQgPSBmYWxzZVxyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPYmplY3RMb2FkZXIyT3B0aW9ucykge1xyXG4gICAgdGhpcy4jcm9vdElkID0gb3B0aW9ucy5yb290SWRcclxuICAgIHRoaXMuI2xvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8ICgoKTogdm9pZCA9PiB7fSlcclxuICAgIHRoaXMuI2xvZ2dlcignT2JqZWN0TG9hZGVyMiBpbml0aWFsaXplZCB3aXRoIHJvb3RJZDonLCB0aGlzLiNyb290SWQpXHJcblxyXG4gICAgY29uc3QgY2FjaGVPcHRpb25zOiBDYWNoZU9wdGlvbnMgPSB7XHJcbiAgICAgIGxvZ2dlcjogdGhpcy4jbG9nZ2VyLFxyXG4gICAgICBtYXhDYWNoZVJlYWRTaXplOiAxMF8wMDAsXHJcbiAgICAgIG1heENhY2hlV3JpdGVTaXplOiAxMF8wMDAsXHJcbiAgICAgIG1heFdyaXRlUXVldWVTaXplOiA0MF8wMDAsXHJcbiAgICAgIG1heENhY2hlQmF0Y2hXcml0ZVdhaXQ6IDEwMCwgLy8xMDAgbXMsIG5leHQgdG8gbm90aGluZyFcclxuICAgICAgbWF4Q2FjaGVCYXRjaFJlYWRXYWl0OiAxMDAgLy8xMDAgbXMsIG5leHQgdG8gbm90aGluZyFcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLiNnYXRoZXJlZCA9IG5ldyBBc3luY0dlbmVyYXRvclF1ZXVlKClcclxuXHJcbiAgICB0aGlzLiNkYXRhYmFzZSA9IG9wdGlvbnMuZGF0YWJhc2VcclxuICAgIHRoaXMuI2RlZmVybWVudHMgPSBvcHRpb25zLmRlZmVybWVudHNcclxuICAgIHRoaXMuI2Rvd25sb2FkZXIgPSBvcHRpb25zLmRvd25sb2FkZXJcclxuICAgIHRoaXMuI2NhY2hlUmVhZGVyID0gbmV3IENhY2hlUmVhZGVyKFxyXG4gICAgICB0aGlzLiNkYXRhYmFzZSxcclxuICAgICAgdGhpcy4jZGVmZXJtZW50cyxcclxuICAgICAgdGhpcy4jbG9nZ2VyLFxyXG4gICAgICBjYWNoZU9wdGlvbnNcclxuICAgIClcclxuICAgIHRoaXMuI2NhY2hlUmVhZGVyLmluaXRpYWxpemVRdWV1ZSh0aGlzLiNnYXRoZXJlZCwgdGhpcy4jZG93bmxvYWRlcilcclxuICAgIHRoaXMuI2NhY2hlV3JpdGVyID0gbmV3IENhY2hlV3JpdGVyKFxyXG4gICAgICB0aGlzLiNkYXRhYmFzZSxcclxuICAgICAgdGhpcy4jbG9nZ2VyLFxyXG4gICAgICB0aGlzLiNkZWZlcm1lbnRzLFxyXG4gICAgICBjYWNoZU9wdGlvbnMsXHJcbiAgICAgIChpZDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgdGhpcy4jY2FjaGVSZWFkZXIucmVxdWVzdEl0ZW0oaWQpXHJcbiAgICAgIH1cclxuICAgIClcclxuICB9XHJcblxyXG4gIGFzeW5jIGRpc3Bvc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgdGhpcy4jZ2F0aGVyZWQuZGlzcG9zZUFzeW5jKCksXHJcbiAgICAgIHRoaXMuI2Rvd25sb2FkZXIuZGlzcG9zZUFzeW5jKCksXHJcbiAgICAgIHRoaXMuI2NhY2hlV3JpdGVyLmRpc3Bvc2VBc3luYygpLFxyXG4gICAgICB0aGlzLiNjYWNoZVJlYWRlci5kaXNwb3NlQXN5bmMoKVxyXG4gICAgXSlcclxuICAgIHRoaXMuI2RlZmVybWVudHMuZGlzcG9zZSgpXHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRSb290T2JqZWN0KCk6IFByb21pc2U8SXRlbSB8IHVuZGVmaW5lZD4ge1xyXG4gICAgaWYgKCF0aGlzLiNyb290KSB7XHJcbiAgICAgIHRoaXMuI3Jvb3QgPSAoYXdhaXQgdGhpcy4jZGF0YWJhc2UuZ2V0QWxsKFt0aGlzLiNyb290SWRdKSlbMF1cclxuICAgICAgaWYgKCF0aGlzLiNyb290KSB7XHJcbiAgICAgICAgdGhpcy4jcm9vdCA9IGF3YWl0IHRoaXMuI2Rvd25sb2FkZXIuZG93bmxvYWRTaW5nbGUoKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuI2lzUm9vdFN0b3JlZCA9IHRydWVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuI3Jvb3RcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldE9iamVjdChwYXJhbXM6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTxCYXNlPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy4jY2FjaGVSZWFkZXIuZ2V0T2JqZWN0KHsgaWQ6IHBhcmFtcy5pZCB9KVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0VG90YWxPYmplY3RDb3VudCgpOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgY29uc3Qgcm9vdE9iaiA9IGF3YWl0IHRoaXMuZ2V0Um9vdE9iamVjdCgpXHJcbiAgICBjb25zdCB0b3RhbENoaWxkcmVuQ291bnQgPSBPYmplY3Qua2V5cyhyb290T2JqPy5iYXNlPy5fX2Nsb3N1cmUgfHwge30pLmxlbmd0aFxyXG4gICAgcmV0dXJuIHRvdGFsQ2hpbGRyZW5Db3VudCArIDEgLy9jb3VudCB0aGUgcm9vdFxyXG4gIH1cclxuXHJcbiAgYXN5bmMgKmdldE9iamVjdEl0ZXJhdG9yKCk6IEFzeW5jR2VuZXJhdG9yPEJhc2U+IHtcclxuICAgIGNvbnN0IHJvb3RJdGVtID0gYXdhaXQgdGhpcy5nZXRSb290T2JqZWN0KClcclxuICAgIGlmIChyb290SXRlbT8uYmFzZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuI2xvZ2dlcignTm8gcm9vdCBvYmplY3QgZm91bmQhJylcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBpZiAoIXJvb3RJdGVtLmJhc2UuX19jbG9zdXJlKSB7XHJcbiAgICAgIHlpZWxkIHJvb3RJdGVtLmJhc2VcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgLy9zb3J0IHRoZSBjbG9zdXJlcyBieSB0aGVpciB2YWx1ZXMgZGVzY2VuZGluZ1xyXG4gICAgY29uc3Qgc29ydGVkQ2xvc3VyZXMgPSBPYmplY3QuZW50cmllcyhyb290SXRlbS5iYXNlLl9fY2xvc3VyZSA/PyBbXSkuc29ydChcclxuICAgICAgKGEsIGIpID0+IGJbMV0gLSBhWzFdXHJcbiAgICApXHJcbiAgICB0aGlzLiNsb2dnZXIoXHJcbiAgICAgICdjYWxjdWxhdGVkIGNsb3N1cmVzOiAnLFxyXG4gICAgICAhdGFrZShzb3J0ZWRDbG9zdXJlcy52YWx1ZXMoKSwgTUFYX0NMT1NVUkVTX1RPX1RBS0UpLmV2ZXJ5KFxyXG4gICAgICAgICh4KSA9PiB4WzFdID09PSBFWFBFQ1RFRF9DTE9TVVJFX1ZBTFVFXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIGNvbnN0IGNoaWxkcmVuID0gc29ydGVkQ2xvc3VyZXMubWFwKCh4KSA9PiB4WzBdKVxyXG4gICAgY29uc3QgdG90YWwgPSBjaGlsZHJlbi5sZW5ndGggKyAxIC8vICsxIGZvciB0aGUgcm9vdCBvYmplY3RcclxuICAgIHRoaXMuI2Rvd25sb2FkZXIuaW5pdGlhbGl6ZSh7XHJcbiAgICAgIHJlc3VsdHM6IG5ldyBBZ2dyZWdhdGVRdWV1ZSh0aGlzLiNnYXRoZXJlZCwgdGhpcy4jY2FjaGVXcml0ZXIpLFxyXG4gICAgICB0b3RhbFxyXG4gICAgfSlcclxuICAgIC8vb25seSBmb3Igcm9vdFxyXG4gICAgdGhpcy4jZ2F0aGVyZWQuYWRkKHJvb3RJdGVtKVxyXG4gICAgdGhpcy4jY2FjaGVSZWFkZXIucmVxdWVzdEFsbChjaGlsZHJlbilcclxuICAgIGxldCBjb3VudCA9IDBcclxuICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiB0aGlzLiNnYXRoZXJlZC5jb25zdW1lKCkpIHtcclxuICAgICAgeWllbGQgaXRlbS5iYXNlISAvL2Fsd2F5cyBkZWZpbmVkLCBhcyB3ZSBhZGQgaXQgdG8gdGhlIHF1ZXVlXHJcbiAgICAgIGNvdW50KytcclxuICAgICAgaWYgKGNvdW50ID49IHRvdGFsKSB7XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLiNpc1Jvb3RTdG9yZWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy4jZGF0YWJhc2UucHV0QWxsKFtyb290SXRlbV0pXHJcbiAgICAgIHRoaXMuI2lzUm9vdFN0b3JlZCA9IHRydWVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGVGcm9tT2JqZWN0cyhvYmplY3RzOiBCYXNlW10pOiBPYmplY3RMb2FkZXIyIHtcclxuICAgIHJldHVybiBPYmplY3RMb2FkZXIyRmFjdG9yeS5jcmVhdGVGcm9tT2JqZWN0cyhvYmplY3RzKVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNyZWF0ZUZyb21KU09OKGpzb246IHN0cmluZyk6IE9iamVjdExvYWRlcjIge1xyXG4gICAgcmV0dXJuIE9iamVjdExvYWRlcjJGYWN0b3J5LmNyZWF0ZUZyb21KU09OKGpzb24pXHJcbiAgfVxyXG59XHJcbiJdfQ==