{"ScriptPreparationCode":"const rtjson = \u0060{\u0022document\u0022:[{\u0022c\u0022:[{\u0022e\u0022:\u0022text\u0022,\u0022t\u0022:\u0022At least enable markdown mode before copy pasting\u0022}],\u0022e\u0022:\u0022par\u0022},{\u0022c\u0022:[{\u0022e\u0022:\u0022raw\u0022,\u0022t\u0022:\u0022\\ud83c\\udfaf What\u0027s New in v0.0.14\u0022}],\u0022e\u0022:\u0022h\u0022,\u0022l\u0022:3},{\u0022c\u0022:[{\u0022e\u0022:\u0022text\u0022,\u0022f\u0022:[[1,0,31]],\u0022t\u0022:\u0022Desktop Experience Improvements\u0022}],\u0022e\u0022:\u0022par\u0022},{\u0022c\u0022:[{\u0022c\u0022:[{\u0022c\u0022:[{\u0022e\u0022:\u0022text\u0022,\u0022t\u0022:\u0022\\ud83d\\uddb1\\ufe0f Fixed: Mouse dragging no longer selects text\u0022}],\u0022e\u0022:\u0022par\u0022}],\u0022e\u0022:\u0022li\u0022},{\u0022c\u0022:[{\u0022c\u0022:[{\u0022e\u0022:\u0022text\u0022,\u0022t\u0022:\u0022\\u2728 Added: Drag preview - tiles follow your mouse during drag\u0022}],\u0022e\u0022:\u0022par\u0022}],\u0022e\u0022:\u0022li\u0022},{\u0022c\u0022:[{\u0022c\u0022:[{\u0022e\u0022:\u0022text\u0022,\u0022t\u0022:\u0022\\u26a1 Added: Quick swipe detection for faster response\u0022}],\u0022e\u0022:\u0022par\u0022}],\u0022e\u0022:\u0022li\u0022},{\u0022c\u0022:[{\u0022c\u0022:[{\u0022e\u0022:\u0022text\u0022,\u0022t\u0022:\u0022\\ud83c\\udfa8 Added: Professional cursor feedback (grab/grabbing)\u0022}],\u0022e\u0022:\u0022par\u0022}],\u0022e\u0022:\u0022li\u0022}],\u0022e\u0022:\u0022list\u0022,\u0022o\u0022:false},{\u0022c\u0022:[{\u0022e\u0022:\u0022text\u0022,\u0022f\u0022:[[1,0,23]],\u0022t\u0022:\u0022Layout \\u0026 Responsiveness\u0022}],\u0022e\u0022:\u0022par\u0022},{\u0022c\u0022:[{\u0022c\u0022:[{\u0022c\u0022:[{\u0022e\u0022:\u0022text\u0022,\u0022t\u0022:\u0022\\ud83d\\udcf1 Fixed: Desktop layout now fits all screen sizes (no overflow)\u0022}],\u0022e\u0022:\u0022par\u0022}],\u0022e\u0022:\u0022li\u0022},{\u0022c\u0022:[{\u0022c\u0022:[{\u0022e\u0022:\u0022text\u0022,\u0022t\u0022:\u0022\\ud83d\\udd27 Improved: Responsive game board sizing\u0022}],\u0022e\u0022:\u0022par\u0022}],\u0022e\u0022:\u0022li\u0022},{\u0022c\u0022:[{\u0022c\u0022:[{\u0022e\u0022:\u0022text\u0022,\u0022t\u0022:\u0022\\ud83d\\udc8e Optimized: Spacing and font sizes for better fit\u0022}],\u0022e\u0022:\u0022par\u0022}],\u0022e\u0022:\u0022li\u0022}],\u0022e\u0022:\u0022list\u0022,\u0022o\u0022:false},{\u0022c\u0022:[{\u0022e\u0022:\u0022text\u0022,\u0022f\u0022:[[1,0,9]],\u0022t\u0022:\u0022Technical\u0022}],\u0022e\u0022:\u0022par\u0022},{\u0022c\u0022:[{\u0022c\u0022:[{\u0022c\u0022:[{\u0022e\u0022:\u0022text\u0022,\u0022f\u0022:[[64,33,9],[64,43,9],[64,53,7]],\u0022t\u0022:\u0022\\ud83d\\ude80 Enhanced mouse event handling (mousedown/mousemove/mouseup)\u0022}],\u0022e\u0022:\u0022par\u0022}],\u0022e\u0022:\u0022li\u0022},{\u0022c\u0022:[{\u0022c\u0022:[{\u0022e\u0022:\u0022text\u0022,\u0022f\u0022:[[64,29,4],[64,52,4]],\u0022t\u0022:\u0022\\ud83c\\udfaf Smart threshold detection (15px for quick swipes, 30px for drags)\u0022}],\u0022e\u0022:\u0022par\u0022}],\u0022e\u0022:\u0022li\u0022},{\u0022c\u0022:[{\u0022c\u0022:[{\u0022e\u0022:\u0022text\u0022,\u0022t\u0022:\u0022\\ud83d\\udee1\\ufe0f Added CSS user-select prevention\u0022}],\u0022e\u0022:\u0022par\u0022}],\u0022e\u0022:\u0022li\u0022},{\u0022c\u0022:[{\u0022c\u0022:[{\u0022e\u0022:\u0022text\u0022,\u0022f\u0022:[[64,14,5],[64,24,7]],\u0022t\u0022:\u0022\\ud83d\\udcd0 Implemented min() and clamp() for responsive sizing\u0022}],\u0022e\u0022:\u0022par\u0022}],\u0022e\u0022:\u0022li\u0022}],\u0022e\u0022:\u0022list\u0022,\u0022o\u0022:false}]}\u0060;\r\n\r\n(() =\u003E {\r\n /**\r\n * Reddit RTJSON Renderer (ES Module)\r\n * * Optimized for performance over readability.\r\n */\r\n\r\n const F_TAGS = [\u0027strong\u0027, \u0027em\u0027, \u0027u\u0027, \u0027s\u0027, \u0027sub\u0027, \u0027sup\u0027, \u0027code\u0027];\r\n const F_MASKS = [1, 2, 4, 8, 16, 32, 64];\r\n\r\n /**\r\n * Handles text formatting by splitting strings into segments based on style ranges.\r\n */\r\n const formatText = (text, ranges) =\u003E {\r\n if (!ranges?.length) return document.createTextNode(text);\r\n\r\n const frag = document.createDocumentFragment();\r\n const pts = [0, text.length];\r\n for (let i = 0; i \u003C ranges.length; i\u002B\u002B) {\r\n const r = ranges[i];\r\n pts.push(r[1], r[1] \u002B r[2]);\r\n }\r\n pts.sort((a, b) =\u003E a - b);\r\n\r\n let last = -1;\r\n for (let i = 0; i \u003C pts.length - 1; i\u002B\u002B) {\r\n const s = pts[i],\r\n e = pts[i \u002B 1];\r\n if (s === e || s \u003E= text.length || s === last) continue;\r\n last = s;\r\n\r\n let mask = 0;\r\n for (let j = 0; j \u003C ranges.length; j\u002B\u002B) {\r\n const r = ranges[j];\r\n if (s \u003E= r[1] \u0026\u0026 e \u003C= r[1] \u002B r[2]) mask |= r[0];\r\n }\r\n\r\n let node = document.createTextNode(text.substring(s, e));\r\n if (mask) {\r\n for (let j = 0; j \u003C 7; j\u002B\u002B) {\r\n if (mask \u0026 F_MASKS[j]) {\r\n const wrapper = document.createElement(F_TAGS[j]);\r\n wrapper.appendChild(node);\r\n node = wrapper;\r\n }\r\n }\r\n }\r\n frag.appendChild(node);\r\n }\r\n return frag;\r\n };\r\n\r\n /**\r\n * Main renderer function.\r\n * @param {any[]} rtjson - Array of RTJSON document nodes.\r\n * @param {Record\u003Cstring, [string, any]\u003E} mediaAssets - Mapping of IDs to [tagName, data].\r\n */\r\n window.renderRTJSON_gemini = (rtjson, mediaAssets) =\u003E {\r\n const container = document.createElement(\u0027div\u0027);\r\n\r\n const walk = (nodes, parent) =\u003E {\r\n for (let i = 0; i \u003C nodes.length; i\u002B\u002B) {\r\n const n = nodes[i];\r\n const type = n.e;\r\n let el;\r\n\r\n switch (type) {\r\n case \u0027text\u0027:\r\n el = formatText(n.t, n.f);\r\n break;\r\n case \u0027raw\u0027:\r\n el = document.createTextNode(n.t);\r\n break;\r\n case \u0027br\u0027:\r\n el = document.createElement(\u0027br\u0027);\r\n break;\r\n case \u0027link\u0027:\r\n el = document.createElement(\u0027a\u0027);\r\n el.href = n.u;\r\n if (n.a) el.title = n.a;\r\n el.appendChild(n.f ? formatText(n.t, n.f) : document.createTextNode(n.t));\r\n break;\r\n case \u0027c/\u0027:\r\n case \u0027p/\u0027:\r\n el = document.createElement(\u0027a\u0027);\r\n el.href = n.t;\r\n el.textContent = n.t;\r\n break;\r\n case \u0027r/\u0027:\r\n case \u0027u/\u0027:\r\n case \u0027@\u0027:\r\n const prefix = type === \u0027@\u0027 ? \u0027u/\u0027 : type;\r\n el = document.createElement(\u0027a\u0027);\r\n el.href = \u0027/\u0027 \u002B prefix \u002B n.t;\r\n el.textContent = (n.l ? \u0027/\u0027 : \u0027\u0027) \u002B prefix \u002B n.t;\r\n break;\r\n case \u0027spoilertext\u0027:\r\n el = document.createElement(\u0027span\u0027);\r\n el.className = \u0027rt-spoiler\u0027;\r\n walk(n.c, el);\r\n break;\r\n case \u0027par\u0027:\r\n el = document.createElement(\u0027p\u0027);\r\n walk(n.c, el);\r\n break;\r\n case \u0027h\u0027:\r\n el = document.createElement(\u0027h\u0027 \u002B n.l);\r\n if (n.c) walk(n.c, el);\r\n break;\r\n case \u0027hr\u0027:\r\n el = document.createElement(\u0027hr\u0027);\r\n break;\r\n case \u0027blockquote\u0027:\r\n el = document.createElement(\u0027blockquote\u0027);\r\n if (n.a) {\r\n const cite = document.createElement(\u0027cite\u0027);\r\n walk([n.a], cite);\r\n el.appendChild(cite);\r\n }\r\n walk(n.c, el);\r\n break;\r\n case \u0027code\u0027:\r\n const pre = document.createElement(\u0027pre\u0027);\r\n el = document.createElement(\u0027code\u0027);\r\n if (n.l) el.className = \u0027lang-\u0027 \u002B n.l;\r\n walk(n.c, el);\r\n pre.appendChild(el);\r\n parent.appendChild(pre);\r\n el = null;\r\n break;\r\n case \u0027list\u0027:\r\n el = document.createElement(n.o ? \u0027ol\u0027 : \u0027ul\u0027);\r\n walk(n.c, el);\r\n break;\r\n case \u0027li\u0027:\r\n el = document.createElement(\u0027li\u0027);\r\n if (n.c) walk(n.c, el);\r\n break;\r\n case \u0027table\u0027:\r\n el = document.createElement(\u0027table\u0027);\r\n const thead = document.createElement(\u0027thead\u0027);\r\n const trh = document.createElement(\u0027tr\u0027);\r\n for (const cell of n.h) {\r\n const th = document.createElement(\u0027th\u0027);\r\n if (cell.a) th.style.textAlign = cell.a === \u0027L\u0027 ? \u0027left\u0027 : cell.a === \u0027R\u0027 ? \u0027right\u0027 : \u0027center\u0027;\r\n if (cell.c) walk(cell.c, th);\r\n trh.appendChild(th);\r\n }\r\n thead.appendChild(trh);\r\n el.appendChild(thead);\r\n const tbody = document.createElement(\u0027tbody\u0027);\r\n for (const row of n.c) {\r\n const tr = document.createElement(\u0027tr\u0027);\r\n for (const cell of row) {\r\n const td = document.createElement(\u0027td\u0027);\r\n if (cell.c) walk(cell.c, td);\r\n tr.appendChild(td);\r\n }\r\n tbody.appendChild(tr);\r\n }\r\n el.appendChild(tbody);\r\n break;\r\n case \u0027img\u0027:\r\n case \u0027gif\u0027:\r\n case \u0027video\u0027:\r\n const asset = mediaAssets[n.id];\r\n if (asset) {\r\n el = document.createElement(asset[0]);\r\n el.data = {\r\n ...asset[1],\r\n caption: n.c,\r\n obfuscated: n.o,\r\n poster: n.p,\r\n gifify: n.gifify\r\n };\r\n }\r\n break;\r\n case \u0027embed\u0027:\r\n el = document.createElement(\u0027iframe\u0027);\r\n el.src = n.c;\r\n el.width = n.x;\r\n el.height = n.y;\r\n break;\r\n }\r\n if (el) parent.appendChild(el);\r\n }\r\n };\r\n\r\n walk(rtjson, container);\r\n return container;\r\n };\r\n})();\r\n\r\n(() =\u003E {\r\n /**\r\n * Reddit RTJSON Renderer (Optimized ES Module)\r\n *\r\n * Optimizations:\r\n * - Sweep-line formatting algorithm (avoids O(n\u00B2) range scans)\r\n * - Specialized inline renderers\r\n * - Reduced recursion in hot paths\r\n * - Fewer allocations\r\n * - Fast-paths for common cases\r\n * - Schema-aware rendering\r\n */\r\n\r\n const F_TAGS = [\u0027strong\u0027, \u0027em\u0027, \u0027u\u0027, \u0027s\u0027, \u0027sub\u0027, \u0027sup\u0027, \u0027code\u0027];\r\n const F_MASKS = [1, 2, 4, 8, 16, 32, 64];\r\n\r\n const EMPTY = [];\r\n\r\n /* -------------------------------------------------------------------------- */\r\n /* Formatting */\r\n /* -------------------------------------------------------------------------- */\r\n\r\n const formatText = (text, ranges) =\u003E {\r\n if (!ranges || ranges.length === 0) {\r\n return document.createTextNode(text);\r\n }\r\n\r\n // Sweep-line event generation.\r\n const events = [];\r\n\r\n for (let i = 0; i \u003C ranges.length; i\u002B\u002B) {\r\n const r = ranges[i];\r\n const mask = r[0];\r\n const start = r[1];\r\n const end = start \u002B r[2];\r\n\r\n events.push([start, mask]);\r\n events.push([end, -mask]);\r\n }\r\n\r\n events.sort((a, b) =\u003E a[0] - b[0]);\r\n\r\n const frag = document.createDocumentFragment();\r\n\r\n let activeMask = 0;\r\n let pos = 0;\r\n\r\n for (let i = 0; i \u003C events.length; i\u002B\u002B) {\r\n const point = events[i][0];\r\n\r\n if (point \u003E pos) {\r\n let node = document.createTextNode(text.slice(pos, point));\r\n\r\n if (activeMask !== 0) {\r\n for (let j = 0; j \u003C 7; j\u002B\u002B) {\r\n if (activeMask \u0026 F_MASKS[j]) {\r\n const wrapper = document.createElement(F_TAGS[j]);\r\n wrapper.appendChild(node);\r\n node = wrapper;\r\n }\r\n }\r\n }\r\n\r\n frag.appendChild(node);\r\n }\r\n\r\n while (i \u003C events.length \u0026\u0026 events[i][0] === point) {\r\n const mask = events[i][1];\r\n\r\n if (mask \u003E 0) {\r\n activeMask |= mask;\r\n } else {\r\n activeMask \u0026= ~(-mask);\r\n }\r\n\r\n i\u002B\u002B;\r\n }\r\n\r\n i--;\r\n pos = point;\r\n }\r\n\r\n if (pos \u003C text.length) {\r\n let node = document.createTextNode(text.slice(pos));\r\n\r\n if (activeMask !== 0) {\r\n for (let j = 0; j \u003C 7; j\u002B\u002B) {\r\n if (activeMask \u0026 F_MASKS[j]) {\r\n const wrapper = document.createElement(F_TAGS[j]);\r\n wrapper.appendChild(node);\r\n node = wrapper;\r\n }\r\n }\r\n }\r\n\r\n frag.appendChild(node);\r\n }\r\n\r\n return frag;\r\n };\r\n\r\n /* -------------------------------------------------------------------------- */\r\n /* Inline Rendering */\r\n /* -------------------------------------------------------------------------- */\r\n\r\n const renderInline = (nodes, parent) =\u003E {\r\n for (let i = 0; i \u003C nodes.length; i\u002B\u002B) {\r\n const n = nodes[i];\r\n let el;\r\n\r\n switch (n.e) {\r\n case \u0027text\u0027:\r\n parent.appendChild(formatText(n.t, n.f));\r\n break;\r\n\r\n case \u0027raw\u0027:\r\n parent.appendChild(document.createTextNode(n.t));\r\n break;\r\n\r\n case \u0027br\u0027:\r\n parent.appendChild(document.createElement(\u0027br\u0027));\r\n break;\r\n\r\n case \u0027link\u0027:\r\n el = document.createElement(\u0027a\u0027);\r\n el.href = n.u;\r\n\r\n if (n.a) {\r\n el.title = n.a;\r\n }\r\n\r\n el.appendChild(\r\n n.f ?\r\n formatText(n.t, n.f) :\r\n document.createTextNode(n.t)\r\n );\r\n\r\n parent.appendChild(el);\r\n break;\r\n\r\n case \u0027c/\u0027:\r\n case \u0027p/\u0027:\r\n el = document.createElement(\u0027a\u0027);\r\n el.href = n.t;\r\n el.textContent = n.t;\r\n parent.appendChild(el);\r\n break;\r\n\r\n case \u0027r/\u0027:\r\n case \u0027u/\u0027:\r\n case \u0027@\u0027: {\r\n const prefix = n.e === \u0027@\u0027 ? \u0027u/\u0027 : n.e;\r\n\r\n el = document.createElement(\u0027a\u0027);\r\n el.href = \u0027/\u0027 \u002B prefix \u002B n.t;\r\n el.textContent = (n.l ? \u0027/\u0027 : \u0027\u0027) \u002B prefix \u002B n.t;\r\n\r\n parent.appendChild(el);\r\n break;\r\n }\r\n\r\n case \u0027spoilertext\u0027:\r\n el = document.createElement(\u0027span\u0027);\r\n el.className = \u0027rt-spoiler\u0027;\r\n\r\n renderInline(n.c, el);\r\n\r\n parent.appendChild(el);\r\n break;\r\n\r\n case \u0027img\u0027:\r\n case \u0027gif\u0027:\r\n // handled externally by block renderer\r\n break;\r\n }\r\n }\r\n };\r\n\r\n /* -------------------------------------------------------------------------- */\r\n /* Media */\r\n /* -------------------------------------------------------------------------- */\r\n\r\n const renderMedia = (n, mediaAssets) =\u003E {\r\n const asset = mediaAssets[n.id];\r\n\r\n if (!asset) return null;\r\n\r\n const el = document.createElement(asset[0]);\r\n\r\n // Avoid spread allocation.\r\n const data = Object.assign(Object.create(null), asset[1]);\r\n\r\n if (n.c !== undefined) data.caption = n.c;\r\n if (n.o !== undefined) data.obfuscated = n.o;\r\n if (n.p !== undefined) data.poster = n.p;\r\n if (n.gifify !== undefined) data.gifify = n.gifify;\r\n\r\n el.data = data;\r\n\r\n return el;\r\n };\r\n\r\n /* -------------------------------------------------------------------------- */\r\n /* Main Renderer */\r\n /* -------------------------------------------------------------------------- */\r\n\r\n window.renderRTJSON_chatgpt = (rtjson, mediaAssets) =\u003E {\r\n const container = document.createElement(\u0027div\u0027);\r\n\r\n const walk = (nodes, parent) =\u003E {\r\n for (let i = 0; i \u003C nodes.length; i\u002B\u002B) {\r\n const n = nodes[i];\r\n let el;\r\n\r\n switch (n.e) {\r\n /* ------------------------------------------------------------------ */\r\n /* Paragraphs */\r\n /* ------------------------------------------------------------------ */\r\n\r\n case \u0027par\u0027:\r\n el = document.createElement(\u0027p\u0027);\r\n renderInline(n.c, el);\r\n parent.appendChild(el);\r\n break;\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* Headings */\r\n /* ------------------------------------------------------------------ */\r\n\r\n case \u0027h\u0027:\r\n el = document.createElement(\u0027h\u0027 \u002B n.l);\r\n\r\n const hc = n.c || EMPTY;\r\n\r\n for (let j = 0; j \u003C hc.length; j\u002B\u002B) {\r\n const x = hc[j];\r\n\r\n switch (x.e) {\r\n case \u0027raw\u0027:\r\n el.appendChild(document.createTextNode(x.t));\r\n break;\r\n\r\n case \u0027link\u0027: {\r\n const a = document.createElement(\u0027a\u0027);\r\n a.href = x.u;\r\n a.textContent = x.t;\r\n\r\n if (x.a) {\r\n a.title = x.a;\r\n }\r\n\r\n el.appendChild(a);\r\n break;\r\n }\r\n\r\n case \u0027c/\u0027:\r\n case \u0027p/\u0027: {\r\n const a = document.createElement(\u0027a\u0027);\r\n a.href = x.t;\r\n a.textContent = x.t;\r\n el.appendChild(a);\r\n break;\r\n }\r\n\r\n case \u0027r/\u0027:\r\n case \u0027u/\u0027:\r\n case \u0027@\u0027: {\r\n const prefix = x.e === \u0027@\u0027 ? \u0027u/\u0027 : x.e;\r\n\r\n const a = document.createElement(\u0027a\u0027);\r\n a.href = \u0027/\u0027 \u002B prefix \u002B x.t;\r\n a.textContent =\r\n (x.l ? \u0027/\u0027 : \u0027\u0027) \u002B prefix \u002B x.t;\r\n\r\n el.appendChild(a);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n parent.appendChild(el);\r\n break;\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* Horizontal Rule */\r\n /* ------------------------------------------------------------------ */\r\n\r\n case \u0027hr\u0027:\r\n parent.appendChild(document.createElement(\u0027hr\u0027));\r\n break;\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* Blockquote */\r\n /* ------------------------------------------------------------------ */\r\n\r\n case \u0027blockquote\u0027:\r\n el = document.createElement(\u0027blockquote\u0027);\r\n\r\n // Spec: blockquotes should render italicized.\r\n el.style.fontStyle = \u0027italic\u0027;\r\n\r\n if (n.a) {\r\n const cite = document.createElement(\u0027cite\u0027);\r\n renderInline([n.a], cite);\r\n el.appendChild(cite);\r\n }\r\n\r\n walk(n.c, el);\r\n\r\n parent.appendChild(el);\r\n break;\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* Code Block */\r\n /* ------------------------------------------------------------------ */\r\n\r\n case \u0027code\u0027: {\r\n const pre = document.createElement(\u0027pre\u0027);\r\n const code = document.createElement(\u0027code\u0027);\r\n\r\n if (n.l) {\r\n code.className = \u0027lang-\u0027 \u002B n.l;\r\n }\r\n\r\n // Fast-path: RawText[] only.\r\n let text = \u0027\u0027;\r\n\r\n for (let j = 0; j \u003C n.c.length; j\u002B\u002B) {\r\n text \u002B= n.c[j].t;\r\n }\r\n\r\n code.textContent = text;\r\n\r\n pre.appendChild(code);\r\n parent.appendChild(pre);\r\n\r\n break;\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* Lists */\r\n /* ------------------------------------------------------------------ */\r\n\r\n case \u0027list\u0027:\r\n el = document.createElement(n.o ? \u0027ol\u0027 : \u0027ul\u0027);\r\n walk(n.c, el);\r\n parent.appendChild(el);\r\n break;\r\n\r\n case \u0027li\u0027:\r\n el = document.createElement(\u0027li\u0027);\r\n\r\n if (n.c) {\r\n walk(n.c, el);\r\n }\r\n\r\n parent.appendChild(el);\r\n break;\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* Tables */\r\n /* ------------------------------------------------------------------ */\r\n\r\n case \u0027table\u0027: {\r\n el = document.createElement(\u0027table\u0027);\r\n\r\n // THEAD\r\n const thead = document.createElement(\u0027thead\u0027);\r\n const trh = document.createElement(\u0027tr\u0027);\r\n\r\n for (let j = 0; j \u003C n.h.length; j\u002B\u002B) {\r\n const cell = n.h[j];\r\n\r\n const th = document.createElement(\u0027th\u0027);\r\n\r\n if (cell.a === \u0027L\u0027) {\r\n th.style.textAlign = \u0027left\u0027;\r\n } else if (cell.a === \u0027R\u0027) {\r\n th.style.textAlign = \u0027right\u0027;\r\n } else if (cell.a === \u0027C\u0027) {\r\n th.style.textAlign = \u0027center\u0027;\r\n }\r\n\r\n if (cell.c) {\r\n renderInline(cell.c, th);\r\n }\r\n\r\n trh.appendChild(th);\r\n }\r\n\r\n thead.appendChild(trh);\r\n el.appendChild(thead);\r\n\r\n // TBODY\r\n const tbody = document.createElement(\u0027tbody\u0027);\r\n\r\n for (let r = 0; r \u003C n.c.length; r\u002B\u002B) {\r\n const row = n.c[r];\r\n const tr = document.createElement(\u0027tr\u0027);\r\n\r\n for (let c = 0; c \u003C row.length; c\u002B\u002B) {\r\n const cell = row[c];\r\n\r\n const td = document.createElement(\u0027td\u0027);\r\n\r\n if (cell.c) {\r\n renderInline(cell.c, td);\r\n }\r\n\r\n tr.appendChild(td);\r\n }\r\n\r\n tbody.appendChild(tr);\r\n }\r\n\r\n el.appendChild(tbody);\r\n\r\n parent.appendChild(el);\r\n\r\n break;\r\n }\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* Media */\r\n /* ------------------------------------------------------------------ */\r\n\r\n case \u0027img\u0027:\r\n case \u0027gif\u0027:\r\n case \u0027video\u0027:\r\n el = renderMedia(n, mediaAssets);\r\n\r\n if (el) {\r\n parent.appendChild(el);\r\n }\r\n\r\n break;\r\n\r\n /* ------------------------------------------------------------------ */\r\n /* Embed */\r\n /* ------------------------------------------------------------------ */\r\n\r\n case \u0027embed\u0027:\r\n el = document.createElement(\u0027iframe\u0027);\r\n\r\n el.src = n.c;\r\n el.width = n.x;\r\n el.height = n.y;\r\n\r\n // Preserve source URL semantics.\r\n el.dataset.url = n.u;\r\n\r\n parent.appendChild(el);\r\n\r\n break;\r\n }\r\n }\r\n };\r\n\r\n walk(rtjson, container);\r\n\r\n return container;\r\n };\r\n})();","TestCases":[{"Name":"Gemini Thinking","Code":"renderRTJSON_gemini(JSON.parse(rtjson).document, {});","IsDeferred":false},{"Name":"ChatGPT","Code":"renderRTJSON_chatgpt(JSON.parse(rtjson).document, {});","IsDeferred":false}]}