UNPKG

vite-plugin-react-server

Version:
106 lines (103 loc) 13.4 kB
/** * vite-plugin-react-server * Copyright (c) Nico Brinkkemper * MIT License */ import { Transform } from 'node:stream'; import { createStreamMetrics } from '../metrics/createStreamMetrics.js'; const collectHtmlContent = async function _collectHtmlContent(html, handlerOptions) { const metrics = createStreamMetrics(); const startTime = performance.now(); const htmlBuffer = []; if (handlerOptions.verbose) { handlerOptions.logger.info( `[collectHtmlContent.client] Starting HTML collection for route: ${handlerOptions.route}` ); } try { const metricsTransform = new Transform({ transform(chunk, encoding, callback) { const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, encoding); htmlBuffer.push(buffer); metrics.chunks++; metrics.bytes += buffer.length; if (handlerOptions.verbose) { handlerOptions.logger.info( `[collectHtmlContent.client] HTML chunk ${metrics.chunks}, bytes: ${buffer.length}, total: ${metrics.bytes}` ); } callback(null, chunk); }, flush(callback) { metrics.duration = performance.now() - startTime; if (handlerOptions.verbose) { handlerOptions.logger.info( `[collectHtmlContent.client] HTML collection completed: ${metrics.bytes} bytes in ${metrics.duration}ms` ); } callback(); } }); const { PassThrough } = await import('node:stream'); const consumer = new PassThrough(); html.pipe(metricsTransform).pipe(consumer); await new Promise((resolve, reject) => { const timeout = setTimeout(() => { if (handlerOptions.verbose) { handlerOptions.logger.info( `[collectHtmlContent.client] Stream timeout reached, forcing completion` ); } resolve(); }, 15e3); consumer.on("end", () => { if (handlerOptions.verbose) { handlerOptions.logger.info( `[collectHtmlContent.client] Stream ended with ${metrics.bytes} bytes` ); } clearTimeout(timeout); resolve(); }); consumer.on("error", (error) => { if (handlerOptions.verbose) { handlerOptions.logger.info( `[collectHtmlContent.client] Stream error: ${error}` ); } clearTimeout(timeout); reject(error); }); }); const { Readable } = await import('node:stream'); const readableStream = new Readable({ read() { for (const chunk of htmlBuffer) { this.push(chunk); } this.push(null); } }); return { pipe: readableStream.pipe.bind(readableStream), abort: (reason) => { html.abort(reason); readableStream.destroy(reason); }, metrics, // Include buffered content for reuse bufferedContent: htmlBuffer }; } catch (error) { if (handlerOptions.verbose) { handlerOptions.logger.info(`[collectHtmlContent.client] Error: ${error}`); } html.abort(new Error("HTML Stream aborted")); if (error != null) { throw error; } throw new Error("Failed to collect HTML content"); } }; export { collectHtmlContent }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdEh0bWxDb250ZW50LmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9wbHVnaW4vcmVhY3Qtc3RhdGljL2NvbGxlY3RIdG1sQ29udGVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGNvbGxlY3RIdG1sQ29udGVudC5jbGllbnQudHNcbiAqXG4gKiBQVVJQT1NFOiBDb2xsZWN0cyBIVE1MIHN0cmVhbSB3aXRoIG1ldHJpY3NcbiAqXG4gKiBUaGlzIG1vZHVsZTpcbiAqIDEuIFRha2VzIGFuIEhUTUwgc3RyZWFtIGFuZCBjb2xsZWN0cyBpdFxuICogMi4gVHJhY2tzIG1ldHJpY3MgKGNodW5rcywgYnl0ZXMsIGR1cmF0aW9uKVxuICogMy4gUmV0dXJucyBidWZmZXJlZCBjb250ZW50IGFuZCBtZXRyaWNzXG4gKiA0LiBEb2VzIE5PVCBjcmVhdGUgSFRNTCBzdHJlYW1zIC0gdGhhdCdzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eVxuICogNS4gRG9lcyBOT1Qgd3JpdGUgZmlsZXMgLSB0aGF0J3MgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5XG4gKi9cblxuaW1wb3J0IHsgVHJhbnNmb3JtIH0gZnJvbSBcIm5vZGU6c3RyZWFtXCI7XG5pbXBvcnQgeyBjcmVhdGVTdHJlYW1NZXRyaWNzIH0gZnJvbSBcIi4uL21ldHJpY3MvY3JlYXRlU3RyZWFtTWV0cmljcy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0SHRtbENvbnRlbnRGbiB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5cbmV4cG9ydCBjb25zdCBjb2xsZWN0SHRtbENvbnRlbnQ6IENvbGxlY3RIdG1sQ29udGVudEZuID1cbiAgYXN5bmMgZnVuY3Rpb24gX2NvbGxlY3RIdG1sQ29udGVudChodG1sLCBoYW5kbGVyT3B0aW9ucykge1xuICAgIGNvbnN0IG1ldHJpY3MgPSBjcmVhdGVTdHJlYW1NZXRyaWNzKCk7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgaHRtbEJ1ZmZlcjogQnVmZmVyW10gPSBbXTtcblxuICAgIGlmIChoYW5kbGVyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICBoYW5kbGVyT3B0aW9ucy5sb2dnZXIuaW5mbyhcbiAgICAgICAgYFtjb2xsZWN0SHRtbENvbnRlbnQuY2xpZW50XSBTdGFydGluZyBIVE1MIGNvbGxlY3Rpb24gZm9yIHJvdXRlOiAke2hhbmRsZXJPcHRpb25zLnJvdXRlfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBhIHRyYW5zZm9ybSBzdHJlYW0gdG8gY29sbGVjdCBIVE1MIGNvbnRlbnQgYW5kIHRyYWNrIG1ldHJpY3NcbiAgICAgIGNvbnN0IG1ldHJpY3NUcmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKHtcbiAgICAgICAgdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuaXNCdWZmZXIoY2h1bmspID8gY2h1bmsgOiBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcgYXMgQnVmZmVyRW5jb2RpbmcpO1xuICAgICAgICAgIGh0bWxCdWZmZXIucHVzaChidWZmZXIpO1xuICAgICAgICAgIG1ldHJpY3MuY2h1bmtzKys7XG4gICAgICAgICAgbWV0cmljcy5ieXRlcyArPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChoYW5kbGVyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBoYW5kbGVyT3B0aW9ucy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgYFtjb2xsZWN0SHRtbENvbnRlbnQuY2xpZW50XSBIVE1MIGNodW5rICR7bWV0cmljcy5jaHVua3N9LCBieXRlczogJHtidWZmZXIubGVuZ3RofSwgdG90YWw6ICR7bWV0cmljcy5ieXRlc31gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCBjaHVuayk7XG4gICAgICAgIH0sXG4gICAgICAgIGZsdXNoKGNhbGxiYWNrKSB7XG4gICAgICAgICAgbWV0cmljcy5kdXJhdGlvbiA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICAgIGlmIChoYW5kbGVyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBoYW5kbGVyT3B0aW9ucy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgYFtjb2xsZWN0SHRtbENvbnRlbnQuY2xpZW50XSBIVE1MIGNvbGxlY3Rpb24gY29tcGxldGVkOiAke21ldHJpY3MuYnl0ZXN9IGJ5dGVzIGluICR7bWV0cmljcy5kdXJhdGlvbn1tc2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBDcmVhdGUgYSBQYXNzVGhyb3VnaCBzdHJlYW0gdG8gY29uc3VtZSB0aGUgdHJhbnNmb3JtXG4gICAgICBjb25zdCB7IFBhc3NUaHJvdWdoIH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlOnN0cmVhbVwiKTtcbiAgICAgIGNvbnN0IGNvbnN1bWVyID0gbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgICBcbiAgICAgIC8vIFBpcGUgSFRNTCBzdHJlYW0gdGhyb3VnaCBtZXRyaWNzIHRyYWNraW5nIHRvIGNvbnN1bWVyXG4gICAgICBodG1sLnBpcGUobWV0cmljc1RyYW5zZm9ybSkucGlwZShjb25zdW1lcik7XG5cbiAgICAgIC8vIFdhaXQgZm9yIHN0cmVhbSB0byBjb21wbGV0ZSB3aXRoIHRpbWVvdXRcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmIChoYW5kbGVyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBoYW5kbGVyT3B0aW9ucy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgYFtjb2xsZWN0SHRtbENvbnRlbnQuY2xpZW50XSBTdHJlYW0gdGltZW91dCByZWFjaGVkLCBmb3JjaW5nIGNvbXBsZXRpb25gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sIDE1MDAwKTsgLy8gMTUgc2Vjb25kIHRpbWVvdXQgZm9yIEhUTUwgY29udGVudCBjb2xsZWN0aW9uXG5cbiAgICAgICAgY29uc3VtZXIub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgIGlmIChoYW5kbGVyT3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBoYW5kbGVyT3B0aW9ucy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgYFtjb2xsZWN0SHRtbENvbnRlbnQuY2xpZW50XSBTdHJlYW0gZW5kZWQgd2l0aCAke21ldHJpY3MuYnl0ZXN9IGJ5dGVzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3VtZXIub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoaGFuZGxlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgaGFuZGxlck9wdGlvbnMubG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgIGBbY29sbGVjdEh0bWxDb250ZW50LmNsaWVudF0gU3RyZWFtIGVycm9yOiAke2Vycm9yfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDcmVhdGUgYSByZWFkYWJsZSBzdHJlYW0gZnJvbSB0aGUgYnVmZmVyZWQgY29udGVudCB0aGF0IGNhbiBiZSBwaXBlZCBtdWx0aXBsZSB0aW1lc1xuICAgICAgY29uc3QgeyBSZWFkYWJsZSB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpzdHJlYW1cIik7XG4gICAgICBjb25zdCByZWFkYWJsZVN0cmVhbSA9IG5ldyBSZWFkYWJsZSh7XG4gICAgICAgIHJlYWQoKSB7XG4gICAgICAgICAgLy8gUHVzaCBhbGwgYnVmZmVyZWQgY29udGVudFxuICAgICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgaHRtbEJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5wdXNoKGNodW5rKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wdXNoKG51bGwpOyAvLyBFbmQgdGhlIHN0cmVhbVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gUmV0dXJuIGJ1ZmZlcmVkIGNvbnRlbnQgYW5kIG1ldHJpY3MgLSBmaWxlIHdyaXRpbmcgaXMgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBpcGU6IHJlYWRhYmxlU3RyZWFtLnBpcGUuYmluZChyZWFkYWJsZVN0cmVhbSksXG4gICAgICAgIGFib3J0OiAocmVhc29uPzogdW5rbm93bikgPT4ge1xuICAgICAgICAgIGh0bWwuYWJvcnQocmVhc29uKTtcbiAgICAgICAgICByZWFkYWJsZVN0cmVhbS5kZXN0cm95KHJlYXNvbiBhcyBFcnJvcik7XG4gICAgICAgIH0sXG4gICAgICAgIG1ldHJpY3MsXG4gICAgICAgIC8vIEluY2x1ZGUgYnVmZmVyZWQgY29udGVudCBmb3IgcmV1c2VcbiAgICAgICAgYnVmZmVyZWRDb250ZW50OiBodG1sQnVmZmVyLFxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaGFuZGxlck9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICBoYW5kbGVyT3B0aW9ucy5sb2dnZXIuaW5mbyhgW2NvbGxlY3RIdG1sQ29udGVudC5jbGllbnRdIEVycm9yOiAke2Vycm9yfWApO1xuICAgICAgfVxuICAgICAgaHRtbC5hYm9ydChuZXcgRXJyb3IoXCJIVE1MIFN0cmVhbSBhYm9ydGVkXCIpKTtcbiAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGNvbGxlY3QgSFRNTCBjb250ZW50XCIpO1xuICAgIH1cbiAgfTsgIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBaUJPLE1BQU0sa0JBQ1gsR0FBQSxlQUFlLG1CQUFvQixDQUFBLElBQUEsRUFBTSxjQUFnQixFQUFBO0FBQ3ZELEVBQUEsTUFBTSxVQUFVLG1CQUFvQixFQUFBO0FBQ3BDLEVBQU0sTUFBQSxTQUFBLEdBQVksWUFBWSxHQUFJLEVBQUE7QUFDbEMsRUFBQSxNQUFNLGFBQXVCLEVBQUM7QUFFOUIsRUFBQSxJQUFJLGVBQWUsT0FBUyxFQUFBO0FBQzFCLElBQUEsY0FBQSxDQUFlLE1BQU8sQ0FBQSxJQUFBO0FBQUEsTUFDcEIsQ0FBQSxnRUFBQSxFQUFtRSxlQUFlLEtBQUssQ0FBQTtBQUFBLEtBQ3pGO0FBQUE7QUFHRixFQUFJLElBQUE7QUFFRixJQUFNLE1BQUEsZ0JBQUEsR0FBbUIsSUFBSSxTQUFVLENBQUE7QUFBQSxNQUNyQyxTQUFBLENBQVUsS0FBTyxFQUFBLFFBQUEsRUFBVSxRQUFVLEVBQUE7QUFDbkMsUUFBTSxNQUFBLE1BQUEsR0FBUyxPQUFPLFFBQVMsQ0FBQSxLQUFLLElBQUksS0FBUSxHQUFBLE1BQUEsQ0FBTyxJQUFLLENBQUEsS0FBQSxFQUFPLFFBQTBCLENBQUE7QUFDN0YsUUFBQSxVQUFBLENBQVcsS0FBSyxNQUFNLENBQUE7QUFDdEIsUUFBUSxPQUFBLENBQUEsTUFBQSxFQUFBO0FBQ1IsUUFBQSxPQUFBLENBQVEsU0FBUyxNQUFPLENBQUEsTUFBQTtBQUV4QixRQUFBLElBQUksZUFBZSxPQUFTLEVBQUE7QUFDMUIsVUFBQSxjQUFBLENBQWUsTUFBTyxDQUFBLElBQUE7QUFBQSxZQUNwQixDQUFBLHVDQUFBLEVBQTBDLFFBQVEsTUFBTSxDQUFBLFNBQUEsRUFBWSxPQUFPLE1BQU0sQ0FBQSxTQUFBLEVBQVksUUFBUSxLQUFLLENBQUE7QUFBQSxXQUM1RztBQUFBO0FBR0YsUUFBQSxRQUFBLENBQVMsTUFBTSxLQUFLLENBQUE7QUFBQSxPQUN0QjtBQUFBLE1BQ0EsTUFBTSxRQUFVLEVBQUE7QUFDZCxRQUFRLE9BQUEsQ0FBQSxRQUFBLEdBQVcsV0FBWSxDQUFBLEdBQUEsRUFBUSxHQUFBLFNBQUE7QUFDdkMsUUFBQSxJQUFJLGVBQWUsT0FBUyxFQUFBO0FBQzFCLFVBQUEsY0FBQSxDQUFlLE1BQU8sQ0FBQSxJQUFBO0FBQUEsWUFDcEIsQ0FBMEQsdURBQUEsRUFBQSxPQUFBLENBQVEsS0FBSyxDQUFBLFVBQUEsRUFBYSxRQUFRLFFBQVEsQ0FBQSxFQUFBO0FBQUEsV0FDdEc7QUFBQTtBQUVGLFFBQVMsUUFBQSxFQUFBO0FBQUE7QUFDWCxLQUNELENBQUE7QUFHRCxJQUFBLE1BQU0sRUFBRSxXQUFBLEVBQWdCLEdBQUEsTUFBTSxPQUFPLGFBQWEsQ0FBQTtBQUNsRCxJQUFNLE1BQUEsUUFBQSxHQUFXLElBQUksV0FBWSxFQUFBO0FBR2pDLElBQUEsSUFBQSxDQUFLLElBQUssQ0FBQSxnQkFBZ0IsQ0FBRSxDQUFBLElBQUEsQ0FBSyxRQUFRLENBQUE7QUFHekMsSUFBQSxNQUFNLElBQUksT0FBQSxDQUFjLENBQUMsT0FBQSxFQUFTLE1BQVcsS0FBQTtBQUMzQyxNQUFNLE1BQUEsT0FBQSxHQUFVLFdBQVcsTUFBTTtBQUMvQixRQUFBLElBQUksZUFBZSxPQUFTLEVBQUE7QUFDMUIsVUFBQSxjQUFBLENBQWUsTUFBTyxDQUFBLElBQUE7QUFBQSxZQUNwQixDQUFBLHNFQUFBO0FBQUEsV0FDRjtBQUFBO0FBRUYsUUFBUSxPQUFBLEVBQUE7QUFBQSxTQUNQLElBQUssQ0FBQTtBQUVSLE1BQVMsUUFBQSxDQUFBLEVBQUEsQ0FBRyxPQUFPLE1BQU07QUFDdkIsUUFBQSxJQUFJLGVBQWUsT0FBUyxFQUFBO0FBQzFCLFVBQUEsY0FBQSxDQUFlLE1BQU8sQ0FBQSxJQUFBO0FBQUEsWUFDcEIsQ0FBQSw4Q0FBQSxFQUFpRCxRQUFRLEtBQUssQ0FBQSxNQUFBO0FBQUEsV0FDaEU7QUFBQTtBQUVGLFFBQUEsWUFBQSxDQUFhLE9BQU8sQ0FBQTtBQUNwQixRQUFRLE9BQUEsRUFBQTtBQUFBLE9BQ1QsQ0FBQTtBQUVELE1BQVMsUUFBQSxDQUFBLEVBQUEsQ0FBRyxPQUFTLEVBQUEsQ0FBQyxLQUFVLEtBQUE7QUFDOUIsUUFBQSxJQUFJLGVBQWUsT0FBUyxFQUFBO0FBQzFCLFVBQUEsY0FBQSxDQUFlLE1BQU8sQ0FBQSxJQUFBO0FBQUEsWUFDcEIsNkNBQTZDLEtBQUssQ0FBQTtBQUFBLFdBQ3BEO0FBQUE7QUFFRixRQUFBLFlBQUEsQ0FBYSxPQUFPLENBQUE7QUFDcEIsUUFBQSxNQUFBLENBQU8sS0FBSyxDQUFBO0FBQUEsT0FDYixDQUFBO0FBQUEsS0FDRixDQUFBO0FBR0QsSUFBQSxNQUFNLEVBQUUsUUFBQSxFQUFhLEdBQUEsTUFBTSxPQUFPLGFBQWEsQ0FBQTtBQUMvQyxJQUFNLE1BQUEsY0FBQSxHQUFpQixJQUFJLFFBQVMsQ0FBQTtBQUFBLE1BQ2xDLElBQU8sR0FBQTtBQUVMLFFBQUEsS0FBQSxNQUFXLFNBQVMsVUFBWSxFQUFBO0FBQzlCLFVBQUEsSUFBQSxDQUFLLEtBQUssS0FBSyxDQUFBO0FBQUE7QUFFakIsUUFBQSxJQUFBLENBQUssS0FBSyxJQUFJLENBQUE7QUFBQTtBQUNoQixLQUNELENBQUE7QUFHRCxJQUFPLE9BQUE7QUFBQSxNQUNMLElBQU0sRUFBQSxjQUFBLENBQWUsSUFBSyxDQUFBLElBQUEsQ0FBSyxjQUFjLENBQUE7QUFBQSxNQUM3QyxLQUFBLEVBQU8sQ0FBQyxNQUFxQixLQUFBO0FBQzNCLFFBQUEsSUFBQSxDQUFLLE1BQU0sTUFBTSxDQUFBO0FBQ2pCLFFBQUEsY0FBQSxDQUFlLFFBQVEsTUFBZSxDQUFBO0FBQUEsT0FDeEM7QUFBQSxNQUNBLE9BQUE7QUFBQTtBQUFBLE1BRUEsZUFBaUIsRUFBQTtBQUFBLEtBQ25CO0FBQUEsV0FFTyxLQUFPLEVBQUE7QUFDZCxJQUFBLElBQUksZUFBZSxPQUFTLEVBQUE7QUFDMUIsTUFBQSxjQUFBLENBQWUsTUFBTyxDQUFBLElBQUEsQ0FBSyxDQUFzQyxtQ0FBQSxFQUFBLEtBQUssQ0FBRSxDQUFBLENBQUE7QUFBQTtBQUUxRSxJQUFBLElBQUEsQ0FBSyxLQUFNLENBQUEsSUFBSSxLQUFNLENBQUEscUJBQXFCLENBQUMsQ0FBQTtBQUMzQyxJQUFBLElBQUksU0FBUyxJQUFNLEVBQUE7QUFDakIsTUFBTSxNQUFBLEtBQUE7QUFBQTtBQUVSLElBQU0sTUFBQSxJQUFJLE1BQU0sZ0NBQWdDLENBQUE7QUFBQTtBQUVwRDs7OzsifQ==