UNPKG

vite-plugin-react-server

Version:
137 lines (134 loc) 17.1 kB
/** * vite-plugin-react-server * Copyright (c) Nico Brinkkemper * MIT License */ import { PassThrough } from 'node:stream'; import { createStreamMetrics } from '../metrics/createStreamMetrics.js'; import { createReactElement } from '../helpers/createRscRenderHelpers.server.js'; import { checkReactVersion } from '../utils/checkReactVersion.js'; import { ReactDOMServer } from '../vendor/vendor.server.js'; function renderRscStream(options, handlers) { const id = options.id || ""; const route = options.route; const verbose = options.verbose || false; const logger = options.logger; try { let reactElement; try { reactElement = createReactElement(options, { id, route, verbose, logger, reuseHeadlessStreamId: options.reuseHeadlessStreamId, headlessStreamElements: options.headlessStreamElements, headlessStreamErrors: options.headlessStreamErrors }); } catch (elementError) { if (verbose) { logger?.error(`[renderRscStream:${route}] Error creating React element: ${elementError}`); } handlers?.onError?.(id, elementError, { route, context: "React Element Creation Error" }); const errorStream = new PassThrough(); errorStream.end(); return { type: "server", rscStream: errorStream, pipe: (destination) => errorStream.pipe(destination), abort: () => { }, metrics: createStreamMetrics() }; } const rscStream = new PassThrough(); const metrics = createStreamMetrics(); if (verbose) { logger?.info(`[renderRscStream:${route}] Creating React stream for element`); } checkReactVersion(); const reactStream = ReactDOMServer.renderToPipeableStream( reactElement, options.moduleBasePath || "", { ...options.serverPipeableStreamOptions, onError: (error) => { if (verbose) { logger?.error(`[renderRscStream:${route}] React stream error: ${error}`); } handlers?.onError?.(id, error, { route, context: "React Stream Error" }); if (options.onEvent) { options.onEvent({ type: "route.error", data: { error, route, panicThreshold: options.panicThreshold } }); } setImmediate(() => { if (!rscStream.destroyed) { rscStream.end(); } if (reactStream && typeof reactStream.abort === "function") { reactStream.abort(); } }); }, onPostpone: (reason) => { if (verbose) { logger?.info(`[renderRscStream:${route}] Stream postponed: ${reason}`); } handlers?.onPostpone?.(id, reason); } } ); reactStream.pipe(rscStream); rscStream.on("error", (error) => { if (verbose) { logger?.error(`[renderRscStream:${route}] Stream error: ${error}`); } }); return { type: "server", rscStream, // Alias for compatibility with existing code pipe: (destination) => rscStream.pipe(destination), // Convenience method abort: (reason) => { if (handlers?.onError) { handlers.onError(id, new Error(String(reason || "Stream aborted")), { route, context: "Stream Aborted" }); } rscStream.end(); }, metrics }; } catch (error) { handlers?.onError?.(id, error, { route, context: "RSC Render Error" }); const errorStream = new PassThrough(); errorStream.end(); return { type: "server", rscStream: errorStream, pipe: (destination) => errorStream.pipe(destination), abort: () => { }, metrics: createStreamMetrics() }; } } export { renderRscStream }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyUnNjU3RyZWFtLnNlcnZlci5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGx1Z2luL3N0cmVhbS9yZW5kZXJSc2NTdHJlYW0uc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhc3NUaHJvdWdoIH0gZnJvbSBcIm5vZGU6c3RyZWFtXCI7XG5pbXBvcnQgdHlwZSB7IENyZWF0ZUhhbmRsZXJPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFJzY1JlbmRlclJlc3VsdCB9IGZyb20gXCIuL3JlbmRlclJzY1N0cmVhbS50eXBlcy5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlU3RyZWFtTWV0cmljcyB9IGZyb20gXCIuLi9tZXRyaWNzL2NyZWF0ZVN0cmVhbU1ldHJpY3MuanNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlYWN0RWxlbWVudCB9IGZyb20gXCIuLi9oZWxwZXJzL2NyZWF0ZVJzY1JlbmRlckhlbHBlcnMuc2VydmVyLmpzXCI7XG5pbXBvcnQgeyBjaGVja1JlYWN0VmVyc2lvbiB9IGZyb20gXCIuLi91dGlscy9jaGVja1JlYWN0VmVyc2lvbi5qc1wiO1xuaW1wb3J0IHsgUmVhY3RET01TZXJ2ZXIgfSBmcm9tIFwiLi4vdmVuZG9yL3ZlbmRvci5zZXJ2ZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgU3RyZWFtSGFuZGxlcnMgfSBmcm9tIFwiLi4vd29ya2VyL3R5cGVzLmpzXCI7XG5cblxuLyoqXG4gKiBJbnR1aXRpdmUgUlNDIHN0cmVhbSByZW5kZXJlciB0aGF0IHdvcmtzIG9uIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXJcbiAqIFxuICogVXNhZ2U6XG4gKiBjb25zdCByZXN1bHQgPSByZW5kZXJSc2NTdHJlYW0ob3B0aW9ucywgaGFuZGxlcnMpO1xuICogXG4gKiAvLyBQaXBlIHRvIGFueSBkZXN0aW5hdGlvblxuICogcmVzdWx0LnJzY1N0cmVhbS5waXBlKGZpbGVTdHJlYW0pO1xuICogcmVzdWx0LnBpcGUocmVzcG9uc2UpOyAvLyBjb252ZW5pZW5jZSBtZXRob2RcbiAqIFxuICogLy8gQWNjZXNzIHRoZSBzdHJlYW0gZGlyZWN0bHlcbiAqIHJlc3VsdC5zdHJlYW0ub24oJ2RhdGEnLCAoY2h1bmspID0+IGNvbnNvbGUubG9nKGNodW5rKSk7XG4gKiBcbiAqIC8vIEFib3J0IGlmIG5lZWRlZFxuICogcmVzdWx0LmFib3J0KCdVc2VyIGNhbmNlbGxlZCcpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyUnNjU3RyZWFtKFxuICBvcHRpb25zOiBDcmVhdGVIYW5kbGVyT3B0aW9ucyxcbiAgaGFuZGxlcnM/OiBQaWNrPFN0cmVhbUhhbmRsZXJzPFwic2VydmVyXCI+LCBcIm9uRXJyb3JcIiB8IFwib25Qb3N0cG9uZVwiIHwgXCJvbkVuZFwiIHwgXCJvbkRhdGFcIj5cbik6IFJzY1JlbmRlclJlc3VsdCB7XG4gIGNvbnN0IGlkID0gb3B0aW9ucy5pZCB8fCBcIlwiO1xuICBjb25zdCByb3V0ZSA9IG9wdGlvbnMucm91dGU7XG4gIGNvbnN0IHZlcmJvc2UgPSBvcHRpb25zLnZlcmJvc2UgfHwgZmFsc2U7XG4gIGNvbnN0IGxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyO1xuXG4gIHRyeSB7XG4gICAgLy8gQ3JlYXRlIFJlYWN0IGVsZW1lbnQgZnJvbSBvcHRpb25zIC0gd3JhcCBpbiB0cnktY2F0Y2ggdG8gaGFuZGxlIGVycm9ycyBkdXJpbmcgZWxlbWVudCBjcmVhdGlvblxuICAgIGxldCByZWFjdEVsZW1lbnQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlYWN0RWxlbWVudCA9IGNyZWF0ZVJlYWN0RWxlbWVudChvcHRpb25zLCB7XG4gICAgICAgIGlkLFxuICAgICAgICByb3V0ZSxcbiAgICAgICAgdmVyYm9zZSxcbiAgICAgICAgbG9nZ2VyLFxuICAgICAgICByZXVzZUhlYWRsZXNzU3RyZWFtSWQ6IChvcHRpb25zIGFzIGFueSkucmV1c2VIZWFkbGVzc1N0cmVhbUlkLFxuICAgICAgICBoZWFkbGVzc1N0cmVhbUVsZW1lbnRzOiAob3B0aW9ucyBhcyBhbnkpLmhlYWRsZXNzU3RyZWFtRWxlbWVudHMsXG4gICAgICAgIGhlYWRsZXNzU3RyZWFtRXJyb3JzOiAob3B0aW9ucyBhcyBhbnkpLmhlYWRsZXNzU3RyZWFtRXJyb3JzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZWxlbWVudEVycm9yKSB7XG4gICAgICAvLyBIYW5kbGUgZXJyb3JzIGR1cmluZyBSZWFjdCBlbGVtZW50IGNyZWF0aW9uXG4gICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICBsb2dnZXI/LmVycm9yKGBbcmVuZGVyUnNjU3RyZWFtOiR7cm91dGV9XSBFcnJvciBjcmVhdGluZyBSZWFjdCBlbGVtZW50OiAke2VsZW1lbnRFcnJvcn1gKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2FsbCBvdXIgZXJyb3IgaGFuZGxlciB0byBwcm9jZXNzIHRoZSBlcnJvclxuICAgICAgaGFuZGxlcnM/Lm9uRXJyb3I/LihpZCwgZWxlbWVudEVycm9yLCB7XG4gICAgICAgIHJvdXRlLFxuICAgICAgICBjb250ZXh0OiBcIlJlYWN0IEVsZW1lbnQgQ3JlYXRpb24gRXJyb3JcIixcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZXR1cm4gZW1wdHkgc3RyZWFtIG9uIGVycm9yIC0gQVBJIHJlbWFpbnMgY29uc2lzdGVudFxuICAgICAgY29uc3QgZXJyb3JTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICAgIGVycm9yU3RyZWFtLmVuZCgpO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInNlcnZlclwiIGFzIGNvbnN0LFxuICAgICAgICByc2NTdHJlYW06IGVycm9yU3RyZWFtLFxuICAgICAgICBwaXBlOiAoZGVzdGluYXRpb246IGFueSkgPT4gZXJyb3JTdHJlYW0ucGlwZShkZXN0aW5hdGlvbiksXG4gICAgICAgIGFib3J0OiAoKSA9PiB7fSxcbiAgICAgICAgbWV0cmljczogY3JlYXRlU3RyZWFtTWV0cmljcygpLFxuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIHRoZSBvdXRwdXQgc3RyZWFtIC0gdGhpcyBpcyB3aGF0IHVzZXJzIHdpbGwgcGlwZSB0byBkZXN0aW5hdGlvbnNcbiAgICBjb25zdCByc2NTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICBjb25zdCBtZXRyaWNzID0gY3JlYXRlU3RyZWFtTWV0cmljcygpO1xuXG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxvZ2dlcj8uaW5mbyhgW3JlbmRlclJzY1N0cmVhbToke3JvdXRlfV0gQ3JlYXRpbmcgUmVhY3Qgc3RyZWFtIGZvciBlbGVtZW50YCk7XG4gICAgfVxuICAgIFxuICAgIGNoZWNrUmVhY3RWZXJzaW9uKCk7XG5cbiAgICAvLyBSZW5kZXIgUmVhY3QgdG8gc3RyZWFtIC0gbGV0IGl0IGZsb3cgbmF0dXJhbGx5IGxpa2UgdGhlIFJTQyB3b3JrZXJcbiAgICBjb25zdCByZWFjdFN0cmVhbSA9IFJlYWN0RE9NU2VydmVyLnJlbmRlclRvUGlwZWFibGVTdHJlYW0oXG4gICAgICByZWFjdEVsZW1lbnQsXG4gICAgICBvcHRpb25zLm1vZHVsZUJhc2VQYXRoIHx8IFwiXCIsXG4gICAgICB7XG4gICAgICAgIC4uLm9wdGlvbnMuc2VydmVyUGlwZWFibGVTdHJlYW1PcHRpb25zLFxuICAgICAgICBvbkVycm9yOiAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyPy5lcnJvcihgW3JlbmRlclJzY1N0cmVhbToke3JvdXRlfV0gUmVhY3Qgc3RyZWFtIGVycm9yOiAke2Vycm9yfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDYWxsIG91ciBlcnJvciBoYW5kbGVyIHRvIHByb2Nlc3MgdGhlIGVycm9yXG4gICAgICAgICAgaGFuZGxlcnM/Lm9uRXJyb3I/LihpZCwgZXJyb3IsIHtcbiAgICAgICAgICAgIHJvdXRlLFxuICAgICAgICAgICAgY29udGV4dDogXCJSZWFjdCBTdHJlYW0gRXJyb3JcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBFbWl0IHJvdXRlLmVycm9yIGV2ZW50IHRvIGFsbG93IG1haW4gdGhyZWFkIHRvIGhhbmRsZSBwYW5pYyB0aHJlc2hvbGQgbG9naWMgKGxpa2UgY2xpZW50KVxuICAgICAgICAgIGlmIChvcHRpb25zLm9uRXZlbnQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25FdmVudCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwicm91dGUuZXJyb3JcIixcbiAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICByb3V0ZTogcm91dGUsXG4gICAgICAgICAgICAgICAgcGFuaWNUaHJlc2hvbGQ6IG9wdGlvbnMucGFuaWNUaHJlc2hvbGRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIENSSVRJQ0FMOiBEb24ndCBsZXQgdGhlIGVycm9yIHByb3BhZ2F0ZSBmdXJ0aGVyIC0gdGhpcyBwcmV2ZW50cyB1bmNhdWdodCBleGNlcHRpb25zXG4gICAgICAgICAgLy8gVGhlIGVycm9yIGhhcyBiZWVuIGhhbmRsZWQgYnkgb3VyIGVycm9yIGhhbmRsZXIsIHNvIHdlIGRvbid0IG5lZWQgdG8gcmUtdGhyb3cgaXRcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBFbnN1cmUgc3RyZWFtIGlzIGVuZGVkIHdoZW4gZXJyb3Igb2NjdXJzIHRvIHByZXZlbnQgaGFuZ2luZyAobGlrZSBSU0Mgd29ya2VyIGRvZXMpXG4gICAgICAgICAgLy8gVXNlIHNldEltbWVkaWF0ZSB0byBlbnN1cmUgdGhlIGVycm9yIGhhbmRsZXIgY29tcGxldGVzIGJlZm9yZSBlbmRpbmcgdGhlIHN0cmVhbVxuICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJzY1N0cmVhbS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgcnNjU3RyZWFtLmVuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWxzbyBhYm9ydCB0aGUgUmVhY3Qgc3RyZWFtIHRvIGVuc3VyZSBpdCBzdG9wcyBwcm9kdWNpbmcgZGF0YVxuICAgICAgICAgICAgaWYgKHJlYWN0U3RyZWFtICYmIHR5cGVvZiByZWFjdFN0cmVhbS5hYm9ydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICByZWFjdFN0cmVhbS5hYm9ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvblBvc3Rwb25lOiAocmVhc29uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyPy5pbmZvKGBbcmVuZGVyUnNjU3RyZWFtOiR7cm91dGV9XSBTdHJlYW0gcG9zdHBvbmVkOiAke3JlYXNvbn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGFuZGxlcnM/Lm9uUG9zdHBvbmU/LihpZCwgcmVhc29uKTtcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gUGlwZSBSZWFjdCBvdXRwdXQgdG8gb3VyIHN0cmVhbSAtIGxldCBzdHJlYW1zIGVuZCBuYXR1cmFsbHkgbGlrZSB0aGUgUlNDIHdvcmtlciBkb2VzXG4gICAgcmVhY3RTdHJlYW0ucGlwZShyc2NTdHJlYW0pO1xuICAgIFxuICAgIC8vIEhhbmRsZSBzdHJlYW0gZXJyb3JzIG5hdHVyYWxseSAtIGRvbid0IGZvcmNlIGNvbXBsZXRpb25cbiAgICByc2NTdHJlYW0ub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgIGxvZ2dlcj8uZXJyb3IoYFtyZW5kZXJSc2NTdHJlYW06JHtyb3V0ZX1dIFN0cmVhbSBlcnJvcjogJHtlcnJvcn1gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFJldHVybiBpbnR1aXRpdmUgaW50ZXJmYWNlIHRoYXQgd29ya3MgdGhlIHNhbWUgb24gY2xpZW50IGFuZCBzZXJ2ZXJcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJzZXJ2ZXJcIiBhcyBjb25zdCxcbiAgICAgIHJzY1N0cmVhbTogcnNjU3RyZWFtLCAvLyBBbGlhcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGVcbiAgICAgIHBpcGU6IChkZXN0aW5hdGlvbjogYW55KSA9PiByc2NTdHJlYW0ucGlwZShkZXN0aW5hdGlvbiksIC8vIENvbnZlbmllbmNlIG1ldGhvZFxuICAgICAgYWJvcnQ6IChyZWFzb24/OiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmIChoYW5kbGVycz8ub25FcnJvcikge1xuICAgICAgICAgIGhhbmRsZXJzLm9uRXJyb3IoaWQsIG5ldyBFcnJvcihTdHJpbmcocmVhc29uIHx8IFwiU3RyZWFtIGFib3J0ZWRcIikpLCB7XG4gICAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiU3RyZWFtIEFib3J0ZWRcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByc2NTdHJlYW0uZW5kKCk7XG4gICAgICB9LFxuICAgICAgbWV0cmljcyxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEhhbmRsZSBlcnJvcnMgZ3JhY2VmdWxseSAtIGFsd2F5cyByZXR1cm4gYSB2YWxpZCBzdHJlYW1cbiAgICBoYW5kbGVycz8ub25FcnJvcj8uKGlkLCBlcnJvciwge1xuICAgICAgcm91dGUsXG4gICAgICBjb250ZXh0OiBcIlJTQyBSZW5kZXIgRXJyb3JcIixcbiAgICB9KTtcblxuICAgIC8vIFJldHVybiBlbXB0eSBzdHJlYW0gb24gZXJyb3IgLSBBUEkgcmVtYWlucyBjb25zaXN0ZW50XG4gICAgY29uc3QgZXJyb3JTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICBlcnJvclN0cmVhbS5lbmQoKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJzZXJ2ZXJcIiBhcyBjb25zdCxcbiAgICAgIHJzY1N0cmVhbTogZXJyb3JTdHJlYW0sXG4gICAgICBwaXBlOiAoZGVzdGluYXRpb246IGFueSkgPT4gZXJyb3JTdHJlYW0ucGlwZShkZXN0aW5hdGlvbiksXG4gICAgICBhYm9ydDogKCkgPT4ge30sXG4gICAgICBtZXRyaWNzOiBjcmVhdGVTdHJlYW1NZXRyaWNzKCksXG4gICAgfTtcbiAgfVxufVxuXG5cblxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBMEJPLFNBQVMsZUFBQSxDQUNkLFNBQ0EsUUFDaUIsRUFBQTtBQUNqQixFQUFNLE1BQUEsRUFBQSxHQUFLLFFBQVEsRUFBTSxJQUFBLEVBQUE7QUFDekIsRUFBQSxNQUFNLFFBQVEsT0FBUSxDQUFBLEtBQUE7QUFDdEIsRUFBTSxNQUFBLE9BQUEsR0FBVSxRQUFRLE9BQVcsSUFBQSxLQUFBO0FBQ25DLEVBQUEsTUFBTSxTQUFTLE9BQVEsQ0FBQSxNQUFBO0FBRXZCLEVBQUksSUFBQTtBQUVGLElBQUksSUFBQSxZQUFBO0FBQ0osSUFBSSxJQUFBO0FBQ0YsTUFBQSxZQUFBLEdBQWUsbUJBQW1CLE9BQVMsRUFBQTtBQUFBLFFBQ3pDLEVBQUE7QUFBQSxRQUNBLEtBQUE7QUFBQSxRQUNBLE9BQUE7QUFBQSxRQUNBLE1BQUE7QUFBQSxRQUNBLHVCQUF3QixPQUFnQixDQUFBLHFCQUFBO0FBQUEsUUFDeEMsd0JBQXlCLE9BQWdCLENBQUEsc0JBQUE7QUFBQSxRQUN6QyxzQkFBdUIsT0FBZ0IsQ0FBQTtBQUFBLE9BQ3hDLENBQUE7QUFBQSxhQUNNLFlBQWMsRUFBQTtBQUVyQixNQUFBLElBQUksT0FBUyxFQUFBO0FBQ1gsUUFBQSxNQUFBLEVBQVEsS0FBTSxDQUFBLENBQUEsaUJBQUEsRUFBb0IsS0FBSyxDQUFBLGdDQUFBLEVBQW1DLFlBQVksQ0FBRSxD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