From 48870c37bc90721e4ff2117ad6c5849b644979de Mon Sep 17 00:00:00 2001 From: Amp Date: Sat, 14 Nov 2026 17:52:25 +0000 Subject: [PATCH] feat(rust): the node packages' DOM parts, checked by property/documents' HTML and html/import-nodes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description With `html` on, the Rust port rendered and imported only the core nodes: every other node threw from `createDOM`, so `property/documents`' HTML couldn't be checked, and no import vector registered a node package. With `html` and a package's feature both on, its nodes now have `createDOM`, `exportDOM` and `importDOM`, ported from upstream: - `@lexical/rich-text`: `HeadingNode` (with the Google Docs title) and `QuoteNode`. - `@lexical/list`: `ListNode` and `ListItemNode`, with their theme class names, check lists, `HTMLOListElement.start`, the nested item's `after` and the GitHub, Joplin and Google Docs check list and alignment imports. - `@lexical/link`: `LinkNode` (with `sanitizeUrl`, whose `new URL` check follows Swift's model of the WHATWG parser) and `AutoLinkNode`. - `@lexical/code-core`: `CodeNode` (``, exported as `
`; the
  `pre`, multi-line `code`, monospace `div` and GitHub table importers)
  and `CodeHighlightNode`.
- `OverflowNode`, `HashtagNode`, `HorizontalRuleNode` and
  `DecoratorTextNode`, with `applyFormatFromStyle` and `applyFormatToDom`.

The `property/documents` suite now also checks `$generateHtmlFromNodes`.
A new JS-recorded vector, `html/import-nodes`, imports curated HTML for
those importers plus every `property/documents` HTML export with the
`property/documents` nodes and `HorizontalRuleNode`; the Rust and Swift
runners both replay it, and Swift already matched.

## Test plan

### Before

```
$ cargo run -q -p lexical-conformance --release -- property/documents
| `property/documents` (JSON and text) | 121 | 9 | 0 | 0 | 112 | **FAIL** |
- `property/documents`: seed 20261105 #1: html: Rust None, JS Some("
  • ...") ``` (with the HTML check added and the nodes' DOM parts not yet ported) ### After ``` $ cargo run -q -p lexical-conformance --release | `html/import-nodes` | 140 | 140 | 0 | 0 | 0 | pass | | `property/documents` (JSON, text and HTML) | 121 | 121 | 0 | 0 | 0 | pass | | **Total** | 3783 | 3783 | 0 | 0 | 0 | | $ swift test --skip-build --filter ConformanceTests.HTMLImportTests ✔ Test run with 3 tests in 1 suite passed after 0.067 seconds. $ npx vitest run src/html.test.ts # packages/lexical-conformance Tests 3 passed (3) ``` `cargo fmt --all --check`, `cargo clippy --workspace --all-targets --all-features --locked -- -D warnings`, `cargo test --workspace --all-features --locked`, `cargo doc` with `-D warnings`, and `cargo check -p lexical-editor --no-default-features` with each feature alone and with `html` are clean. Swift was run on Linux only. Amp-Thread-ID: https://ampcode.com/threads/T-506c8fa1-4309-40f1-9810-732b311eaeab --- packages/lexical-conformance/src/html.test.ts | 70 +++++ .../vectors/html/import-nodes.json | 142 ++++++++++ rust/DESIGN.md | 12 +- rust/PARITY.md | 42 ++- rust/conformance/src/suites/html.rs | 24 +- rust/conformance/src/suites/mod.rs | 7 +- rust/conformance/src/suites/property.rs | 15 +- rust/lexical-editor/Cargo.toml | 17 +- .../src/code/code_highlight_node.rs | 18 ++ rust/lexical-editor/src/code/code_node.rs | 181 ++++++++++++ .../src/extension/decorator_text_extension.rs | 90 ++++++ .../extension/horizontal_rule_extension.rs | 36 +++ rust/lexical-editor/src/extension/mod.rs | 4 + .../src/hashtag/lexical_hashtag_node.rs | 13 + rust/lexical-editor/src/lexical_dom.rs | 21 ++ rust/lexical-editor/src/link/link_node.rs | 216 ++++++++++++++ rust/lexical-editor/src/link/mod.rs | 2 + .../lexical-editor/src/list/list_item_node.rs | 263 ++++++++++++++++++ rust/lexical-editor/src/list/list_node.rs | 231 +++++++++++++++ rust/lexical-editor/src/overflow/mod.rs | 16 ++ rust/lexical-editor/src/rich_text.rs | 166 +++++++++++ .../ConformanceTests/HTMLImportTests.swift | 34 ++- 22 files changed, 1578 insertions(+), 42 deletions(-) create mode 100644 packages/lexical-conformance/vectors/html/import-nodes.json diff --git a/packages/lexical-conformance/src/html.test.ts b/packages/lexical-conformance/src/html.test.ts index e8ea5d2aca84..92eaae85646b 100644 --- a/packages/lexical-conformance/src/html.test.ts +++ b/packages/lexical-conformance/src/html.test.ts @@ -7,6 +7,7 @@ */ import type {JSDOM} from 'jsdom'; +import {HorizontalRuleNode} from '@lexical/extension'; import {createHeadlessEditor} from '@lexical/headless'; import {$generateHtmlFromNodes, $generateNodesFromDOM} from '@lexical/html'; import { @@ -25,6 +26,7 @@ import {readFileSync} from 'node:fs'; import {test} from 'vitest'; import {browserWindow} from './browserWindow'; +import {DOCUMENT_NODES} from './property'; import {emitVectors} from './vectors'; type Case = { @@ -265,3 +267,71 @@ test('html/import', () => { cases, ); }); + +/** HTML for the importers of the node packages (lists, rich text, links, code, the horizontal rule). */ +const NODES_IMPORT_CORPUS = [ + '
    • one
    • two
      • nested
    ', + '
    1. three
    2. seven
    ', + '
    1. a
    1. b
    ', + '
    • done
    • todo
    ', + '
    • gh
    • gh2
    ', + '
    • j
    ', + '
    • docs

    • r
    ', + '
    • a
    • loose
    • b
    ', + '

    one

    two

    three

    four

    five
    six
    ', + '

    Docs title

    ', + '
    quote
    more
    ', + '

    a

    b

    ', + '

    link bold

    ', + '
    const a = 1;\n\tb();
    ', + 'one linetwo\nlinesa
    b
    ', + '
    mono
    code
    child
    ', + '
    1line one
    2line two
    ', + '

    before


    after

    ', + '

    a


    b

    ', +]; + +test('html/import-nodes', () => { + const htmls = [ + ...NODES_IMPORT_CORPUS, + // Everything property/documents' HTML export writes must import too. + // That file comes from property.test.ts, so a `generate` that changes it + // needs a second run to bring this one up to date. + ...JSON.parse( + readFileSync( + new URL('../vectors/property/documents.json', import.meta.url), + 'utf8', + ), + ) + .cases.map((c: {html?: string | null}) => c.html) + .filter((html: unknown): html is string => typeof html === 'string'), + ]; + const cases: ImportCase[] = htmls.map(html => { + const editor = createHeadlessEditor({ + namespace: '', + nodes: [...DOCUMENT_NODES, HorizontalRuleNode], + onError: e => { + throw e; + }, + }); + let nodes = ''; + withJSDOM(win => { + const dom = new win.DOMParser().parseFromString(html, 'text/html'); + editor.update( + () => { + nodes = JSON.stringify( + $generateNodesFromDOM(editor, dom).map($nodeToJSON), + ); + }, + {discrete: true}, + ); + }); + return {html, nodes}; + }); + emitVectors( + 'html/import-nodes', + 'html-import', + 'HTML for the node packages (curated, plus every property/documents HTML export) and the nodes $generateNodesFromDOM makes from it in jsdom with the property/documents nodes and HorizontalRuleNode, each as exportJSON with its children.', + cases, + ); +}); diff --git a/packages/lexical-conformance/vectors/html/import-nodes.json b/packages/lexical-conformance/vectors/html/import-nodes.json new file mode 100644 index 000000000000..025ed98cb678 --- /dev/null +++ b/packages/lexical-conformance/vectors/html/import-nodes.json @@ -0,0 +1,142 @@ +{"description":"HTML for the node packages (curated, plus every property/documents HTML export) and the nodes $generateNodesFromDOM makes from it in jsdom with the property/documents nodes and HorizontalRuleNode, each as exportJSON with its children.","formatVersion":1,"kind":"html-import","cases":[ +{"html":"
    • one
    • two
      • nested
    ","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"one\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"two\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"nested\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"
    1. three
    2. seven
    ","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"three\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"seven\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":3,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"
    1. a
    1. b
    ","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":-2,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"b\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":1,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"
    • done
    • todo
    ","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"done\",\"type\":\"text\",\"version\":1}],\"checked\":true,\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"todo\",\"type\":\"text\",\"version\":1}],\"checked\":false,\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"check\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"
    • gh
    • gh2
    ","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"gh\",\"type\":\"text\",\"version\":1}],\"checked\":true,\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"gh2\",\"type\":\"text\",\"version\":1}],\"checked\":false,\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"check\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"
    • j
    ","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"j\",\"type\":\"text\",\"version\":1}],\"checked\":true,\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"check\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"
    • docs

    • r
    ","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"docs\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"center\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"r\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"right\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"
    • a
    • loose
    • b
    ","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"loose\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"b\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"

    one

    two

    three

    four

    five
    six
    ","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"one\",\"type\":\"text\",\"version\":1}],\"tag\":\"h1\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"two\",\"type\":\"text\",\"version\":1}],\"tag\":\"h2\",\"direction\":null,\"format\":\"center\",\"indent\":0,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"three\",\"type\":\"text\",\"version\":1}],\"tag\":\"h3\",\"direction\":\"rtl\",\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"four\",\"type\":\"text\",\"version\":1}],\"tag\":\"h4\",\"direction\":null,\"format\":\"\",\"indent\":2,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"five\",\"type\":\"text\",\"version\":1}],\"tag\":\"h5\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"six\",\"type\":\"text\",\"version\":1}],\"tag\":\"h6\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1}]"}, +{"html":"

    Docs title

    ","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Docs title\",\"type\":\"text\",\"version\":1}],\"tag\":\"h1\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1}]"}, +{"html":"
    quote
    more
    ","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"quote\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"more\",\"type\":\"text\",\"version\":1}],\"direction\":\"ltr\",\"format\":\"right\",\"indent\":0,\"type\":\"quote\",\"version\":1}]"}, +{"html":"

    a

    b

    ","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"b\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"quote\",\"version\":1}]"}, +{"html":"

    link bold

    ","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"link\",\"type\":\"text\",\"version\":1}],\"rel\":\"noopener\",\"target\":\"_blank\",\"title\":\"t\",\"url\":\"https://example.com\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" \",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"bold\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":null,\"title\":null,\"url\":\"#y\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"
    const a = 1;\n\tb();
    ","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"const a = 1;\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"b();\",\"type\":\"text\",\"version\":1}],\"language\":\"js\",\"theme\":\"dark\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1}]"}, +{"html":"one linetwo\nlinesa
    b
    ","nodes":"[{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\"one line\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"two lines\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"b\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1}]"}, +{"html":"
    mono
    code
    child
    ","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"mono\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"code\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"child\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1}]"}, +{"html":"
    1line one
    2line two
    ","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"1\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"line one\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"2\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"line two\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1}]"}, +{"html":"

    before


    after

    ","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"before\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"type\":\"horizontalrule\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"after\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

    a


    b

    ","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"type\":\"horizontalrule\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"b\",\"type\":\"text\",\"version\":1},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"


    ","nodes":"[{\"children\":[],\"direction\":\"rtl\",\"format\":\"right\",\"indent\":35,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"
    ","nodes":"[{\"children\":[{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"start\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":\"ltr\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"

    a9R$eE


    \t

    _a

    ","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a9R$eE\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"start\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[],\"language\":\"ihY\",\"theme\":\"n>J\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"direction\":\"ltr\",\"format\":\"\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":256,\"mode\":\"normal\",\"style\":\"\",\"text\":\"_\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1}],\"rel\":\"(T])Lx8C}\",\"target\":null,\"title\":null,\"url\":\"#O8O^\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"center\",\"indent\":2147483647,\"textFormat\":256,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

    \t

    ","nodes":"[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"tag\":\"h3\",\"direction\":\"ltr\",\"format\":\"\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"
    1. ~~Ld;b
    2. ộꛇ

    ","nodes":"[{\"children\":[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~~\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":\"?#V\",\"title\":\"X1cO\",\"url\":\"https://A\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Ld;b\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"end\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ộꛇ\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"right\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"left\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1}],\"tag\":\"h6\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1}]"}, +{"html":"

    ","nodes":"[{\"children\":[],\"direction\":\"ltr\",\"format\":\"left\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1}]"}, +{"html":"
    1. <Q~d#
    2. :_HwnⰨモꘝ

    \t*hyy(&6

    ","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":256,\"mode\":\"normal\",\"style\":\"\",\"text\":\"<b>𝜦

        1. 𝘶.
        2. ⠄𑱐ⸯ
    1. :
    2. <b>&amp;(


    ","nodes":"[{\"children\":[{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\"\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":9,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𝜦\",\"type\":\"text\",\"version\":1}],\"rel\":\"5W\",\"target\":\"-zL~r=\",\"title\":null,\"url\":\"https://Fp0D\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"\",\"indent\":2147483647,\"textFormat\":16,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"detail\":0,\"format\":24,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𝘶\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":12,\"mode\":\"normal\",\"style\":\"\",\"text\":\".\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"end\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":1024,\"mode\":\"normal\",\"style\":\"\",\"text\":\"⠄𑱐ⸯ\",\"type\":\"text\",\"version\":1}],\"rel\":\"~%m1V\",\"target\":\"O.M9.je\",\"title\":null,\"url\":\"https://\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"left\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":1,\"tag\":\"ol\",\"direction\":null,\"format\":\"left\",\"indent\":0,\"type\":\"list\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"left\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":1,\"tag\":\"ol\",\"direction\":null,\"format\":\"end\",\"indent\":0,\"type\":\"list\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"end\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\":\",\"type\":\"text\",\"version\":1}],\"rel\":\"j~RQZ`\",\"target\":null,\"title\":\"`N\\\"7Yk3EZ\",\"url\":\"https://\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"left\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"&\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":10,\"mode\":\"normal\",\"style\":\"\",\"text\":\"(\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[],\"direction\":\"ltr\",\"format\":\"left\",\"indent\":18,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"
    1. ꤞ\t\t
    2. ؆ไ𐃮ᡭ
    3. \t
    https://example.com\t\n

    *

    V\\I8}!

    ","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ꤞ\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":8,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"left\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"؆ไ𐃮ᡭ\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"center\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"left\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":\"rtl\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\"https://example.com\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":null,\"title\":\"*?y\",\"url\":\"https://lYC#u8$+r*\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":129,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"type\":\"linebreak\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"end\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"*\",\"type\":\"text\",\"version\":1}],\"tag\":\"h1\",\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"V\\\\I8}!\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"left\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

    1. \te
    2. o2R`psrXZo<b>


    ","nodes":"[{\"children\":[{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":8,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":4,\"mode\":\"normal\",\"style\":\"\",\"text\":\"e\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"start\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"o2R`ps\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"rXZo\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":\":noATy\",\"title\":\"w$%XM<9;*s6Ib c
","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"*\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"s\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"6I\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"b c\",\"type\":\"text\",\"version\":1}],\"language\":\";>.2\\\\=`\",\"theme\":\"4TxSFL=^! \",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1}]"}, +{"html":"

\t)WGw3<b>

P:M5!\t

","nodes":"[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":16,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\")WGw3\",\"type\":\"text\",\"version\":1}],\"rel\":\"\\\"aMGf\",\"target\":null,\"title\":null,\"url\":\"https://\\\\rak\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"\",\"type\":\"text\",\"version\":1}],\"tag\":\"h3\",\"direction\":\"rtl\",\"format\":\"\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":32,\"mode\":\"normal\",\"style\":\"\",\"text\":\"P:M5!\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"left\",\"indent\":2147483647,\"textFormat\":32,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

𞢩𝡺𘲿&amp;

|7G9Zgg>~~\tb

\tk7


","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𞢩𝡺𘲿\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":128,\"mode\":\"normal\",\"style\":\"\",\"text\":\"&\",\"type\":\"text\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"left\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"|7G9Zgg>\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~~\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"b\",\"type\":\"text\",\"version\":1}],\"tag\":\"h1\",\"direction\":\"rtl\",\"format\":\"start\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\"k7 \",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"start\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"start\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1},{\"children\":[],\"direction\":null,\"format\":\"center\",\"indent\":0,\"type\":\"quote\",\"version\":1}]"}, +{"html":"

#~yT3

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"#~yT3\",\"type\":\"text\",\"version\":1}],\"tag\":\"h2\",\"direction\":\"rtl\",\"format\":\"end\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1}]"}, +{"html":"


EZips6R*\t

","nodes":"[{\"children\":[],\"tag\":\"h1\",\"direction\":\"rtl\",\"format\":\"justify\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"EZips6R*\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"tag\":\"h1\",\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1}]"}, +{"html":"

~~😀A;gfuJbO


^gD:g'])

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~~\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"😀\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"A;gfuJbO\",\"type\":\"text\",\"version\":1}],\"rel\":\"n!5\",\"target\":\"4Z\\\"T.c&63\",\"title\":\"[Kkn;_ox\",\"url\":\"https://,B z<\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"^gD:g'])\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" \",\"type\":\"text\",\"version\":1}],\"rel\":\"e&V\",\"target\":\")K@>wHcts\",\"title\":\"Y94\",\"url\":\"https://iO*?x/%\\\"t\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"direction\":null,\"format\":\"left\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}],\"direction\":null,\"format\":\"left\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1}]"}, +{"html":"




    1. 😀
    2. ~~}8@`$^kR>BVpQn
","nodes":"[{\"children\":[],\"direction\":\"ltr\",\"format\":\"center\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"start\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"type\":\"linebreak\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"center\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"😀\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"justify\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~~\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":256,\"mode\":\"normal\",\"style\":\"\",\"text\":\"}8@`$^\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":32,\"mode\":\"normal\",\"style\":\"\",\"text\":\"kR>BVp\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Qn\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"right\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"right\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":\"ltr\",\"format\":\"center\",\"indent\":0,\"type\":\"list\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"
","nodes":"[{\"children\":[{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"left\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"justify\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":\"ltr\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"




\t

D<}dH_/n0a

","nodes":"[{\"children\":[],\"direction\":null,\"format\":\"left\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":64,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"tag\":\"h5\",\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":32,\"mode\":\"normal\",\"style\":\"\",\"text\":\"D\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"<}dH_/n0\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":64,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":null,\"title\":\"elkf\",\"url\":\"https://CTxlo[\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"direction\":null,\"format\":\"justify\",\"indent\":0,\"textFormat\":32,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}],\"direction\":null,\"format\":\"justify\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1}]"}, +{"html":"

H.




","nodes":"[{\"children\":[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"H\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":\"=~$3gjA\",\"title\":\"xnvc?,\",\"url\":\"https://8'oV7.]P\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\".\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"left\",\"indent\":0,\"textFormat\":2,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"left\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":8,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

\\\\I!tG


","nodes":"[{\"children\":[{\"detail\":0,\"format\":32,\"mode\":\"normal\",\"style\":\"\",\"text\":\"\\\\\\\\I!tG\",\"type\":\"text\",\"version\":1}],\"tag\":\"h2\",\"direction\":\"rtl\",\"format\":\"start\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[],\"direction\":null,\"format\":\"justify\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"
  1. Bn.)
    //_!fbFY
  2. <b>
  • \n⑧Ĝ𛰤🍛
  • \n
","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Bn.)\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"//_!fbFY\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"left\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"justify\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"start\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"⑧Ĝ𛰤🍛\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"right\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"justify\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":\"ltr\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"

\t

","nodes":"[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":65,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"tag\":\"h1\",\"direction\":null,\"format\":\"right\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1}]"}, +{"html":"
A;Y~ze`


","nodes":"[{\"children\":[{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"A;Y~ze`\",\"type\":\"text\",\"version\":1},{\"children\":[],\"rel\":null,\"target\":\"AU7WqQ}e\",\"title\":\"AO1(t\",\"url\":\"https://\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"type\":\"linebreak\",\"version\":1}],\"tag\":\"h5\",\"direction\":null,\"format\":\"right\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" \",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}],\"direction\":\"ltr\",\"format\":\"\",\"indent\":0,\"type\":\"quote\",\"version\":1}]"}, +{"html":"

    1. RK𐒱😀
    2. \t

7t5b c頋𓈝𘥥

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" \",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"start\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"R\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"K\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":256,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𐒱\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":512,\"mode\":\"normal\",\"style\":\"\",\"text\":\"😀\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"end\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":9,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"justify\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"left\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":\"rtl\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":65,\"mode\":\"normal\",\"style\":\"\",\"text\":\"7t5\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":129,\"mode\":\"normal\",\"style\":\"\",\"text\":\"b c\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"頋𓈝𘥥\",\"type\":\"text\",\"version\":1}],\"rel\":\"K*Y⣥ừk\t


","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"⣥ừ\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":null,\"title\":\"~=L\",\"url\":\"https://A Ct*`/u7]\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"k\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":512,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"tag\":\"h2\",\"direction\":null,\"format\":\"start\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[],\"direction\":\"rtl\",\"format\":\"center\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"
    1. wbS**~~
","nodes":"[{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"detail\":0,\"format\":64,\"mode\":\"normal\",\"style\":\"\",\"text\":\"wbS\",\"type\":\"text\",\"version\":1}],\"rel\":\"=1\",\"target\":\"Q0\\\"vL,pY\",\"title\":\"a6,'BA+vG`\",\"url\":\"https://\\\\\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"**\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~~\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":null,\"format\":\"justify\",\"indent\":0,\"type\":\"list\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"justify\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"


    1. ~~
6)

\t

","nodes":"[{\"children\":[],\"tag\":\"h1\",\"direction\":\"ltr\",\"format\":\"justify\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"detail\":0,\"format\":4,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~~\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":\"rtl\",\"format\":\"center\",\"indent\":0,\"type\":\"list\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"center\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"6)\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"right\",\"indent\":12,\"type\":\"quote\",\"version\":1},{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":1,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"tag\":\"h1\",\"direction\":\"rtl\",\"format\":\"start\",\"indent\":0,\"type\":\"heading\",\"version\":1}]"}, +{"html":"

\t


😀\t


\t\t
","nodes":"[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":8,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"tag\":\"h3\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1},{\"children\":[],\"tag\":\"h2\",\"direction\":\"ltr\",\"format\":\"end\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":64,\"mode\":\"normal\",\"style\":\"\",\"text\":\"😀\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"textFormat\":64,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1}]"}, +{"html":"


a

諒𖾘𝠊ꛮ
_P? 23
","nodes":"[{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":21,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1}],\"direction\":\"ltr\",\"format\":\"end\",\"indent\":2147483647,\"textFormat\":21,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"諒𖾘𝠊ꛮ\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"_\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"P? 23\",\"type\":\"text\",\"version\":1}],\"theme\":\"~\\\\!$4.F$n\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1}]"}, +{"html":"

🝢ꀍᣪꁥ

éh9C%
a

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"🝢ꀍᣪꁥ\",\"type\":\"text\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"center\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"é\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":32,\"mode\":\"normal\",\"style\":\"\",\"text\":\"h9C%\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":\"3m,V&\",\"title\":null,\"url\":\"https://\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"left\",\"indent\":2147483647,\"textFormat\":8,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"


  • **
","nodes":"[{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[],\"tag\":\"h4\",\"direction\":null,\"format\":\"start\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":13,\"mode\":\"normal\",\"style\":\"\",\"text\":\"**\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"

é\t𘤸

  • ]A. https://example.com
  • é


  • '9Bu


z<= [{|<_O_

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"é\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":9,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𘤸\",\"type\":\"text\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"]A.\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":32,\"mode\":\"normal\",\"style\":\"\",\"text\":\" \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\"https://example.com\",\"type\":\"text\",\"version\":1}],\"checked\":false,\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":257,\"mode\":\"normal\",\"style\":\"\",\"text\":\"é\",\"type\":\"text\",\"version\":1}],\"checked\":false,\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"justify\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"'9Bu\",\"type\":\"text\",\"version\":1}],\"checked\":false,\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"justify\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"check\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[],\"direction\":\"rtl\",\"format\":\"end\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"z<= [\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":128,\"mode\":\"normal\",\"style\":\"\",\"text\":\"{|<_O\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"_\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

%5~mTa


r,a-


","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"%5~m\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"T\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1}],\"direction\":\"ltr\",\"format\":\"left\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[],\"direction\":null,\"format\":\"right\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"r,a-\",\"type\":\"text\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"left\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[],\"tag\":\"h6\",\"direction\":null,\"format\":\"center\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1}]"}, +{"html":"

**,CUu^!`D

M\"S+

0MHXh^aEXXM+aBj:

NTm

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"**\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\",CUu^!`D\",\"type\":\"text\",\"version\":1}],\"rel\":\"#lh\",\"target\":\"hS/Y;@.[\",\"title\":null,\"url\":\"https://pu\\\"\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"direction\":null,\"format\":\"right\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"M\\\"S+\",\"type\":\"text\",\"version\":1}],\"tag\":\"h4\",\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":32,\"mode\":\"normal\",\"style\":\"\",\"text\":\"0MHXh^aE\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":32,\"mode\":\"normal\",\"style\":\"\",\"text\":\"XXM+aBj:\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"start\",\"indent\":0,\"textFormat\":32,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}],\"direction\":null,\"format\":\"start\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"NTm\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"end\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"


ﱌ
","nodes":"[{\"children\":[],\"direction\":\"rtl\",\"format\":\"end\",\"indent\":41,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ﱌ\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"left\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1}]"}, +{"html":"
","nodes":"[{\"children\":[{\"children\":[],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"justify\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"

'P}Ik

\t
\té


\t

aZ?g7Dy5y

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"'P}\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Ik\",\"type\":\"text\",\"version\":1}],\"direction\":\"ltr\",\"format\":\"center\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":256,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":8,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":72,\"mode\":\"normal\",\"style\":\"\",\"text\":\"é\",\"type\":\"text\",\"version\":1}],\"tag\":\"h3\",\"direction\":null,\"format\":\"center\",\"indent\":0,\"type\":\"heading\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"tag\":\"h1\",\"direction\":null,\"format\":\"start\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":64,\"mode\":\"normal\",\"style\":\"\",\"text\":\"aZ?\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"g7Dy5y\",\"type\":\"text\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"right\",\"indent\":2147483647,\"textFormat\":64,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

éjO*H&

","nodes":"[{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"é\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"jO\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"*H&\",\"type\":\"text\",\"version\":1}],\"rel\":\"js|fPX~\",\"target\":null,\"title\":null,\"url\":\"https://\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"start\",\"indent\":2147483647,\"textFormat\":1,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"



","nodes":"[{\"children\":[],\"direction\":\"rtl\",\"format\":\"center\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[],\"tag\":\"h2\",\"direction\":\"ltr\",\"format\":\"left\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1}]"}, +{"html":"

]`NYhtOff9@{T(M#

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"]`NYhtO\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ff9@{T\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"(M#\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":130,\"mode\":\"normal\",\"style\":\"\",\"text\":\" \",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"left\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"
  1. 𐌒𝖃𐤳e{le2MSG82+r+=B
","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𐌒𝖃𐤳\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":256,\"mode\":\"normal\",\"style\":\"\",\"text\":\"e{le2MS\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":\"*v\",\"title\":\"g>Lod\",\"url\":\"https://7G35^{Y[wq\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\"G82+r\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"+=B\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"end\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"left\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":\"ltr\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"

+b)pR;#o

\t\t

","nodes":"[{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"+b)pR;#o\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"start\",\"indent\":0,\"textFormat\":1,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"type\":\"linebreak\",\"version\":1}],\"language\":\"9Kta!&s\",\"theme\":\"5\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1}]"}, +{"html":"

`c(ysA

","nodes":"[{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"`\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":9,\"mode\":\"normal\",\"style\":\"\",\"text\":\"c(ysA\",\"type\":\"text\",\"version\":1}],\"tag\":\"h1\",\"direction\":\"rtl\",\"format\":\"\",\"indent\":25,\"type\":\"heading\",\"version\":1}]"}, +{"html":"


","nodes":"[{\"children\":[{\"type\":\"linebreak\",\"version\":1}],\"theme\":\"T8x%{aCf5`\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1}]"}, +{"html":"




`&amp;aQ[xe1gH

","nodes":"[{\"children\":[],\"direction\":null,\"format\":\"left\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1}],\"direction\":null,\"format\":\"justify\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"`\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":\"#|Ye#e6G\",\"title\":\"O7V=7:X0;\",\"url\":\"https://`V:A\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"&\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":256,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Q[xe1gH\",\"type\":\"text\",\"version\":1}],\"rel\":\"Y\\\"qj|l#br\",\"target\":null,\"title\":null,\"url\":\"https:// 5C_1B9~e&\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"center\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"
nz\\u<~~_ⓜ🡴𑈁


\t𐺁𑫨䗗~[HI'}😀


𖼊꒓𐼣𐳻'x`1MkF

","nodes":"[{\"children\":[{\"detail\":0,\"format\":512,\"mode\":\"normal\",\"style\":\"\",\"text\":\"nz\\\\u<\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~~\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"_\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1024,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ⓜ🡴𑈁\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":null,\"title\":\"a1;tG2n| \",\"url\":\"https://%DcFnD>6\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1},{\"children\":[],\"direction\":null,\"format\":\"justify\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":8,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𐺁𑫨䗗\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~[HI'}\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":136,\"mode\":\"normal\",\"style\":\"\",\"text\":\"😀\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"center\",\"indent\":0,\"textFormat\":8,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}],\"direction\":null,\"format\":\"center\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𖼊꒓𐼣𐳻\",\"type\":\"text\",\"version\":1}],\"rel\":\"M7qMT9\",\"target\":\"dXn;*E3\",\"title\":null,\"url\":\"https://\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":256,\"mode\":\"normal\",\"style\":\"\",\"text\":\"'x`1MkF\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"justify\",\"indent\":2147483647,\"textFormat\":256,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"
**

ꩫ🍯


","nodes":"[{\"children\":[{\"detail\":0,\"format\":512,\"mode\":\"normal\",\"style\":\"\",\"text\":\"**\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1}],\"tag\":\"h5\",\"direction\":\"ltr\",\"format\":\"left\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ꩫ🍯\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[],\"tag\":\"h2\",\"direction\":null,\"format\":\"justify\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1}]"}, +{"html":"

ï'h$6w46:

","nodes":"[{\"children\":[{\"children\":[{\"children\":[{\"children\":[],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":\"rtl\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ï\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"'h$6w46:\",\"type\":\"text\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"left\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

\t


","nodes":"[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":32,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"direction\":null,\"format\":\"justify\",\"indent\":2147483647,\"textFormat\":32,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[],\"language\":\"%690\",\"theme\":\"e+S\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[],\"tag\":\"h4\",\"direction\":\"ltr\",\"format\":\"start\",\"indent\":37,\"type\":\"heading\",\"version\":1}]"}, +{"html":"

~SbpJSh7a



~~

","nodes":"[{\"children\":[{\"detail\":0,\"format\":128,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~Sb\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\"pJSh7\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"start\",\"indent\":0,\"textFormat\":128,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~~\",\"type\":\"text\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"right\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"
RSpb9
_\t

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"RSpb9\",\"type\":\"text\",\"version\":1}],\"theme\":\"{BGge~\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"_\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[],\"direction\":\"rtl\",\"format\":\"right\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1}]"}, +{"html":"
    1. പۓ𛀴0B
    2. p
  1. b c𐐍🜤>I2B0G-<0O#

**

","nodes":"[{\"children\":[{\"children\":[{\"children\":[{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"left\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"പۓ𛀴\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"0B\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"start\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"p\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"center\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":1,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":256,\"mode\":\"normal\",\"style\":\"\",\"text\":\"b c\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𐐍🜤\",\"type\":\"text\",\"version\":1}],\"rel\":\"[_Q^\",\"target\":null,\"title\":\"uwMY*MNH\",\"url\":\"https://\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\">I2\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"B0G-<0O#\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"start\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"**\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

\t0T\t


","nodes":"[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":64,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":32,\"mode\":\"normal\",\"style\":\"\",\"text\":\"0T\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":4,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"\",\"indent\":2147483647,\"textFormat\":64,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

\t*]|&QVa

","nodes":"[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":256,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":256,\"mode\":\"normal\",\"style\":\"\",\"text\":\"*]|&QVa\",\"type\":\"text\",\"version\":1}],\"tag\":\"h1\",\"direction\":\"rtl\",\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1}]"}, +{"html":"

https://example.com

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"https://example.com\",\"type\":\"text\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"right\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"
  1. IA<MwA⡅𒾢
    • 😀

    • aZ

~~

𐽶𑢬𒂱-H/\\#

","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"IA


","nodes":"[{\"children\":[],\"direction\":\"rtl\",\"format\":\"end\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[],\"tag\":\"h6\",\"direction\":\"rtl\",\"format\":\"\",\"indent\":2,\"type\":\"heading\",\"version\":1},{\"children\":[],\"tag\":\"h1\",\"direction\":\"rtl\",\"format\":\"justify\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1}]"}, +{"html":"

➬𒾧Ἄ𝧍b c

","nodes":"[{\"children\":[{\"children\":[],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"right\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":\"ltr\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"➬𒾧Ἄ𝧍\",\"type\":\"text\",\"version\":1},{\"children\":[],\"rel\":\"Z'\",\"target\":\" p]%wZw\",\"title\":\"hsNvj\",\"url\":\"https://_xn=+uI\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":1024,\"mode\":\"normal\",\"style\":\"\",\"text\":\"b c\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"\",\"indent\":0,\"type\":\"quote\",\"version\":1}]"}, +{"html":"



&amp;ꓥ菧
","nodes":"[{\"children\":[{\"type\":\"linebreak\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"justify\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":9,\"mode\":\"normal\",\"style\":\"\",\"text\":\"&\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ꓥ菧\",\"type\":\"text\",\"version\":1}],\"language\":\"q;4Dqe\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1}]"}, +{"html":"


","nodes":"[{\"children\":[],\"direction\":\"ltr\",\"format\":\"\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

😀

/ix~/4*

\t~M'Z$7)S=J2_*KxN

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"😀\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"/ix~/4*\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~M'Z$7)S\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":4,\"mode\":\"normal\",\"style\":\"\",\"text\":\"=J2_*KxN\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1}]"}, +{"html":"

~~𝅌𛀁eaa|B

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~~\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𝅌𛀁\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":4,\"mode\":\"normal\",\"style\":\"\",\"text\":\"eaa|B\",\"type\":\"text\",\"version\":1}],\"tag\":\"h3\",\"direction\":null,\"format\":\"start\",\"indent\":0,\"type\":\"heading\",\"version\":1}]"}, +{"html":"

\t

[I[MqV~~

","nodes":"[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":128,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"direction\":\"ltr\",\"format\":\"\",\"indent\":2147483647,\"textFormat\":128,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"[I[Mq\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":128,\"mode\":\"normal\",\"style\":\"\",\"text\":\"V\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":null,\"title\":\"[{@B\",\"url\":\"https://\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~~\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[],\"language\":\"URVE[2:!45\",\"theme\":\"l [5t\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1}]"},
+{"html":"
  • R74l
  1. ⭃😤\t&amp;
  2. m@E&B0\n*


","nodes":"[{\"children\":[{\"children\":[],\"checked\":false,\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"center\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"checked\":false,\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"start\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"R74l\",\"type\":\"text\",\"version\":1}],\"checked\":true,\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"start\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"check\",\"start\":1,\"tag\":\"ul\",\"direction\":\"rtl\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"⭃😤\",\"type\":\"text\",\"version\":1}],\"rel\":\"b71Ij\",\"target\":\"r=C\",\"title\":\"y;$H\",\"url\":\"https://081k'\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"&\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"right\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"m@E&B0\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"*\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"right\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[],\"direction\":\"rtl\",\"format\":\"end\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"
ro50⭗𖧫

𞣊𐍑㎻\t

  • \n
  • 2GAP@3𒃀ꈑȐ𑨎
  • 𒅄\t

_

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ro50\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"⭗𖧫\",\"type\":\"text\",\"version\":1}],\"direction\":\"ltr\",\"format\":\"\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𞣊𐍑㎻\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":2,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"tag\":\"h2\",\"direction\":null,\"format\":\"left\",\"indent\":27,\"type\":\"heading\",\"version\":1},{\"children\":[{\"children\":[{\"type\":\"linebreak\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"end\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"2GAP@3\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𒃀ꈑȐ𑨎\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"right\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𒅄\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"left\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":513,\"mode\":\"normal\",\"style\":\"\",\"text\":\"_\",\"type\":\"text\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"\",\"indent\":2147483647,\"textFormat\":513,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

#😀

\n \t

zA:E

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"#\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":24,\"mode\":\"normal\",\"style\":\"\",\"text\":\"😀\",\"type\":\"text\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"right\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" \",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"center\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":64,\"mode\":\"normal\",\"style\":\"\",\"text\":\"zA:E\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"left\",\"indent\":15,\"textFormat\":64,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

https://example.com

z$sFdp`


  1. \t
  2. \ta😀amNH96
  3. *!% 7ra%`J'
  4. \tj!3>(SY⾩ePpu47,|
","nodes":"[{\"children\":[{\"detail\":0,\"format\":32,\"mode\":\"normal\",\"style\":\"\",\"text\":\"https://example.com\",\"type\":\"text\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"left\",\"indent\":2147483647,\"textFormat\":32,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"z$sFdp\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"`\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1},{\"children\":[{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":264,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"😀\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"amNH96\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"end\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\"*\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"!% 7ra%`\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\"J'\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"right\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":1024,\"mode\":\"normal\",\"style\":\"\",\"text\":\"j!3>(SY\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"⾩\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ePpu47,|\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":null,\"title\":null,\"url\":\"https://:Q$i\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" \",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"right\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"
  • \t
  • \t

ᤝ𔒧

\tJ$Vzt;\\b c
","nodes":"[{\"children\":[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"children\":[],\"rel\":null,\"target\":null,\"title\":\"~{Fe-\",\"target\":\"H\",\"title\":null,\"url\":\"https://\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"b c\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"center\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1}]"}, +{"html":"

𑈞꠵https://example.com`>>?f=P'$\t

 ➛𐀖\t

KjUqL

","nodes":"[{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𑈞꠵\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"https://example.com\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"`>>?f=P\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"'$\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":256,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"direction\":\"ltr\",\"format\":\"\",\"indent\":2147483647,\"textFormat\":1,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"➛𐀖\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"KjUqL\",\"type\":\"text\",\"version\":1}],\"tag\":\"h1\",\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1}]"}, +{"html":"
~~
","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~~\",\"type\":\"text\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"center\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1}]"}, +{"html":"
\t
","nodes":"[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":1032,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"start\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1},{\"children\":[],\"tag\":\"h6\",\"direction\":null,\"format\":\"end\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1}]"}, +{"html":"




","nodes":"[{\"children\":[],\"tag\":\"h3\",\"direction\":\"rtl\",\"format\":\"justify\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1}],\"language\":\"pro\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1}]"}, +{"html":"

𖼹Ӵ🧃

","nodes":"[{\"children\":[{\"children\":[{\"children\":[{\"detail\":0,\"format\":128,\"mode\":\"normal\",\"style\":\"\",\"text\":\"https://example.com\",\"type\":\"text\",\"version\":1}],\"rel\":\"Sw.1a5\",\"target\":\"h?iM-AZh\",\"title\":null,\"url\":\"https://U-TZlZ|\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"justify\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":\"ltr\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𖼹\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Ӵ🧃\",\"type\":\"text\",\"version\":1}],\"direction\":\"ltr\",\"format\":\"start\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

ⶠd


C2b}


","nodes":"[{\"children\":[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ⶠ\",\"type\":\"text\",\"version\":1}],\"rel\":\"d@!k\",\"target\":\"q\",\"title\":\",j[\",\"url\":\"https://ZuQFlurA\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"d\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"C2b}\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"justify\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"children\":[{\"children\":[{\"detail\":0,\"format\":9,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Ck=>9@V\",\"type\":\"text\",\"version\":1}],\"rel\":\"f@>:dV3E]\",\"target\":\"?PiW4&3R>\",\"title\":\")r\",\"url\":\"https://E\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𘧸𒅴ᔡ𒃼\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"2?\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"

~:@<HR9$M

zhsHᦕ𝦒


𑘍Ḭ𘥚ㅴ𑫏ዼ

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~:@\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"
Iu/xꄤ𑒦⫎𘯭



e1^'


","nodes":"[{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Iu/x\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":256,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ꄤ𑒦⫎𘯭\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1}],\"direction\":null,\"format\":\"justify\",\"indent\":2147483647,\"textFormat\":1,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[],\"direction\":null,\"format\":\"end\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"e1^'\",\"type\":\"text\",\"version\":1}],\"tag\":\"h3\",\"direction\":null,\"format\":\"end\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[],\"tag\":\"h5\",\"direction\":null,\"format\":\"justify\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1}]"}, +{"html":"

𒌢⁔﹣

<b>\t


","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𒌢⁔﹣\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"start\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}],\"direction\":null,\"format\":\"start\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":32,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"tag\":\"h1\",\"direction\":null,\"format\":\"start\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[],\"direction\":\"rtl\",\"format\":\"end\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"


","nodes":"[{\"children\":[],\"direction\":\"ltr\",\"format\":\"\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"
&amp;&ZI2/_`
ᒫ𘥕
u}pWO)
","nodes":"[{\"children\":[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"type\":\"linebreak\",\"version\":1}],\"checked\":false,\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"justify\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"**\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~~\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":\"?Ajx\",\"title\":null,\"url\":\"https://x9zW|<\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"(\",\"type\":\"text\",\"version\":1}],\"checked\":true,\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"check\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"&\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"&Z\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"I2/_`\",\"type\":\"text\",\"version\":1}],\"language\":\"C}^APu\",\"theme\":\"$Mc ?VC\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ᒫ𘥕\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"u}pWO)\",\"type\":\"text\",\"version\":1}],\"language\":\"-e\",\"theme\":\" s)||p4\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1}]"}, +{"html":"


`

  1. 1
  2. 𘮈∜𘦤ꎖW
","nodes":"[{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"`\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"right\",\"indent\":2147483647,\"textFormat\":8,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"left\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"1\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"center\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":128,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𘮈∜𘦤ꎖ\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":32,\"mode\":\"normal\",\"style\":\"\",\"text\":\"W\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":1,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"
  • zXAA?oڋ𘡼

","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":128,\"mode\":\"normal\",\"style\":\"\",\"text\":\"zXAA?o\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1024,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ڋ𘡼\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1}],\"checked\":true,\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"justify\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"check\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"


\\M1TO>b c

a


","nodes":"[{\"children\":[],\"direction\":\"ltr\",\"format\":\"left\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"\\\\M1TO>\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":32,\"mode\":\"normal\",\"style\":\"\",\"text\":\"b c\",\"type\":\"text\",\"version\":1}],\"tag\":\"h6\",\"direction\":null,\"format\":\"end\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1}],\"tag\":\"h3\",\"direction\":\"ltr\",\"format\":\"end\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[],\"direction\":null,\"format\":\"justify\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

]
","nodes":"[{\"children\":[{\"detail\":0,\"format\":1024,\"mode\":\"normal\",\"style\":\"\",\"text\":\" \",\"type\":\"text\",\"version\":1}],\"tag\":\"h3\",\"direction\":null,\"format\":\"center\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"]\",\"type\":\"text\",\"version\":1}],\"language\":\"3|x\",\"theme\":\" h\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1}]"}, +{"html":"
\t*'|MR

\t


","nodes":"[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":1024,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"*'|MR\",\"type\":\"text\",\"version\":1}],\"theme\":\"_\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":1,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"direction\":\"ltr\",\"format\":\"right\",\"indent\":2147483647,\"textFormat\":1,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[],\"direction\":null,\"format\":\"justify\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"


  • .]3kNv\t49}6?aZS

<>-#-@'x
𘠧𐭞

","nodes":"[{\"children\":[{\"children\":[{\"type\":\"linebreak\",\"version\":1}],\"checked\":true,\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\".]3kNv\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":4,\"mode\":\"normal\",\"style\":\"\",\"text\":\"49}6?aZS\",\"type\":\"text\",\"version\":1}],\"checked\":false,\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"end\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"checked\":false,\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"check\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":256,\"mode\":\"normal\",\"style\":\"\",\"text\":\")Lc^N1ti\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"left\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"K8b@3dN\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":null,\"title\":null,\"url\":\"https://END=a\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"L+t\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":\"^gch@1\",\"title\":null,\"url\":\"https://[M}P \",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"`\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"right\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":\"ltr\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":4,\"mode\":\"normal\",\"style\":\"\",\"text\":\"<>-#-@'x\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𘠧𐭞\",\"type\":\"text\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"end\",\"indent\":2147483647,\"textFormat\":4,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":9,\"mode\":\"normal\",\"style\":\"\",\"text\":\" \",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":null,\"title\":null,\"url\":\"https://XI&<44C\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"tag\":\"h2\",\"direction\":\"rtl\",\"format\":\"justify\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1}]"}, +{"html":"
  1. j+d
","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"j+d\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"right\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":1,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"



","nodes":"[{\"children\":[],\"direction\":\"rtl\",\"format\":\"center\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[],\"tag\":\"h4\",\"direction\":null,\"format\":\"start\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1}]"}, +{"html":"
  1. .&ewEq:\t
  2. iKZN!H𑁌

!Nb

🨯ă𛈾Ꭺ𘤜𒔚𛄝ꨢ

◅ἆ𐐪⸢
","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":521,\"mode\":\"normal\",\"style\":\"\",\"text\":\".&ewEq\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1024,\"mode\":\"normal\",\"style\":\"\",\"text\":\":\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"start\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"iKZN!H\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𑁌\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"end\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"left\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":\"rtl\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":1024,\"mode\":\"normal\",\"style\":\"\",\"text\":\"!Nb\",\"type\":\"text\",\"version\":1}],\"tag\":\"h1\",\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":128,\"mode\":\"normal\",\"style\":\"\",\"text\":\"🨯ă𛈾Ꭺ\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":256,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𘤜𒔚𛄝ꨢ\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"\",\"indent\":2147483647,\"textFormat\":128,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"◅ἆ𐐪⸢\",\"type\":\"text\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"end\",\"indent\":0,\"type\":\"quote\",\"version\":1}]"}, +{"html":"
  1. ]ਅ🔥`😀


Qs]={!𒋟𑉀ꋲ
","nodes":"[{\"children\":[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"]\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ਅ🔥\",\"type\":\"text\",\"version\":1}],\"rel\":\"F,S9e\",\"target\":null,\"title\":\"qSu\",\"url\":\"https://%9:=i^B\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":64,\"mode\":\"normal\",\"style\":\"\",\"text\":\"`\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"😀\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"center\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":\"rtl\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[],\"direction\":\"ltr\",\"format\":\"left\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":256,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Qs]\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":256,\"mode\":\"normal\",\"style\":\"\",\"text\":\"={!\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𒋟𑉀ꋲ\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"left\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1}]"}, +{"html":"

\t|4a{(.

","nodes":"[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":8,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\"|4a{(.\",\"type\":\"text\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"\",\"indent\":2147483647,\"textFormat\":8,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

|5c

","nodes":"[{\"children\":[{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"|5c\",\"type\":\"text\",\"version\":1}],\"direction\":\"ltr\",\"format\":\"end\",\"indent\":2147483647,\"textFormat\":8,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"
","nodes":"[{\"children\":[{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"start\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":\"rtl\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"
  • d-TB<SRz 8\\|
","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":33,\"mode\":\"normal\",\"style\":\"\",\"text\":\"d-TBx'x&J

","nodes":"[{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"x'x&J\",\"type\":\"text\",\"version\":1}],\"direction\":\"ltr\",\"format\":\"\",\"indent\":2147483647,\"textFormat\":1,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"
vrymh\t🝅ඍ𛁗𞲉
","nodes":"[{\"children\":[],\"language\":\"%[\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"vrymh\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":512,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"🝅ඍ𛁗𞲉\",\"type\":\"text\",\"version\":1}],\"language\":\" f~eU5y%\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1}]"}, +{"html":"
\t 
**
","nodes":"[{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"&h\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":512,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":512,\"mode\":\"normal\",\"style\":\"\",\"text\":\"<\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\"lib7\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":null,\"title\":\",wG;KUz\",\"url\":\"https://z0`kHx3IYk\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"checked\":false,\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":3,\"mode\":\"normal\",\"style\":\"\",\"text\":\"|::XkfO\",\"type\":\"text\",\"version\":1}],\"checked\":false,\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"center\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"checked\":true,\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"start\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"check\",\"start\":1,\"tag\":\"ul\",\"direction\":\"ltr\",\"format\":\"center\",\"indent\":0,\"type\":\"list\",\"version\":1}],\"checked\":false,\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"center\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"checked\":true,\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"justify\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"check\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" \",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"**\",\"type\":\"text\",\"version\":1}],\"rel\":\"7miH*\\\\t\",\"target\":null,\"title\":null,\"url\":\"https://\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"tag\":\"h5\",\"direction\":\"rtl\",\"format\":\"right\",\"indent\":0,\"type\":\"heading\",\"version\":1}]"}, +{"html":"
H?hg+


","nodes":"[{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"H\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":32,\"mode\":\"normal\",\"style\":\"\",\"text\":\"?hg+\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1},{\"children\":[],\"direction\":null,\"format\":\"center\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"
\n
","nodes":"[{\"children\":[{\"type\":\"linebreak\",\"version\":1}],\"direction\":null,\"format\":\"center\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1}]"}, +{"html":"
\t

","nodes":"[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"language\":\"JNn)1z\",\"theme\":\"fc9;F,#\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[],\"direction\":\"rtl\",\"format\":\"center\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

#é

  1. wE,P`
","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"#\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1024,\"mode\":\"normal\",\"style\":\"\",\"text\":\"é\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"wE,P\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":64,\"mode\":\"normal\",\"style\":\"\",\"text\":\"`\",\"type\":\"text\",\"version\":1},{\"children\":[],\"rel\":\"BP?1P\",\"target\":\"?FbX\",\"title\":null,\"url\":\"https://\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"justify\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"

𛅴W<_

","nodes":"[{\"children\":[{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𖫥𓀪𘤨\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":null,\"title\":\">g;'1>\\\\\",\"url\":\"https://V$q\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"5wwcK\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":9,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"justify\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"𛅴\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"W<_\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"justify\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"children\":[{\"children\":[],\"rel\":null,\"target\":\"oYOPmwZv'\",\"title\":\"q\\\"r\",\"url\":\"/k5==u:\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"襁⬐ﰹ〈\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":\"OS5gP#%X!\",\"title\":\"k\",\"url\":\"https://)P9z#\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"type\":\"linebreak\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"justify\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"%&0Q\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":512,\"mode\":\"normal\",\"style\":\"\",\"text\":\"\",\"type\":\"text\",\"version\":1}],\"rel\":\"M+i\",\"target\":\"RBA?kE`n`\",\"title\":\"]e}?GN;s\",\"url\":\"https://l\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"end\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":\"rtl\",\"format\":\"right\",\"indent\":0,\"type\":\"list\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"right\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"

b c<b>

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"b c\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"


t=Mr`

  • **
","nodes":"[{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[],\"direction\":\"rtl\",\"format\":\"justify\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"t=Mr\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"`\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"start\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":32,\"mode\":\"normal\",\"style\":\"\",\"text\":\"**\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"left\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":\"rtl\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"
`\n2
  • S`=d
","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"`\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"2\",\"type\":\"text\",\"version\":1}],\"language\":\"&BL,>(!8s^\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"S`=d\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"}, +{"html":"

bHCrW5X9x&amp;



  1. \nwjV+G?S,


ꌕἺଉ𑃲(xx)XdW

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"bHCr\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"W5X9x\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"&\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":\"*u,b\",\"title\":null,\"url\":\"https://!=8\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1}],\"direction\":null,\"format\":\"right\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"children\":[{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\"wjV+G?S,\",\"type\":\"text\",\"version\":1}],\"rel\":\"JZo\",\"target\":null,\"title\":null,\"url\":\"about:blank\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"start\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":1,\"tag\":\"ol\",\"direction\":\"ltr\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ꌕἺଉ𑃲\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"(xx)XdW\",\"type\":\"text\",\"version\":1}],\"tag\":\"h1\",\"direction\":\"ltr\",\"format\":\"right\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1}]"}, +{"html":"

Z/%4Z6a,LzFfYaa

6a


éUW

","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Z/%4\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Z6a,LzF\",\"type\":\"text\",\"version\":1}],\"rel\":\"m\",\"target\":\"=bJ[DE\",\"title\":\"~@N\",\"url\":\"https://E\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"fY\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1}],\"tag\":\"h1\",\"direction\":null,\"format\":\"justify\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"6a\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"type\":\"linebreak\",\"version\":1}],\"tag\":\"h1\",\"direction\":null,\"format\":\"right\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"é\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":128,\"mode\":\"normal\",\"style\":\"\",\"text\":\"UW\",\"type\":\"text\",\"version\":1},{\"children\":[],\"rel\":\"'\",\"target\":\"y77v.t+/L^\",\"title\":\"{

","nodes":"[{\"children\":[],\"direction\":null,\"format\":\"start\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"


DH

    • \tvR1yHX

A\\\t

","nodes":"[{\"children\":[],\"direction\":\"ltr\",\"format\":\"end\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\"DH\",\"type\":\"text\",\"version\":1}],\"tag\":\"h2\",\"direction\":\"ltr\",\"format\":\"start\",\"indent\":0,\"type\":\"heading\",\"version\":1},{\"children\":[{\"children\":[],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"center\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"children\":[{\"children\":[],\"checked\":false,\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"left\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":128,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":128,\"mode\":\"normal\",\"style\":\"\",\"text\":\"vR1yHX\",\"type\":\"text\",\"version\":1}],\"checked\":true,\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"right\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"check\",\"start\":1,\"tag\":\"ul\",\"direction\":\"rtl\",\"format\":\"right\",\"indent\":0,\"type\":\"list\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"right\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":512,\"mode\":\"normal\",\"style\":\"\",\"text\":\"A\\\\\",\"type\":\"text\",\"version\":1},{\"children\":[],\"rel\":\"fAhln\",\"target\":\"R?E]I\",\"title\":null,\"url\":\"https://T\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":1,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"direction\":\"ltr\",\"format\":\"center\",\"indent\":2147483647,\"textFormat\":512,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"

😀https://example.com

vh2{zuV>B




","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"😀\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":512,\"mode\":\"normal\",\"style\":\"\",\"text\":\"https://example.com\",\"type\":\"text\",\"version\":1}],\"tag\":\"h1\",\"direction\":null,\"format\":\"justify\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":4,\"mode\":\"normal\",\"style\":\"\",\"text\":\"vh2{z\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"uV>B\",\"type\":\"text\",\"version\":1}],\"tag\":\"h1\",\"direction\":null,\"format\":\"right\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[],\"direction\":null,\"format\":\"right\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1}]"}, +{"html":"
h&POP\n


6^\tTq^vkO'&amp;


","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"h&POP\",\"type\":\"text\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1}],\"tag\":\"h5\",\"direction\":\"rtl\",\"format\":\"\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[],\"direction\":null,\"format\":\"end\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"6^\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":9,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Tq^vkO'\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"&\",\"type\":\"text\",\"version\":1}],\"theme\":\"x\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[],\"direction\":\"ltr\",\"format\":\"end\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"
  • a

\t#1--8

XXG

","nodes":"[{\"children\":[{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"end\",\"type\":\"listitem\",\"version\":1},{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"start\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":\"ltr\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"a\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"end\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":8,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"#1--8\",\"type\":\"text\",\"version\":1}],\"tag\":\"h1\",\"direction\":\"ltr\",\"format\":\"center\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":256,\"mode\":\"normal\",\"style\":\"\",\"text\":\"XXG\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"center\",\"indent\":0,\"textFormat\":256,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[],\"direction\":null,\"format\":\"center\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"center\",\"indent\":0,\"type\":\"quote\",\"version\":1}]"}, +{"html":"

M


\tY

","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"M\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"end\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}],\"direction\":\"ltr\",\"format\":\"end\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1},{\"children\":[{\"children\":[{\"children\":[{\"children\":[],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":1,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"children\":[],\"rel\":\"\\\\UY_3T?\",\"target\":\"/wat\",\"title\":\"Th(q\",\"url\":\"https://t19bSA-\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"right\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":0,\"tag\":\"ol\",\"direction\":\"ltr\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[],\"direction\":null,\"format\":\"right\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1},{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Y\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"


\t?Dq\t

\t\te0>7]<F

","nodes":"[{\"children\":[],\"direction\":\"ltr\",\"format\":\"justify\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"?Dq\",\"type\":\"text\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"language\":\"BtAh~17W`X\",\"theme\":\";ui=l/xQ\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":64,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":256,\"mode\":\"normal\",\"style\":\"\",\"text\":\"e0>7]**

b c^lMw4\"f#

https://example.com

","nodes":"[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"**\",\"type\":\"text\",\"version\":1}],\"tag\":\"h3\",\"direction\":null,\"format\":\"end\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"b c\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1024,\"mode\":\"normal\",\"style\":\"\",\"text\":\"^lMw4\\\"f#\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"textFormat\":1,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"https://example.com\",\"type\":\"text\",\"version\":1}],\"tag\":\"h1\",\"direction\":null,\"format\":\"right\",\"indent\":0,\"type\":\"heading\",\"version\":1}]"}, +{"html":"



2//Jsp?R'4
","nodes":"[{\"children\":[],\"direction\":\"rtl\",\"format\":\"justify\",\"indent\":0,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"children\":[],\"rel\":\"4w&?U\",\"target\":\"OgRl`Iro=\",\"title\":\"P\",\"url\":\"https://ak0Xir!W_\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":16,\"mode\":\"normal\",\"style\":\"\",\"text\":\"2//J\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":1024,\"mode\":\"normal\",\"style\":\"\",\"text\":\"sp?R'4\",\"type\":\"text\",\"version\":1}],\"rel\":\"E{\",\"target\":\"Fjpo\\\"\",\"title\":null,\"url\":\"https://-\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1}],\"tag\":\"h6\",\"direction\":\"ltr\",\"format\":\"left\",\"indent\":0,\"type\":\"heading\",\"version\":1}]"}, +{"html":"
  • tAosqXd
    %!Z


EOZJlgY!

","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"tAosqXd\",\"type\":\"text\",\"version\":1},{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"%!Z\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"center\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":\"rtl\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"EOZJlgY!\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"end\",\"indent\":2147483647,\"textFormat\":2,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"
  1. :^g>=t^ 3W>'#:

]NH0o__Tem%rzqo_



","nodes":"[{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\":^g>=t^\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\" 3W>'#:\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"start\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":1,\"tag\":\"ol\",\"direction\":\"ltr\",\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":32,\"mode\":\"normal\",\"style\":\"\",\"text\":\"]NH0o__T\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":512,\"mode\":\"normal\",\"style\":\"\",\"text\":\"em%rzqo_\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"textFormat\":32,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}],\"direction\":\"ltr\",\"format\":\"\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1},{\"children\":[],\"direction\":\"ltr\",\"format\":\"start\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1},{\"children\":[],\"direction\":\"ltr\",\"format\":\"\",\"indent\":2147483647,\"type\":\"quote\",\"version\":1}]"}, +{"html":"
\t:.e?yeFp

~https://example.comQIẠ



","nodes":"[{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":17,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\":.e?yeF\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"p\",\"type\":\"text\",\"version\":1}],\"theme\":\"2QQD\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[{\"children\":[],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1},{\"children\":[{\"children\":[{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"mOW:Y&F\",\"type\":\"text\",\"version\":1}],\"rel\":\"~\",\"target\":null,\"title\":null,\"url\":\"https://57\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~~\",\"type\":\"text\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"rtl\",\"format\":\"start\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"https://example.com\",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"QI\",\"type\":\"text\",\"version\":1}],\"rel\":null,\"target\":null,\"title\":\"8u\",\"url\":\"https://0\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1},{\"detail\":0,\"format\":8,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Ạ\",\"type\":\"text\",\"version\":1}],\"tag\":\"h1\",\"direction\":null,\"format\":\"justify\",\"indent\":0,\"type\":\"heading\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1}],\"direction\":\"rtl\",\"format\":\"center\",\"indent\":2147483647,\"textFormat\":0,\"textStyle\":\"\",\"type\":\"paragraph\",\"version\":1}]"}, +{"html":"




Ꮿ𑙫𖼪🃲<b>&c
\t\t
","nodes":"[{\"children\":[{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"type\":\"linebreak\",\"version\":1}],\"indent\":0,\"value\":1,\"direction\":\"ltr\",\"format\":\"left\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1},{\"children\":[{\"type\":\"linebreak\",\"version\":1},{\"children\":[],\"rel\":\"~3\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"&c\",\"type\":\"text\",\"version\":1}],\"language\":\"pg#l@\",\"theme\":\">v$N>>)\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"code\",\"version\":1},{\"children\":[{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":64,\"style\":\"\",\"type\":\"tab\",\"version\":1},{\"detail\":2,\"mode\":\"normal\",\"text\":\"\\t\",\"format\":0,\"style\":\"\",\"type\":\"tab\",\"version\":1}],\"tag\":\"h5\",\"direction\":\"rtl\",\"format\":\"center\",\"indent\":2147483647,\"type\":\"heading\",\"version\":1}]"}, +{"html":"
","nodes":"[{\"children\":[{\"children\":[],\"indent\":0,\"value\":1,\"direction\":null,\"format\":\"\",\"type\":\"listitem\",\"version\":1}],\"listType\":\"number\",\"start\":1,\"tag\":\"ol\",\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1}]"} +]} diff --git a/rust/DESIGN.md b/rust/DESIGN.md index 51778504c6d4..258bd5cfdf25 100644 --- a/rust/DESIGN.md +++ b/rust/DESIGN.md @@ -56,10 +56,10 @@ depends on as the upstream package depends on them: | `utils` | `@lexical/utils` | `selection` | | `rich-text` | `@lexical/rich-text` | `selection`, `utils` | | `plain-text`| `@lexical/plain-text` | (upstream lists `clipboard`, `dragon`, `extension`, `selection` and `utils`; the model handlers use none of them) | -| `list` | `@lexical/list` | `utils` (upstream also lists `extension` and `html`, for `ListExtension` and the DOM import, which aren't ported) | -| `link` | `@lexical/link` | `utils` (upstream also lists `extension` and `html`, for `LinkExtension` and the DOM import, which aren't ported) | +| `list` | `@lexical/list` | `utils` (upstream also lists `extension`, for `ListExtension`, which isn't ported, and `html`, whose parts build with that feature) | +| `link` | `@lexical/link` | `utils` (upstream also lists `extension`, for `LinkExtension`, which isn't ported, and `html`, whose parts build with that feature) | | `autolink` | `@lexical/link`'s `registerAutoLink` | `link`, `regex` | -| `code` | `@lexical/code-core` | (upstream lists `extension`, `html` and `utils`, for the extensions, the DOM import and the arrow-key handlers, which aren't ported) | +| `code` | `@lexical/code-core` | (upstream lists `extension` and `utils`, for the extensions and the arrow-key handlers, which aren't ported, and `html`, whose parts build with that feature) | | `overflow` | `@lexical/overflow` | | | `text` | `@lexical/text` | | | `hashtag` | `@lexical/hashtag` | `text` (upstream also lists `extension` and `utils`, for `HashtagExtension` and `mergeRegister`, which aren't ported) | @@ -173,7 +173,9 @@ model of jsdom's"), since the vectors record what jsdom does: in the editor state (the text a selection cuts short). The base classes' behavior is the hooks' defaults (`TextNode` renders its text, `ElementNode` adds the indent and direction), as for - `get_text_content`. The theme is the JSON of `EditorThemeClasses` + `get_text_content`. A node package's DOM parts build when both its + feature and `html` are on, so the package doesn't pull in the DOM. The + theme is the JSON of `EditorThemeClasses` (`CreateEditorArgs.theme`), and a `DOMConversionMap` is a list of name and importer pairs in the order JS's object keys would be. - **`DOMParser` is a WHATWG tokenizer and tree builder**, checked against @@ -226,7 +228,7 @@ Each milestone ends with green CI and a report to the Space. | P | Desktop playgrounds (`apps/`): `lexical-playground-rune` on Rune, then `lexical-playground-gpui` on GPUI, sharing `lexical-playground-core`; they grow with each milestone below | the vectors, replayed in the app; a session exported from the app replays in JS (`replay.test.ts`); in CI, a GPUI session typed in a real window replays in JS | both apps run on macOS with typing, Return, deletion, formatting, input methods and the Parity panel; they grow with each milestone | | M2 | `rich-text` (headings, quotes, and the command handlers a text surface dispatches: typing, Enter, Backspace, formatting) and `history` (undo), which the playgrounds need first; then the node packages `list`, `link`, `code`, `overflow`, `hashtag`, with `selection` and `utils` | `serialization/*`, `property/documents` (JSON and text), `entities/hashtag-*`, `scripts/history` | done (every vector it names passes): `history` is done (`scripts/history` passes); `rich-text`'s nodes and `registerRichText`'s model command handlers are done (`scripts/rich-text` and `scripts/rich-text-commands` pass, with the heading and quote cases of `property/documents`); `plain-text`'s model command handlers are done (`scripts/plain-text` passes); `list`'s nodes, `registerList` and the model part of `registerCheckList` are done (`scripts/list` and `serialization/list` pass, with the list cases of `property/documents`); `link`'s nodes, `$toggleLink` and `registerLink`'s model handlers are done (`scripts/link` and `serialization/link` pass, with the link cases of `property/documents` that need no other package), `registerAutoLink` and its matchers are done behind `autolink` (`scripts/autolink` and `entities/autolink-match` pass); `selection`'s `$setBlocksType` is done (`scripts/set-blocks-type` passes); `code`'s nodes, `FlatStructureUtils.ts`, `CodeExtension`'s transform and `registerCodeIndentation`'s model handlers are done (`scripts/code` and `serialization/code` pass, with the code cases of `property/documents` that need no other package); `overflow`'s `OverflowNode` is done (`scripts/overflow` and `serialization/overflow` pass, with the overflow cases of `property/documents` that need no other package); `hashtag`'s `HashtagNode`, its matcher (generated character tables, no `regex`) and `registerLexicalHashtag`, with `text`'s `registerLexicalTextEntity`, are done (`entities/hashtag-match`, `entities/hashtag-documents` and `entities/hashtag-typing` pass, with the last waiting cases of `property/documents`), so M2's node packages are done | | M3 | The commands `property/sequences` dispatches | `property/sequences` | | -| M4 | `html`: a DOM abstraction over an HTML parser, CSS declarations, export and import | `html/*`, `css/*`, `property/documents` (HTML) | in progress: the DOM (`dom`: nodes, `DOMParser`, the serializer, the inline style declaration and its tables), `getStyleObjectFromCSS`, the core nodes' DOM hooks and `@lexical/html`'s export and import are done (every `html/*` and `css/*` file passes); next, the node packages' DOM parts (list, link, code, overflow, hashtag, rich text, the decorators) and `property/documents`' HTML | +| M4 | `html`: a DOM abstraction over an HTML parser, CSS declarations, export and import | `html/*`, `css/*`, `property/documents` (HTML) | in progress: the DOM (`dom`: nodes, `DOMParser`, the serializer, the inline style declaration and its tables), `getStyleObjectFromCSS`, the core nodes' and the node packages' DOM hooks, and `@lexical/html`'s export and import, are done (every `html/*` and `css/*` file and `property/documents`' HTML pass); not ported: the `DOMImportExtension` and `DOMRenderExtension` pipelines and `$inlineStylesFromStyleSheets` | | M5 | `markdown` | `markdown/import-export`, `property/documents` (Markdown) | | | M6 | `yjs`: a port of `@lexical/yjs` on `yrs` (behind the feature), with new JS vectors for the binding (sevki/lexical-rs's `lexical-yjs` and jpcamara/yrby's `lexical-yjs-html` only as cross-checks) | the new collab vectors | | | M7 | Releases: the mirror, changesets, a name tmm settles | | | diff --git a/rust/PARITY.md b/rust/PARITY.md index 5bcf62d8837c..da5f2bdc4d3d 100644 --- a/rust/PARITY.md +++ b/rust/PARITY.md @@ -48,6 +48,7 @@ updated with each milestone. | `$setBlocksType` (the `selection` feature) | `packages/lexical-selection/src/range-selection.ts` (`$setBlocksType`, with its default `$afterCreateElement`, `$copyBlockFormatIndent`, and `$isPointAtBlockEdge`), through `LexicalNode.replace` and `ListItemNode.replace` | `selection` | `scripts/set-blocks-type`, the block-decorator case of `scripts/decorator` | | The DOM (the `html` feature) | what a browser or jsdom gives JS: `Node` (`nodeType`, `nodeName`, `parentNode`, `childNodes`, siblings, `textContent`, `insertBefore`, `appendChild`, `append`, `prepend`, `removeChild`, `replaceChild`, `remove`, `replaceWith`, `replaceChildren`, `contains`, `cloneNode`), `Element` (attributes in order, `id`, `dir`, `className`, `classList`, `style`, `innerHTML`, `outerHTML`, `getElementsByTagName`), `Text`, `Comment`, `DocumentFragment`, `Document` (`createElement` and the other factories, `head`, `body`), `DOMTokenList`, `CSSStyleDeclaration` (`setProperty`, `getPropertyValue`, `getPropertyPriority`, `removeProperty`, `cssText`, `item`) with jsdom's normalization, `DOMParser.parseFromString`, the HTML fragment serialization algorithm; ported from the Swift port's `DOM/` | `dom` | `html/parse`, `html/entities`, `css/properties`, `css/values` | | Core DOM hooks (the `html` feature) | `LexicalNode.createDOM`, `exportDOM` and the static `importDOM` as node hooks (`create_dom`, `export_dom`, `import_dom`), `ElementNode.exportDOM` (indent as `padding-inline-start` and `data-lexical-indent`, `dir`); `DOMExportOutput`, `DOMConversionOutput`, `DOMChildConversion`, `DOMConversion`, `DOMConversionFn`, `DOMConversionMap`; `createEditor`'s `theme` and `html` (`export` overrides, `import` conversions), `editor._config`, `initializeConversionCache`; `DEFAULT_EDITOR_DOM_CONFIG` (`$createDOM`, `$exportDOM`, `$extractWithChild`, `$shouldExclude`, `$shouldInclude`); `LexicalNode.isSelected`; `TextNode` (`createDOM` with `getElementOuterTag`, `getElementInnerTag`, `$createTextInnerDOM` and `setTextThemeClassNames`; `exportDOM`; `importDOM` with `$convertTextDOMNode`, `findParentPreDOMNode`, `findTextInLine`, `convertSpanElement`, `convertBringAttentionToElement`, `convertTextFormatElement`, `applyTextFormatFromStyle`), `TabNode.createDOM`, `LineBreakNode` (`createDOM`, `importDOM`), `ParagraphNode` (`createDOM`, `exportDOM`, `importDOM` with `$convertParagraphElement`, `extractWithChild`), `ArtificialNode__DO_NOT_USE`; from `LexicalUtils.ts` `isInlineDomNode`, `isBlockDomNode`, `getCachedClassNameArray`, `removeEmptyDOMAttribute`, `setNodeIndentFromDOM`, `$setDirectionFromDOM`, `$setFormatFromDOM`, `isOnlyChildInBlockNode`, `isLastChildInBlockNode`; `utils/classNames.ts` | `lexical_dom`, `node`, `nodes::*`, `editor` | `html/export`, `html/import` | +| The node packages' DOM parts (the `html` feature with each package's) | `createDOM`, `exportDOM` and `importDOM` of `HeadingNode` (with the Google Docs title), `QuoteNode` (`$convertHeadingElement`, `$convertBlockquoteElement`), `ListNode` (`$setListThemeClassNames`, `$convertListNode`, `$normalizeChildren`, `isDomChecklist`, `HTMLOListElement.start`), `ListItemNode` (`updateListItemDOM` with `updateListItemChecked`, `$setListItemThemeClassNames` and `applyMarkerStyles`, the nested item's `after`, `$convertListItemElement`, `$convertCheckboxInput`, `setFormatFromChildren`), `LinkNode` (`updateLinkDOM` for a new element, `sanitizeUrl`, `$convertAnchorElement`), `AutoLinkNode`, `CodeNode` (`$convertPreElement`, `$convertDivElement`, the GitHub table converters), `CodeHighlightNode`, `OverflowNode`, `HashtagNode`, `HorizontalRuleNode` and `DecoratorTextNode`, with `applyFormatFromStyle` and `applyFormatToDom` | `rich_text`, `list`, `link`, `code`, `overflow`, `hashtag`, `extension` | the HTML of `property/documents`, `html/import-nodes` | | `@lexical/html` (the `html` feature) | `packages/lexical-html/src/index.ts`: `$generateHtmlFromNodes`, `$generateDOMFromNodes`, `$generateDOMFromRoot`, `$appendNodeToHTML` (`$appendNodesToHTML` with `$appendTerminatingLineBreak`, and `@lexical/selection`'s `$sliceSelectedTextNodeContent` for a selection), `$generateNodesFromDOM` (`IGNORE_TAGS`, `getConversionFunction`, `$createNodesFromDOM`, `wrapContinuousInlines`, `$unwrapArtificialNodes`, `isDomNodeBetweenTwoInlineNodes`) | `html` | `html/export`, `html/import` | | Inline CSS text | `utils/setDOMStyle.ts` (`getStyleObjectFromCSS`, with JS's property order; with the `html` feature `setDOMStyleObject` and `setDOMStyleFromCSS`) | `set_dom_style` | through `css/values`; unit tests against JS's output | | UTF-16 offsets | `String#length`, `String#slice` | `utf16` | through the text methods; unit tests against Node | @@ -100,9 +101,9 @@ touches: `$selectAll(selection)`'s scoping isn't ported, nor `insertNodes`' CASE 3a (blocks with no block ancestor, which needs `$insertNodeToNearestRootAtCaret`). -- `@lexical/list`'s DOM parts (`createDOM`, `updateDOM`, `exportDOM`, - `importDOM`, the theme class names, `ListImportExtension`/`ListImportRules` - and `WordListImportExtension`), which come with `html`; `ListExtension` +- Of `@lexical/list`'s DOM parts, `updateDOM` (the reconciler's), + `ListImportExtension`/`ListImportRules` and `WordListImportExtension` + (the import-rule pipeline); `ListExtension` and `CheckListExtension`, which need the extension API (`ListExtension`'s defaults are what `register_list` with `RegisterListOptions::default()` does); `registerListStrictIndentTransform` (`hasStrictIndent`, off by @@ -119,11 +120,12 @@ touches: at the start of a document's first item, with nothing before it, needs `Selection.modify` in headless JS, which throws, as `scripts/list` records. -- `@lexical/link`'s DOM parts (`createDOM`, `updateDOM`, `updateLinkDOM`, - `exportDOM`, `importDOM`, `$convertAnchorElement`, `LinkImportRules` and - `LinkImportExtension`), which come with `html`, and `sanitizeUrl`, which - only `updateLinkDOM` calls and which needs the WHATWG URL parser - (`new URL`); `LinkExtension`, which needs the extension API +- Of `@lexical/link`'s DOM parts, `updateDOM`, `LinkImportRules` and + `LinkImportExtension`. `sanitizeUrl` asks `new URL` whether a URL + parses and for its protocol; as in Swift, that is a model of the WHATWG + parser's scheme and host rules without IDNA or IPv4 parsing, so a host + only those reject (`https://1.2.3.4.5`) is taken as parsing. + `LinkExtension`, which needs the extension API (`register_link` with `LinkConfig::default()` is what its defaults do, and the config is a value where JS reads signals); `registerLink`'s `PASTE_COMMAND` handler (registered only with `validateUrl`), which reads @@ -143,10 +145,9 @@ touches: the text outside the parent either way, and `$resolveSelectionPointOnBoundary`, which also reads them, runs only after `Selection.modify`. -- `@lexical/code-core`'s DOM parts (`createDOM`, `updateDOM`, `exportDOM`, - `importDOM`, `$convertPreElement` and the other converters, - `CodeImportRules`/`CodeImportExtension` and the VS Code paste overlay), - which come with `html`, and `registerCodeGutter`, which writes to the +- Of `@lexical/code-core`'s DOM parts, `updateDOM`, + `CodeImportRules`/`CodeImportExtension` and the VS Code paste overlay, + and `registerCodeGutter`, which writes to the DOM; `CodeExtension` and `CodeIndentExtension`, which need the extension API (`register_code` and `register_code_indentation(editor, None)` are what their defaults register); `CodeExtension`'s `KEY_ENTER_COMMAND` @@ -165,11 +166,10 @@ touches: highlighter. Of the 25 `property/documents` cases with code nodes, 4 also hold hashtag or overflow nodes; they waited on those packages, which are now ported. -- `@lexical/overflow`'s `createDOM` and `updateDOM`, which come with - `html`, and `OverflowExtension`, which needs the extension API - (`overflow_nodes()` is its `nodes`). `excludeFromCopy` is a node hook - that nothing calls yet: its callers are `@lexical/clipboard`'s and - `@lexical/html`'s copies. `@lexical/react`'s character limit +- `@lexical/overflow`'s `updateDOM`, and `OverflowExtension`, which needs + the extension API (`overflow_nodes()` is its `nodes`). + `excludeFromCopy` is a node hook that `@lexical/html`'s export calls; + `@lexical/clipboard`'s copy isn't ported. `@lexical/react`'s character limit (`useCharacterLimit.ts`: `$wrapOverflowedNodes`, `findOffset`, `$wrapNode`, `$unwrapNode`, `$mergePrevious`), which is what makes overflow nodes, isn't ported: no vector runs it (every vector's overflow @@ -180,8 +180,7 @@ touches: and reads the text there, as JS does: a parsed state is all dirty, so the transforms run, and `OverflowNode`'s removes the empty ones a random document holds. -- `@lexical/hashtag`'s `createDOM`, which comes with `html`, and - `HashtagExtension`, which needs the extension API (`hashtag_nodes()` is +- `HashtagExtension`, which needs the extension API (`hashtag_nodes()` is its `nodes` and `register_lexical_hashtag(editor, HashtagConfig::default())` its `register`). Of `@lexical/text`, only `registerLexicalTextEntity`: `$canShowPlaceholder`, @@ -221,9 +220,8 @@ touches: `MOVE_TO_END`, copy, cut, paste, drop and drag), which wait for an input layer, with its `escapeFormatTriggers` and `shouldHandlePasteAsFiles`; `CONTROLLED_TEXT_INSERTION_COMMAND`'s `beforeinput` form; and - `SELECT_ALL_COMMAND`'s scoping to a slot (slots aren't ported). The DOM - parts of `@lexical/rich-text` (`createDOM`, `exportDOM`, `importDOM`) - come with `html`. + `SELECT_ALL_COMMAND`'s scoping to a slot (slots aren't ported), and + `updateDOM`. - `registerPlainText`'s handlers of DOM events (the arrow keys, Backspace, Delete, Enter, copy, cut, paste, drop and drag) and `PlainTextExtension` with its dependencies (`DragonExtension`, diff --git a/rust/conformance/src/suites/html.rs b/rust/conformance/src/suites/html.rs index 3d9a9aa2ac83..38bc52f6bba6 100644 --- a/rust/conformance/src/suites/html.rs +++ b/rust/conformance/src/suites/html.rs @@ -92,7 +92,29 @@ fn node_to_json(node: &NodeRef) -> Value { /// `html/import`: `$generateNodesFromDOM` makes the nodes jsdom's import /// made of the parsed HTML. pub fn check_import(case: &Value, _file: &Value) -> Result { - let editor = create_editor(CreateEditorArgs::default()); + import(case, create_editor(CreateEditorArgs::default())) +} + +/// `html/import-nodes`: as `html/import`, with the node packages' +/// importers (the nodes of `property/documents` and `HorizontalRuleNode`). +pub fn check_import_nodes(case: &Value, _file: &Value) -> Result { + let editor = create_editor(CreateEditorArgs { + nodes: [ + lexical::rich_text::rich_text_nodes(), + lexical::list::list_nodes(), + lexical::link::link_nodes(), + lexical::code::code_nodes(), + lexical::overflow::overflow_nodes(), + lexical::hashtag::hashtag_nodes(), + lexical::extension::extension_nodes(), + ] + .concat(), + ..Default::default() + }); + import(case, editor) +} + +fn import(case: &Value, editor: lexical::Editor) -> Result { let dom = parse_from_string(case.str("html")?); let nodes = Rc::new(RefCell::new(String::new())); let (out, update_editor) = (nodes.clone(), editor.clone()); diff --git a/rust/conformance/src/suites/mod.rs b/rust/conformance/src/suites/mod.rs index 779ed3dcd05c..a9f887e7c3cc 100644 --- a/rust/conformance/src/suites/mod.rs +++ b/rust/conformance/src/suites/mod.rs @@ -42,6 +42,11 @@ pub fn all() -> Vec { variant: None, check: html::check_import, }, + Suite { + file: "html/import-nodes", + variant: None, + check: html::check_import_nodes, + }, Suite { file: "html/parse", variant: None, @@ -189,7 +194,7 @@ pub fn all() -> Vec { }, Suite { file: "property/documents", - variant: Some("JSON and text"), + variant: Some("JSON, text and HTML"), check: property::check_document, }, ] diff --git a/rust/conformance/src/suites/property.rs b/rust/conformance/src/suites/property.rs index f8d51d308ee7..15d57edddfc9 100644 --- a/rust/conformance/src/suites/property.rs +++ b/rust/conformance/src/suites/property.rs @@ -20,8 +20,8 @@ fn unported_package(node: &Value) -> Option<&'static str> { /// `property/documents.json`: a random document parses (or fails to, when /// JS's did) to the same state, written in both forms, a second parse of -/// each form gives what JS's gave, and the text content is the same. The -/// Markdown and HTML JS recorded are checked once those packages are ported. +/// each form gives what JS's gave, and the text content and the HTML are the +/// same. The Markdown JS recorded is checked once that package is ported. pub fn check_document(case: &Value, _file: &Value) -> Result { let input = case.str("input")?; let parsed_input = json::parse(input).map_err(|e| format!("input: {e}"))?; @@ -105,5 +105,16 @@ pub fn check_document(case: &Value, _file: &Value) -> Result { .read(|| get_root().get_text_content()) .map_err(|e| format!("reading the text: {e}"))?; same("text", text.as_str(), case.str("text")?)?; + + // `$generateHtmlFromNodes`, or null when it throws. + let html = editor + .read(|| lexical::html::generate_html_from_nodes(&editor, None)) + .map_err(|e| format!("reading the HTML: {e}"))? + .ok(); + let want_html = match case.field("html")? { + Value::Null => None, + _ => Some(case.str("html")?), + }; + same("html", html.as_deref(), want_html)?; Ok(Outcome::Pass) } diff --git a/rust/lexical-editor/Cargo.toml b/rust/lexical-editor/Cargo.toml index dc97f09d272d..f2d4c4a5eaef 100644 --- a/rust/lexical-editor/Cargo.toml +++ b/rust/lexical-editor/Cargo.toml @@ -28,21 +28,22 @@ rich-text = ["selection", "utils"] # @lexical/plain-text: registerPlainText's model command handlers. plain-text = [] # @lexical/list: ListNode, ListItemNode, registerList and the model parts of -# registerCheckList. Upstream it also depends on @lexical/extension and -# @lexical/html, for ListExtension and the DOM import, which aren't ported. +# registerCheckList, with the DOM parts when `html` is on too. Upstream it also +# depends on @lexical/extension, for ListExtension, which isn't ported. list = ["utils"] -# @lexical/link: LinkNode, AutoLinkNode, $toggleLink and registerLink. Upstream -# it also depends on @lexical/extension and @lexical/html, for LinkExtension -# and the DOM import, which aren't ported. +# @lexical/link: LinkNode, AutoLinkNode, $toggleLink and registerLink, with the +# DOM parts when `html` is on too. Upstream it also depends on +# @lexical/extension, for LinkExtension, which isn't ported. link = ["utils"] # @lexical/link's registerAutoLink and its matchers (LexicalAutoLinkExtension.ts), # whose regular expressions need the `regex` crate: the one feature with a # third-party dependency (rust/DESIGN.md, "Architecture"). autolink = ["link", "dep:regex"] # @lexical/code-core: CodeNode, CodeHighlightNode, FlatStructureUtils and the -# model parts of CodeExtension and registerCodeIndentation. Upstream it also -# depends on @lexical/extension, @lexical/html and @lexical/utils, for the -# extensions, the DOM import and the arrow-key handlers, which aren't ported. +# model parts of CodeExtension and registerCodeIndentation, with the DOM parts +# when `html` is on too. Upstream it also depends on @lexical/extension and +# @lexical/utils, for the extensions and the arrow-key handlers, which aren't +# ported. code = [] # @lexical/overflow: OverflowNode. overflow = [] diff --git a/rust/lexical-editor/src/code/code_highlight_node.rs b/rust/lexical-editor/src/code/code_highlight_node.rs index 0c7ddd743690..df30b4e9fa5c 100644 --- a/rust/lexical-editor/src/code/code_highlight_node.rs +++ b/rust/lexical-editor/src/code/code_highlight_node.rs @@ -73,6 +73,24 @@ impl LexicalNode for CodeHighlightNode { fn get_type(&self) -> &'static str { "code-highlight" } + /// `CodeHighlightNode.createDOM(config)`: `TextNode`'s, with the + /// theme's `codeHighlight[highlightType]` class names. + #[cfg(feature = "html")] + fn create_dom( + &self, + _this: &NodeRef, + config: &crate::EditorConfig, + _editor: &crate::Editor, + ) -> Result { + let element = crate::nodes::text::create_dom(self, config)?; + if let (Some(highlight_type), Some(crate::json::Value::Object(code_highlight))) = ( + self.highlight_type.as_deref().filter(|t| !t.is_empty()), + config.theme.get("codeHighlight"), + ) { + crate::lexical_dom::add_theme_class_names(&element, code_highlight, highlight_type); + } + Ok(element) + } fn base(&self) -> &NodeBase { &self.base } diff --git a/rust/lexical-editor/src/code/code_node.rs b/rust/lexical-editor/src/code/code_node.rs index 495615284027..fa2f8a10f6ba 100644 --- a/rust/lexical-editor/src/code/code_node.rs +++ b/rust/lexical-editor/src/code/code_node.rs @@ -218,6 +218,32 @@ impl LexicalNode for CodeNode { fn get_type(&self) -> &'static str { "code" } + /// `CodeNode.createDOM(config)`: a ``. + #[cfg(feature = "html")] + fn create_dom( + &self, + _this: &NodeRef, + config: &crate::EditorConfig, + _editor: &crate::Editor, + ) -> Result { + Ok(code_dom::code_element(self, "code", &config.theme)) + } + /// `CodeNode.exportDOM(editor)`: a `
`, with what `createDOM`
+    /// writes and without the indent and direction.
+    #[cfg(feature = "html")]
+    fn export_dom(
+        &self,
+        _this: &NodeRef,
+        editor: &crate::Editor,
+    ) -> Result {
+        Ok(crate::lexical_dom::DomExportOutput::element(
+            code_dom::code_element(self, "pre", &editor.config().theme),
+        ))
+    }
+    #[cfg(feature = "html")]
+    fn import_dom(&self) -> Option {
+        Some(code_dom::import_dom())
+    }
     fn base(&self) -> &NodeBase {
         &self.base
     }
@@ -304,3 +330,158 @@ pub fn exit_code_node_on_enter(selection: &SelectionRef) -> Result`) and `exportDOM` (a `
`) both
+    /// write: the theme's `code` class names, `spellcheck`, the language
+    /// and theme attributes, and the style.
+    pub(crate) fn code_element(code: &CodeNode, tag: &str, theme: &Object) -> DomNode {
+        let element = get_document().create_element(tag);
+        add_theme_class_names(&element, theme, "code");
+        element.set_attribute("spellcheck", "false");
+        if let Some(language) = code.language() {
+            element.set_attribute(LANGUAGE_DATA_ATTRIBUTE, language);
+            if code.is_syntax_highlight_supported() {
+                element.set_attribute(HIGHLIGHT_LANGUAGE_DATA_ATTRIBUTE, language);
+            }
+        }
+        if let Some(theme) = code.theme() {
+            element.set_attribute(THEME_DATA_ATTRIBUTE, theme);
+        }
+        let style = code.element.get_style();
+        if !style.is_empty() {
+            set_dom_style_from_css(&element.style(), style, "");
+        }
+        element
+    }
+
+    /// `hasChildDOMNodeTag(node, tagName)`.
+    fn has_child_dom_node_tag(node: &DomNode, tag_name: &str) -> bool {
+        node.child_nodes().iter().any(|child| {
+            (child.is_element() && child.tag_name() == tag_name)
+                || has_child_dom_node_tag(child, tag_name)
+        })
+    }
+
+    /// `CodeNode`'s `importDOM`: `
`, a multi-line ``, a `
` + /// in a monospace font, and GitHub's code tables. + pub(crate) fn import_dom() -> DomConversionMap { + let noop = || -> crate::lexical_dom::DomConversionFn { + Rc::new(|_| Ok(Some(DomConversionOutput::node(None)))) + }; + vec![ + ( + "code".to_owned(), + Rc::new(|node: &DomNode| { + let is_multi_line = + node.text_content().contains('\n') || has_child_dom_node_tag(node, "BR"); + is_multi_line.then(|| DomConversion { + conversion: Rc::new(convert_pre_element), + priority: 1, + }) + }), + ), + ("div".to_owned(), importer(1, convert_div_element)), + ("pre".to_owned(), importer(0, convert_pre_element)), + ( + "table".to_owned(), + Rc::new(|node: &DomNode| { + is_git_hub_code_table(node).then(|| DomConversion { + conversion: Rc::new(|_| { + Ok(Some(DomConversionOutput::node(Some(create_code_node( + None, None, + ))))) + }), + priority: 3, + }) + }), + ), + ( + "td".to_owned(), + Rc::new(move |node: &DomNode| { + let table = closest(node, "table"); + (is_git_hub_code_cell(node) + || table.as_ref().is_some_and(is_git_hub_code_table)) + .then(|| DomConversion { + conversion: noop(), + priority: 3, + }) + }), + ), + ( + "tr".to_owned(), + Rc::new(move |node: &DomNode| { + closest(node, "table") + .as_ref() + .is_some_and(is_git_hub_code_table) + .then(|| DomConversion { + conversion: noop(), + priority: 3, + }) + }), + ), + ] + } + + /// `$convertPreElement(domNode)`: a code block with the element's + /// language and theme. + fn convert_pre_element( + dom_node: &DomNode, + ) -> Result, LexicalError> { + let language = dom_node.get_attribute(LANGUAGE_DATA_ATTRIBUTE); + let theme = dom_node.get_attribute(THEME_DATA_ATTRIBUTE); + Ok(Some(DomConversionOutput::node(Some(create_code_node( + language.as_deref(), + theme.as_deref(), + ))))) + } + + /// `$convertDivElement(domNode)`: a code block for a `
` in a + /// monospace font. + fn convert_div_element( + dom_node: &DomNode, + ) -> Result, LexicalError> { + let is_code = is_code_element(dom_node); + Ok(Some(DomConversionOutput::node( + is_code.then(|| create_code_node(None, None)), + ))) + } + + /// `isCodeElement(div)`: `font-family` names `monospace`. + fn is_code_element(div: &DomNode) -> bool { + div.style() + .get_property_value("font-family") + .contains("monospace") + } + + /// `isGitHubCodeCell(cell)`. + fn is_git_hub_code_cell(cell: &DomNode) -> bool { + cell.class_list().contains("js-file-line") + } + + /// `isGitHubCodeTable(table)`. + fn is_git_hub_code_table(table: &DomNode) -> bool { + table.class_list().contains("js-file-line-container") + } +} diff --git a/rust/lexical-editor/src/extension/decorator_text_extension.rs b/rust/lexical-editor/src/extension/decorator_text_extension.rs index e7947a32e481..010240e5b899 100644 --- a/rust/lexical-editor/src/extension/decorator_text_extension.rs +++ b/rust/lexical-editor/src/extension/decorator_text_extension.rs @@ -75,6 +75,16 @@ impl LexicalNode for DecoratorTextNode { fn get_type(&self) -> &'static str { "decorator-text" } + /// `DecoratorTextNode.createDOM()`: a ``. + #[cfg(feature = "html")] + fn create_dom( + &self, + _this: &NodeRef, + _config: &crate::EditorConfig, + _editor: &crate::Editor, + ) -> Result { + Ok(crate::lexical_dom::get_document().create_element("span")) + } fn base(&self) -> &NodeBase { &self.base } @@ -114,3 +124,83 @@ impl LexicalNode for DecoratorTextNode { } fn update_from_json(&mut self, _json: &Object) {} } + +/// `applyFormatFromStyle(lexicalNode, style, shouldApply)` (the `html` +/// feature): gives the decorator text node the formats a Google Docs style +/// implies (bold, strikethrough, italic, underline, subscript, +/// superscript), and `should_apply`, as `TextNode`'s import does. +#[cfg(feature = "html")] +pub fn apply_format_from_style( + lexical_node: &NodeRef, + style: &crate::dom::CssStyle, + should_apply: Option<&str>, +) -> Result<(), LexicalError> { + let font_weight = style.get_property_value("font-weight"); + let text_decoration = style.get_property_value("text-decoration"); + let text_decoration: Vec<&str> = text_decoration.split(' ').collect(); + let vertical_align = style.get_property_value("vertical-align"); + let mut formats = Vec::new(); + if font_weight == "700" || font_weight == "bold" { + formats.push("bold"); + } + if text_decoration.contains(&"line-through") { + formats.push("strikethrough"); + } + if style.get_property_value("font-style") == "italic" { + formats.push("italic"); + } + if text_decoration.contains(&"underline") { + formats.push("underline"); + } + if vertical_align == "sub" { + formats.push("subscript"); + } + if vertical_align == "super" { + formats.push("superscript"); + } + formats.extend(should_apply); + for format in formats { + if !DecoratorTextNode::has_format(lexical_node, format)? { + DecoratorTextNode::toggle_format(lexical_node, format)?; + } + } + Ok(()) +} + +/// `DEFAULT_TAG_NAME_TO_FORMAT`. +#[cfg(feature = "html")] +pub const DEFAULT_TAG_NAME_TO_FORMAT: &[(&str, &str)] = &[ + ("b", "bold"), + ("code", "code"), + ("em", "italic"), + ("i", "italic"), + ("mark", "highlight"), + ("s", "strikethrough"), + ("strong", "bold"), + ("sub", "subscript"), + ("sup", "superscript"), + ("u", "underline"), +]; + +/// `applyFormatToDom(lexicalNode, domNode, tagNameToFormat)` (the `html` +/// feature): `dom_node` inside an element of each tag whose format the +/// node has, in the table's order. +#[cfg(feature = "html")] +pub fn apply_format_to_dom( + lexical_node: &NodeRef, + dom_node: &crate::dom::DomNode, + tag_name_to_format: &[(&str, &str)], +) -> Result { + let mut rval = dom_node.clone(); + for (tag, format) in tag_name_to_format { + if DecoratorTextNode::has_format(lexical_node, format)? { + let el = rval + .owner_document() + .unwrap_or_else(crate::lexical_dom::get_document) + .create_element(tag); + el.append_child(&rval); + rval = el; + } + } + Ok(rval) +} diff --git a/rust/lexical-editor/src/extension/horizontal_rule_extension.rs b/rust/lexical-editor/src/extension/horizontal_rule_extension.rs index 3643cf247973..1ab3ab0199b6 100644 --- a/rust/lexical-editor/src/extension/horizontal_rule_extension.rs +++ b/rust/lexical-editor/src/extension/horizontal_rule_extension.rs @@ -27,6 +27,42 @@ impl LexicalNode for HorizontalRuleNode { fn get_type(&self) -> &'static str { "horizontalrule" } + /// `HorizontalRuleNode.createDOM(config)`: an `
` with the theme's + /// `hr` class names. + #[cfg(feature = "html")] + fn create_dom( + &self, + _this: &NodeRef, + config: &crate::EditorConfig, + _editor: &crate::Editor, + ) -> Result { + let element = crate::lexical_dom::get_document().create_element("hr"); + crate::lexical_dom::add_theme_class_names(&element, &config.theme, "hr"); + Ok(element) + } + /// `HorizontalRuleNode.exportDOM()`: a bare `
`. + #[cfg(feature = "html")] + fn export_dom( + &self, + _this: &NodeRef, + _editor: &crate::Editor, + ) -> Result { + Ok(crate::lexical_dom::DomExportOutput::element( + crate::lexical_dom::get_document().create_element("hr"), + )) + } + /// `HorizontalRuleNode`'s `importDOM`: `
`. + #[cfg(feature = "html")] + fn import_dom(&self) -> Option { + Some(vec![( + "hr".to_owned(), + crate::lexical_dom::importer(0, |_| { + Ok(Some(crate::lexical_dom::DomConversionOutput::node(Some( + create_horizontal_rule_node(), + )))) + }), + )]) + } fn base(&self) -> &NodeBase { &self.base } diff --git a/rust/lexical-editor/src/extension/mod.rs b/rust/lexical-editor/src/extension/mod.rs index 38abdf1d945d..5c2059a6ab94 100644 --- a/rust/lexical-editor/src/extension/mod.rs +++ b/rust/lexical-editor/src/extension/mod.rs @@ -17,6 +17,10 @@ mod decorator_text_extension; mod horizontal_rule_extension; +#[cfg(feature = "html")] +pub use decorator_text_extension::{ + DEFAULT_TAG_NAME_TO_FORMAT, apply_format_from_style, apply_format_to_dom, +}; pub use decorator_text_extension::{ DecoratorTextNode, create_decorator_text_node, decorator_text_format_state, is_decorator_text_node, diff --git a/rust/lexical-editor/src/hashtag/lexical_hashtag_node.rs b/rust/lexical-editor/src/hashtag/lexical_hashtag_node.rs index 805667684abe..f85aa0b740c1 100644 --- a/rust/lexical-editor/src/hashtag/lexical_hashtag_node.rs +++ b/rust/lexical-editor/src/hashtag/lexical_hashtag_node.rs @@ -42,6 +42,19 @@ impl LexicalNode for HashtagNode { fn get_type(&self) -> &'static str { "hashtag" } + /// `HashtagNode.createDOM(config)`: `TextNode`'s, with the theme's + /// `hashtag` class names. + #[cfg(feature = "html")] + fn create_dom( + &self, + _this: &NodeRef, + config: &crate::EditorConfig, + _editor: &crate::Editor, + ) -> Result { + let element = crate::nodes::text::create_dom(self, config)?; + crate::lexical_dom::add_theme_class_names(&element, &config.theme, "hashtag"); + Ok(element) + } fn base(&self) -> &NodeBase { &self.base } diff --git a/rust/lexical-editor/src/lexical_dom.rs b/rust/lexical-editor/src/lexical_dom.rs index 79e7afea5c4a..1e42fe9d7b9e 100644 --- a/rust/lexical-editor/src/lexical_dom.rs +++ b/rust/lexical-editor/src/lexical_dom.rs @@ -364,6 +364,27 @@ pub fn theme_string<'a>(theme: &'a Object, key: &str) -> Option<&'a str> { theme.get(key).and_then(Value::as_str) } +/// `addClassNamesToElement(element, theme[key])`: the class names of a +/// theme entry that is a string (any other kind adds none). +pub fn add_theme_class_names(element: &DomNode, theme: &Object, key: &str) { + if let Some(class_names) = theme_string(theme, key) { + add_class_names_to_element(element, &[class_names]); + } +} + +/// `element.closest(tag)` for a lower-case tag name: the element or its +/// nearest ancestor with that name. +pub fn closest(element: &DomNode, tag: &str) -> Option { + let mut node = Some(element.clone()); + while let Some(n) = node { + if n.is_element() && n.local_name() == tag { + return Some(n); + } + node = n.parent_element(); + } + None +} + /// `removeEmptyDOMAttribute(dom, attributeName)`. pub fn remove_empty_dom_attribute(dom: &DomNode, attribute_name: &str) { if dom.get_attribute(attribute_name).as_deref() == Some("") { diff --git a/rust/lexical-editor/src/link/link_node.rs b/rust/lexical-editor/src/link/link_node.rs index ef3da39cfae6..4047c10aa72d 100644 --- a/rust/lexical-editor/src/link/link_node.rs +++ b/rust/lexical-editor/src/link/link_node.rs @@ -300,6 +300,19 @@ impl LexicalNode for LinkNode { fn get_type(&self) -> &'static str { "link" } + #[cfg(feature = "html")] + fn create_dom( + &self, + _this: &NodeRef, + config: &crate::EditorConfig, + _editor: &crate::Editor, + ) -> Result { + Ok(link_dom::create_dom(self, config)) + } + #[cfg(feature = "html")] + fn import_dom(&self) -> Option { + Some(link_dom::import_dom()) + } fn base(&self) -> &NodeBase { &self.base } @@ -378,6 +391,20 @@ impl LexicalNode for AutoLinkNode { fn get_type(&self) -> &'static str { "autolink" } + /// `AutoLinkNode.createDOM(config)`: a `` once unlinked, else + /// `LinkNode`'s ``. + #[cfg(feature = "html")] + fn create_dom( + &self, + _this: &NodeRef, + config: &crate::EditorConfig, + _editor: &crate::Editor, + ) -> Result { + if self.is_unlinked { + return Ok(crate::lexical_dom::get_document().create_element("span")); + } + Ok(link_dom::create_dom(&self.link, config)) + } fn base(&self) -> &NodeBase { &self.link.base } @@ -1036,3 +1063,192 @@ mod tests { } } } + +// The DOM side of `LinkNode` and `AutoLinkNode` (the `html` feature). + +#[cfg(feature = "html")] +pub(super) mod link_dom { + use super::{LinkNode, create_link_node, format_url, is_js_whitespace}; + use crate::dom::DomNode; + use crate::lexical_dom::{ + DomConversionMap, DomConversionOutput, add_theme_class_names, get_document, importer, + }; + use crate::{EditorConfig, LexicalError}; + + /// `SUPPORTED_URL_PROTOCOLS`. + const SUPPORTED_URL_PROTOCOLS: [&str; 5] = ["http:", "https:", "mailto:", "sms:", "tel:"]; + + /// The scheme `/^([a-z][a-z0-9+.-]*):/i` matches at the start. + fn leading_scheme(url: &str) -> Option<&str> { + let end = url.find(':')?; + let scheme = &url[..end]; + let mut chars = scheme.chars(); + (chars.next()?.is_ascii_alphabetic() + && chars.all(|c| c.is_ascii_alphanumeric() || matches!(c, '+' | '.' | '-'))) + .then_some(scheme) + } + + /// The `protocol` of `new URL(url)`, or `None` where it throws. Like + /// Swift's (`swift/Sources/LexicalLink/LinkNode.swift`), this follows + /// the WHATWG URL parser as far as an absolute URL's scheme and host + /// decide whether it parses, without IDNA or IPv4 parsing. + fn whatwg_url_protocol(url: &str) -> Option { + let trimmed = url.trim_matches(|c: char| c <= ' '); + let input: String = trimmed + .chars() + .filter(|c| !matches!(c, '\t' | '\n' | '\r')) + .collect(); + let scheme = leading_scheme(&input)?.to_ascii_lowercase(); + let is_special = ["http", "https", "ws", "wss", "ftp", "file"].contains(&scheme.as_str()); + let mut rest = &input[scheme.len() + 1..]; + if is_special { + if scheme == "file" { + return Some("file:".to_owned()); + } + rest = rest.trim_start_matches(['/', '\\']); + } else if let Some(r) = rest.strip_prefix("//") { + rest = r; + } else { + return Some(format!("{scheme}:")); + } + let authority_end = rest + .find(|c| matches!(c, '/' | '?' | '#') || (is_special && c == '\\')) + .unwrap_or(rest.len()); + let mut authority = &rest[..authority_end]; + if let Some(at) = authority.rfind('@') { + authority = &authority[at + 1..]; + } + let mut host = authority; + let mut port = None; + if host.starts_with('[') { + let close = host.find(']')?; + let after = &host[close + 1..]; + if let Some(p) = after.strip_prefix(':') { + port = Some(p); + } else if !after.is_empty() { + return None; + } + host = &host[..=close]; + } else if let Some(colon) = host.find(':') { + port = Some(&host[colon + 1..]); + host = &host[..colon]; + } + if let Some(port) = port.filter(|p| !p.is_empty()) + && (!port.bytes().all(|b| b.is_ascii_digit()) + || port.trim_start_matches('0').len() > 5 + || port.trim_start_matches('0').parse::().unwrap_or(0) > 65535) + { + return None; + } + if host.is_empty() { + return if is_special || port.is_some() { + None + } else { + Some(format!("{scheme}:")) + }; + } + if !host.starts_with('[') { + let forbidden = |c: char| { + matches!( + c, + '\0' | '\t' + | '\n' + | '\r' + | ' ' + | '#' + | '/' + | ':' + | '<' + | '>' + | '?' + | '@' + | '[' + | '\\' + | ']' + | '^' + | '|' + ) || (is_special && (c <= '\u{1f}' || c == '%' || c == '\u{7f}')) + }; + if host.chars().any(forbidden) { + return None; + } + } + Some(format!("{scheme}:")) + } + + /// `LinkNode.sanitizeUrl(url)`: `about:blank` for a URL whose scheme + /// isn't supported, else the URL with `formatUrl`'s protocol. + pub fn sanitize_url(url: &str) -> String { + let raw_url = url; + let url = format_url(url); + match whatwg_url_protocol(&format_url(&url)) { + Some(protocol) => { + if !SUPPORTED_URL_PROTOCOLS.contains(&protocol.as_str()) { + return "about:blank".to_owned(); + } + } + None => { + // `new URL()` threw: an explicit scheme in the input, once + // C0 controls, DEL and whitespace are dropped, that isn't + // supported is neutralized. + let normalized: String = raw_url + .chars() + .filter(|&c| !(c <= '\u{1f}' || c == '\u{7f}' || is_js_whitespace(c))) + .collect(); + if let Some(scheme) = leading_scheme(&normalized) { + let protocol = format!("{}:", scheme.to_ascii_lowercase()); + if !SUPPORTED_URL_PROTOCOLS.contains(&protocol.as_str()) { + return "about:blank".to_owned(); + } + } + } + } + url + } + + /// `LinkNode.createDOM(config)`: an `` with the sanitized URL, the + /// target, rel and title it has (`updateLinkDOM(null, ...)`), and the + /// theme's `link` class names. + pub(crate) fn create_dom(link: &LinkNode, config: &EditorConfig) -> DomNode { + let element = get_document().create_element("a"); + element.set_attribute("href", &sanitize_url(&link.url)); + for (attr, value) in [ + ("target", &link.target), + ("rel", &link.rel), + ("title", &link.title), + ] { + match value.as_deref().filter(|v| !v.is_empty()) { + Some(value) => element.set_attribute(attr, value), + None => element.remove_attribute(attr), + } + } + add_theme_class_names(&element, &config.theme, "link"); + element + } + + /// `LinkNode`'s `importDOM`: ``. + pub(crate) fn import_dom() -> DomConversionMap { + vec![("a".to_owned(), importer(1, convert_anchor_element))] + } + + /// `$convertAnchorElement(domNode)`: a link for an `` with content. + fn convert_anchor_element( + dom_node: &DomNode, + ) -> Result, LexicalError> { + let mut node = None; + if dom_node.is_element() + && dom_node.local_name() == "a" + && (!dom_node.text_content().is_empty() || !dom_node.children().is_empty()) + { + node = Some(create_link_node( + &dom_node.get_attribute("href").unwrap_or_default(), + &super::LinkAttributes { + rel: Some(dom_node.get_attribute("rel")), + target: Some(dom_node.get_attribute("target")), + title: Some(dom_node.get_attribute("title")), + }, + )); + } + Ok(Some(DomConversionOutput::node(node))) + } +} diff --git a/rust/lexical-editor/src/link/mod.rs b/rust/lexical-editor/src/link/mod.rs index 74219b788c71..00e62f91da51 100644 --- a/rust/lexical-editor/src/link/mod.rs +++ b/rust/lexical-editor/src/link/mod.rs @@ -28,6 +28,8 @@ pub use auto_link_extension::{ }; pub use link_extension::{LinkConfig, register_link}; +#[cfg(feature = "html")] +pub use link_node::link_dom::sanitize_url; pub use link_node::{ AutoLinkAttributes, AutoLinkNode, LinkAttributes, LinkNode, TOGGLE_LINK_COMMAND, ToggleLinkPayload, create_auto_link_node, create_link_node, format_url, is_auto_link_node, diff --git a/rust/lexical-editor/src/list/list_item_node.rs b/rust/lexical-editor/src/list/list_item_node.rs index 1da83af70032..8bc584210ff5 100644 --- a/rust/lexical-editor/src/list/list_item_node.rs +++ b/rust/lexical-editor/src/list/list_item_node.rs @@ -152,6 +152,27 @@ impl LexicalNode for ListItemNode { fn get_type(&self) -> &'static str { "listitem" } + #[cfg(feature = "html")] + fn create_dom( + &self, + this: &NodeRef, + config: &crate::EditorConfig, + _editor: &crate::Editor, + ) -> Result { + list_item_dom::create_dom(self, this, config) + } + #[cfg(feature = "html")] + fn export_dom( + &self, + this: &NodeRef, + editor: &crate::Editor, + ) -> Result { + list_item_dom::export_dom(self, this, editor) + } + #[cfg(feature = "html")] + fn import_dom(&self) -> Option { + Some(list_item_dom::import_dom()) + } fn base(&self) -> &NodeBase { &self.base } @@ -482,3 +503,245 @@ impl LexicalNode for ListItemNode { Ok(()) } } + +// The DOM side of `ListItemNode` (the `html` feature). + +#[cfg(feature = "html")] +pub(super) mod list_item_dom { + use super::super::list_node::{ListType, is_list_node}; + use super::super::utils::is_nested_list_node; + use super::{ListItemNode, create_list_item_node}; + use crate::dom::DomNode; + use crate::json::{Object, Value}; + use crate::lexical_dom::{ + DomConversionNode, DomConversionOutput, DomExportOutput, get_document, + normalize_class_names, set_direction_from_dom, set_format_from_dom, + }; + use crate::node::NodeRef; + use crate::nodes::paragraph::ParagraphNode; + use crate::set_dom_style::{get_style_object_from_css, set_dom_style_from_css}; + use crate::{EditorConfig, LexicalError}; + + /// `ListItemNode.createDOM(config)`: an `
  • `, through + /// `updateListItemDOM(null, element, config)`. + pub(crate) fn create_dom( + node: &ListItemNode, + this: &NodeRef, + config: &EditorConfig, + ) -> Result { + let dom = get_document().create_element("li"); + update_list_item_checked(&dom, node, this); + // `dom.value = this.__value`: a `long`, written as its attribute. + dom.set_attribute( + "value", + &crate::nodes::text::to_int32(node.value).to_string(), + ); + set_list_item_theme_class_names(&dom, &config.theme, node, this); + let style = node.element.get_style(); + if !style.is_empty() { + set_dom_style_from_css(&dom.style(), style, ""); + } + apply_marker_styles(&dom, node); + Ok(dom) + } + + /// `applyMarkerStyles(dom, node, null)`: the text style as + /// `--listitem-marker-*` properties. + fn apply_marker_styles(dom: &DomNode, node: &ListItemNode) { + let style = dom.style(); + for (k, v) in get_style_object_from_css(node.element.get_text_style()).iter() { + style.set_property(&format!("--listitem-marker-{k}"), v, ""); + } + } + + /// `ListItemNode.exportDOM(editor)`: `createDOM`'s element with the + /// alignment and the direction. A nested list's item moves its + /// children into the item before it. + pub(crate) fn export_dom( + node: &ListItemNode, + this: &NodeRef, + editor: &crate::Editor, + ) -> Result { + let element = create_dom(node, this, editor.config())?; + let format_type = node.element.get_format_type(); + if !format_type.is_empty() { + element.style().set_property("text-align", format_type, ""); + } + if let Some(direction) = node.element.get_direction() { + element.set_dir(direction.as_str()); + } + if is_nested_list_node(this) { + return Ok(DomExportOutput { + element: Some(element), + after: Some(Box::new(|container: &DomNode| { + if container.is_element() + && let Some(prev_sibling) = container.previous_element_sibling() + && prev_sibling.node_name() == "LI" + { + while let Some(child) = container.first_child() { + prev_sibling.append_child(&child); + } + container.remove(); + } + Ok(Some(container.clone())) + })), + ..DomExportOutput::default() + }); + } + Ok(DomExportOutput::element(element)) + } + + fn class_names_of(value: Option<&Value>) -> Vec { + value + .and_then(Value::as_str) + .map(|v| normalize_class_names(&[v])) + .unwrap_or_default() + } + + /// `$setListItemThemeClassNames(dom, editorThemeClasses, node)`. + fn set_list_item_theme_class_names( + dom: &DomNode, + theme: &Object, + node: &ListItemNode, + this: &NodeRef, + ) { + let Some(list_theme) = theme.get("list").filter(|t| { + !matches!(t, Value::Undefined | Value::Null | Value::Bool(false)) + && t.as_str() != Some("") + }) else { + return; + }; + let list_item_class_name = list_theme.get("listitem"); + let nested_list_item_class_name = list_theme.get("nested").and_then(|n| n.get("listitem")); + let parent = this.get_parent(); + let is_check_list = parent + .as_ref() + .is_some_and(|p| p.get_list_type() == Some(ListType::Check)); + let checked = node.checked == Some(true); + let is_nested = this.get_children().iter().any(is_list_node); + let mut classes_to_remove = class_names_of(list_theme.get("listitemChecked")); + classes_to_remove.extend(class_names_of(list_theme.get("listitemUnchecked"))); + classes_to_remove.extend(class_names_of(nested_list_item_class_name)); + if !classes_to_remove.is_empty() { + dom.class_list().remove(&classes_to_remove); + } + let mut classes_to_add = class_names_of(list_item_class_name); + if is_check_list { + let key = if checked { + "listitemChecked" + } else { + "listitemUnchecked" + }; + classes_to_add.extend(class_names_of(list_theme.get(key))); + } + if is_nested { + classes_to_add.extend(class_names_of(nested_list_item_class_name)); + } + if !classes_to_add.is_empty() { + dom.class_list().add(&classes_to_add); + } + } + + /// `updateListItemChecked(dom, listItemNode, null)`: a leaf item of a + /// check list is a checkbox. + fn update_list_item_checked(dom: &DomNode, node: &ListItemNode, this: &NodeRef) { + let is_checkbox = this + .get_parent() + .is_some_and(|p| p.get_list_type() == Some(ListType::Check)) + && !this.get_first_child().is_some_and(|c| is_list_node(&c)); + if !is_checkbox { + dom.remove_attribute("role"); + dom.remove_attribute("tabIndex"); + dom.remove_attribute("aria-checked"); + } else { + dom.set_attribute("role", "checkbox"); + dom.set_attribute("tabIndex", "-1"); + dom.set_attribute( + "aria-checked", + if node.checked == Some(true) { + "true" + } else { + "false" + }, + ); + } + } + + /// `ListItemNode`'s `importDOM`: `
  • `. + pub(crate) fn import_dom() -> crate::lexical_dom::DomConversionMap { + vec![( + "li".to_owned(), + crate::lexical_dom::importer(0, convert_list_item_element), + )] + } + + /// `$convertListItemElement(domNode)`: a list item, checked or not for + /// a GitHub or Joplin task item or an `aria-checked` one. + fn convert_list_item_element( + dom_node: &DomNode, + ) -> Result, LexicalError> { + if dom_node.class_list().contains("task-list-item") { + for child in dom_node.children() { + if child.tag_name() == "INPUT" { + return convert_checkbox_input(&child); + } + } + } + if dom_node.class_list().contains("joplin-checkbox") { + for child in dom_node.children() { + let grandchildren = child.children(); + if child.class_list().contains("checkbox-wrapper") + && grandchildren + .first() + .is_some_and(|c| c.tag_name() == "INPUT") + { + return convert_checkbox_input(&grandchildren[0]); + } + } + } + let checked = match dom_node.get_attribute("aria-checked").as_deref() { + Some("true") => Some(true), + Some("false") => Some(false), + _ => None, + }; + let node = create_list_item_node(checked); + set_format_from_dom(&node, dom_node); + set_direction_from_dom(&node, dom_node); + Ok(Some(with_format_from_children(node))) + } + + /// `$convertCheckboxInput(domNode)`. + fn convert_checkbox_input( + dom_node: &DomNode, + ) -> Result, LexicalError> { + if dom_node.get_attribute("type").as_deref() != Some("checkbox") { + return Ok(Some(DomConversionOutput::node(None))); + } + let node = create_list_item_node(Some(dom_node.has_attribute("checked"))); + Ok(Some(with_format_from_children(node))) + } + + /// `{after: setFormatFromChildren.bind(null, node), node}`: an item + /// whose one child is an aligned paragraph (as Google Docs writes) + /// takes the paragraph's alignment and its children. + fn with_format_from_children(node: NodeRef) -> DomConversionOutput { + let list_item_node = node.clone(); + DomConversionOutput { + node: DomConversionNode::One(node), + after: Some(Box::new(move |children: Vec| { + if let [first_child] = children.as_slice() + && first_child.get_latest().is::() + && list_item_node.element_data().get_format_type().is_empty() + { + let format_type = first_child.element_data().get_format_type(); + if !format_type.is_empty() { + list_item_node.set_element_format(format_type); + return Ok(first_child.get_children()); + } + } + Ok(children) + })), + ..DomConversionOutput::default() + } + } +} diff --git a/rust/lexical-editor/src/list/list_node.rs b/rust/lexical-editor/src/list/list_node.rs index 5684a475bab5..4cd480f4a8ce 100644 --- a/rust/lexical-editor/src/list/list_node.rs +++ b/rust/lexical-editor/src/list/list_node.rs @@ -140,6 +140,27 @@ impl LexicalNode for ListNode { fn get_type(&self) -> &'static str { "list" } + #[cfg(feature = "html")] + fn create_dom( + &self, + this: &NodeRef, + config: &crate::EditorConfig, + _editor: &crate::Editor, + ) -> Result { + list_dom::create_dom(self, this, config) + } + #[cfg(feature = "html")] + fn export_dom( + &self, + this: &NodeRef, + editor: &crate::Editor, + ) -> Result { + list_dom::export_dom(self, this, editor) + } + #[cfg(feature = "html")] + fn import_dom(&self) -> Option { + Some(list_dom::import_dom()) + } fn base(&self) -> &NodeBase { &self.base } @@ -216,3 +237,213 @@ impl LexicalNode for ListNode { Ok(()) } } + +// The DOM side of `ListNode` (the `html` feature). + +#[cfg(feature = "html")] +pub(super) mod list_dom { + use super::super::list_item_node::{create_list_item_node, is_list_item_node}; + use super::super::utils::get_list_depth; + use super::{ListNode, ListType, create_list_node, is_list_node}; + use crate::dom::DomNode; + use crate::json::{Object, Value}; + use crate::lexical_dom::{ + DomConversionMap, DomConversionNode, DomConversionOutput, DomExportOutput, get_document, + importer, normalize_class_names, set_direction_from_dom, + }; + use crate::node::NodeRef; + use crate::{EditorConfig, LexicalError}; + + /// `ListNode.createDOM(config)`: an `
      ` or `
        `, with `start` + /// when it isn't 1 and the theme's class names. + pub(crate) fn create_dom( + node: &ListNode, + this: &NodeRef, + config: &EditorConfig, + ) -> Result { + let dom = get_document().create_element(node.list_type.tag()); + if node.start != 1.0 { + dom.set_attribute("start", &crate::json::number_to_string(node.start)); + } + set_list_theme_class_names(&dom, &config.theme, node, this)?; + Ok(dom) + } + + /// `ListNode.exportDOM(editor)`: `createDOM`'s element, with + /// `__lexicalListType` for a check list and the direction. + pub(crate) fn export_dom( + node: &ListNode, + this: &NodeRef, + editor: &crate::Editor, + ) -> Result { + let element = create_dom(node, this, editor.config())?; + if node.start != 1.0 { + element.set_attribute("start", &crate::json::number_to_string(node.start)); + } + if node.list_type == ListType::Check { + element.set_attribute("__lexicalListType", "check"); + } + if let Some(direction) = node.element.get_direction() { + element.set_dir(direction.as_str()); + } + Ok(DomExportOutput::element(element)) + } + + /// The strings `normalizeClassNames(value)` takes from a theme value: + /// none unless it is a string. + fn class_names_of(value: Option<&Value>) -> Vec { + value + .and_then(Value::as_str) + .map(|v| normalize_class_names(&[v])) + .unwrap_or_default() + } + + /// `$setListThemeClassNames(dom, editorThemeClasses, node)`. + fn set_list_theme_class_names( + dom: &DomNode, + theme: &Object, + node: &ListNode, + this: &NodeRef, + ) -> Result<(), LexicalError> { + let mut classes_to_add: Vec = Vec::new(); + let mut classes_to_remove: Vec = Vec::new(); + if let Some(list_theme) = theme.get("list").filter(|v| !v.is_undefined()) { + let tag = node.list_type.tag(); + let empty = Vec::new(); + let list_levels_class_names = list_theme + .get(&format!("{tag}Depth")) + .and_then(Value::as_array) + .unwrap_or(&empty); + // `$getListDepth(node) - 1`, and `%` by the number of level + // classes (`NaN`, matching none, when there are none). + let list_depth = get_list_depth(this)? as i64 - 1; + let normalized_list_depth = (!list_levels_class_names.is_empty()) + .then(|| list_depth.rem_euclid(list_levels_class_names.len() as i64) as usize); + let list_level_class_name = + normalized_list_depth.and_then(|i| list_levels_class_names.get(i)); + if let Some(list_class_name) = list_theme.get(tag) { + classes_to_add.extend(class_names_of(Some(list_class_name))); + } + if node.list_type == ListType::Check { + classes_to_add.extend(class_names_of(list_theme.get("checklist"))); + } + if let Some(list_level_class_name) = list_level_class_name { + classes_to_add.extend(class_names_of(Some(list_level_class_name))); + for (i, class_name) in list_levels_class_names.iter().enumerate() { + if Some(i) != normalized_list_depth { + classes_to_remove.extend(class_names_of(Some(class_name))); + } + } + } + let nested_list_class_name = list_theme + .get("nested") + .and_then(|n| n.get("list")) + .filter(|l| l.as_str().is_some_and(|s| !s.is_empty())); + if nested_list_class_name.is_some() { + let nested_list_item_classes = class_names_of(nested_list_class_name); + if list_depth > 1 { + classes_to_add.extend(nested_list_item_classes); + } else { + classes_to_remove.extend(nested_list_item_classes); + } + } + } + if !classes_to_remove.is_empty() { + dom.class_list().remove(&classes_to_remove); + } + if !classes_to_add.is_empty() { + dom.class_list().add(&classes_to_add); + } + Ok(()) + } + + /// `ListNode`'s `importDOM`: `
          ` and `
            `. + pub(crate) fn import_dom() -> DomConversionMap { + vec![ + ("ol".to_owned(), importer(0, convert_list_node)), + ("ul".to_owned(), importer(0, convert_list_node)), + ] + } + + /// `$normalizeChildren(nodes, listNode)`: the children of a list made + /// from HTML, each a list item holding one nested list or inline + /// content. + fn normalize_children(nodes: Vec) -> Result, LexicalError> { + let mut normalized_list_items = Vec::new(); + for node in nodes { + if is_list_item_node(&node) { + normalized_list_items.push(node.clone()); + let children = node.get_children(); + if children.len() > 1 { + for child in children { + if is_list_node(&child) { + let wrapper = create_list_item_node(None); + wrapper.append(&[child])?; + normalized_list_items.push(wrapper); + } + } + } + } else { + let wrapper = create_list_item_node(None); + wrapper.append(&[node])?; + normalized_list_items.push(wrapper); + } + } + Ok(normalized_list_items) + } + + /// `isDomChecklist(domNode)`: a Lexical, GitHub, Joplin or Google Docs + /// check list. + fn is_dom_checklist(dom_node: &DomNode) -> bool { + if dom_node.get_attribute("__lexicallisttype").as_deref() == Some("check") + || dom_node.class_list().contains("contains-task-list") + || dom_node.get_attribute("data-is-checklist").as_deref() == Some("1") + { + return true; + } + dom_node + .child_nodes() + .iter() + .any(|child| child.is_element() && child.has_attribute("aria-checked")) + } + + /// `HTMLOListElement.start`: the `start` attribute by the HTML rules + /// for parsing integers, or 1. + pub(crate) fn ol_start(element: &DomNode) -> f64 { + let Some(value) = element.get_attribute("start") else { + return 1.0; + }; + let rest = value.trim_start_matches([' ', '\t', '\n', '\u{c}', '\r']); + let (sign, rest) = match rest.as_bytes().first() { + Some(b'-') => (-1, &rest[1..]), + Some(b'+') => (1, &rest[1..]), + _ => (1, rest), + }; + let digits = &rest[..rest + .bytes() + .position(|b| !b.is_ascii_digit()) + .unwrap_or(rest.len())]; + match digits.parse::() { + Ok(n) if (-2_147_483_648..=2_147_483_647).contains(&(sign * n)) => (sign * n) as f64, + _ => 1.0, + } + } + + /// `$convertListNode(domNode)`: a numbered list from `
              `, a check + /// list or a bullet list from `
                `, whose children become list items. + fn convert_list_node(dom_node: &DomNode) -> Result, LexicalError> { + let node = if dom_node.is_element() && dom_node.local_name() == "ol" { + create_list_node(ListType::Number, ol_start(dom_node)) + } else if is_dom_checklist(dom_node) { + create_list_node(ListType::Check, 1.0) + } else { + create_list_node(ListType::Bullet, 1.0) + }; + set_direction_from_dom(&node, dom_node); + Ok(Some(DomConversionOutput { + node: DomConversionNode::One(node), + after: Some(Box::new(normalize_children)), + ..DomConversionOutput::default() + })) + } +} diff --git a/rust/lexical-editor/src/overflow/mod.rs b/rust/lexical-editor/src/overflow/mod.rs index f060b92d2bc8..d1732f056940 100644 --- a/rust/lexical-editor/src/overflow/mod.rs +++ b/rust/lexical-editor/src/overflow/mod.rs @@ -49,6 +49,22 @@ impl LexicalNode for OverflowNode { fn get_type(&self) -> &'static str { "overflow" } + /// `OverflowNode.createDOM(config)`: a `` whose class is the + /// theme's `characterLimit`. + #[cfg(feature = "html")] + fn create_dom( + &self, + _this: &NodeRef, + config: &crate::EditorConfig, + _editor: &crate::Editor, + ) -> Result { + let span = crate::lexical_dom::get_document().create_element("span"); + if let Some(class_name) = crate::lexical_dom::theme_string(&config.theme, "characterLimit") + { + span.set_class_name(class_name); + } + Ok(span) + } fn base(&self) -> &NodeBase { &self.base } diff --git a/rust/lexical-editor/src/rich_text.rs b/rust/lexical-editor/src/rich_text.rs index 3850fd890cee..23187e8b4111 100644 --- a/rust/lexical-editor/src/rich_text.rs +++ b/rust/lexical-editor/src/rich_text.rs @@ -145,6 +145,36 @@ impl LexicalNode for HeadingNode { fn get_type(&self) -> &'static str { "heading" } + /// `HeadingNode.createDOM(config)`: an `

                ` to `

                ` with the + /// theme's `heading[tag]` class names. + #[cfg(feature = "html")] + fn create_dom( + &self, + _this: &NodeRef, + config: &crate::EditorConfig, + _editor: &Editor, + ) -> Result { + let tag = self.tag.as_str(); + let element = crate::lexical_dom::get_document().create_element(tag); + if let Some(Value::Object(class_names)) = config.theme.get("heading") { + crate::lexical_dom::add_theme_class_names(&element, class_names, tag); + } + Ok(element) + } + #[cfg(feature = "html")] + fn export_dom( + &self, + this: &NodeRef, + editor: &Editor, + ) -> Result { + rich_text_dom::export_block_dom(self, this, editor) + } + /// `HeadingNode`'s `importDOM`: `

                ` to `

                `, and a Google Docs + /// title (a `` of `font-size: 26pt`, and the `

                ` around one). + #[cfg(feature = "html")] + fn import_dom(&self) -> Option { + Some(rich_text_dom::heading_import_dom()) + } /// `HeadingNode.extractWithChild()`: a heading always goes with a /// child that is copied. fn extract_with_child( @@ -285,6 +315,35 @@ impl LexicalNode for QuoteNode { fn get_type(&self) -> &'static str { "quote" } + /// `QuoteNode.createDOM(config)`: a `

                ` with the theme's + /// `quote` class names. + #[cfg(feature = "html")] + fn create_dom( + &self, + _this: &NodeRef, + config: &crate::EditorConfig, + _editor: &Editor, + ) -> Result { + let element = crate::lexical_dom::get_document().create_element("blockquote"); + crate::lexical_dom::add_theme_class_names(&element, &config.theme, "quote"); + Ok(element) + } + #[cfg(feature = "html")] + fn export_dom( + &self, + this: &NodeRef, + editor: &Editor, + ) -> Result { + rich_text_dom::export_block_dom(self, this, editor) + } + /// `QuoteNode`'s `importDOM`: `
                `. + #[cfg(feature = "html")] + fn import_dom(&self) -> Option { + Some(vec![( + "blockquote".to_owned(), + crate::lexical_dom::importer(0, rich_text_dom::convert_blockquote_element), + )]) + } fn base(&self) -> &NodeBase { &self.base } @@ -381,6 +440,113 @@ fn range_selection() -> Option { get_selection().filter(SelectionRef::is_range) } +// The DOM side of `HeadingNode` and `QuoteNode` (the `html` feature). +#[cfg(feature = "html")] +mod rich_text_dom { + use super::{HeadingTagType, create_heading_node, create_quote_node}; + use crate::dom::DomNode; + use crate::lexical_dom::{ + DomConversion, DomConversionMap, DomConversionOutput, DomExportOutput, get_document, + importer, set_direction_from_dom, set_format_from_dom, set_node_indent_from_dom, + }; + use crate::node::{LexicalNode, NodeRef}; + use crate::{Editor, LexicalError}; + use std::rc::Rc; + + /// `HeadingNode.exportDOM(editor)` and `QuoteNode.exportDOM(editor)`: + /// `ElementNode`'s, with a `
                ` when empty, the alignment as + /// `text-align`, and the direction. + pub(super) fn export_block_dom( + node: &dyn LexicalNode, + this: &NodeRef, + editor: &Editor, + ) -> Result { + let output = crate::nodes::element::export_dom(node, this, editor)?; + if let Some(element) = output.element.as_ref().filter(|e| e.is_element()) { + if this.is_empty() { + element.append_child(&get_document().create_element("br")); + } + let data = node.element().expect("an element"); + let format_type = data.get_format_type(); + if !format_type.is_empty() { + element.style().set_property("text-align", format_type, ""); + } + if let Some(direction) = data.get_direction() { + element.set_dir(direction.as_str()); + } + } + Ok(DomExportOutput { + element: output.element, + ..DomExportOutput::default() + }) + } + + /// `isGoogleDocsTitle(domNode)`. + fn is_google_docs_title(dom_node: &DomNode) -> bool { + dom_node.node_name().eq_ignore_ascii_case("span") + && dom_node.style().get_property_value("font-size") == "26pt" + } + + pub(super) fn heading_import_dom() -> DomConversionMap { + let mut map: DomConversionMap = ["h1", "h2", "h3", "h4", "h5", "h6"] + .into_iter() + .map(|tag| (tag.to_owned(), importer(0, convert_heading_element))) + .collect(); + map.push(( + "p".to_owned(), + Rc::new(|node: &DomNode| { + let first_child = node.first_child()?; + is_google_docs_title(&first_child).then(|| DomConversion { + conversion: Rc::new(|_| Ok(Some(DomConversionOutput::node(None)))), + priority: 3, + }) + }), + )); + map.push(( + "span".to_owned(), + Rc::new(|node: &DomNode| { + is_google_docs_title(node).then(|| DomConversion { + conversion: Rc::new(|_| { + Ok(Some(DomConversionOutput::node(Some(create_heading_node( + HeadingTagType::H1, + ))))) + }), + priority: 3, + }) + }), + )); + map + } + + /// `$convertHeadingElement(element)`. + fn convert_heading_element( + element: &DomNode, + ) -> Result, LexicalError> { + let node = match HeadingTagType::parse(&element.node_name().to_lowercase()) { + Some(tag) => { + let node = create_heading_node(tag); + set_node_indent_from_dom(element, &node)?; + set_format_from_dom(&node, element); + set_direction_from_dom(&node, element); + Some(node) + } + None => None, + }; + Ok(Some(DomConversionOutput::node(node))) + } + + /// `$convertBlockquoteElement(element)`. + pub(super) fn convert_blockquote_element( + element: &DomNode, + ) -> Result, LexicalError> { + let node = create_quote_node(false); + set_format_from_dom(&node, element); + set_node_indent_from_dom(element, &node)?; + set_direction_from_dom(&node, element); + Ok(Some(DomConversionOutput::node(Some(node)))) + } +} + /// `registerRichText(editor)`: registers the rich text command handlers /// that act on the model, at `COMMAND_PRIORITY_EDITOR`, and returns what /// unregisters them. diff --git a/swift/Tests/ConformanceTests/HTMLImportTests.swift b/swift/Tests/ConformanceTests/HTMLImportTests.swift index a8df0c0abb2e..6cad793a5809 100644 --- a/swift/Tests/ConformanceTests/HTMLImportTests.swift +++ b/swift/Tests/ConformanceTests/HTMLImportTests.swift @@ -1,9 +1,18 @@ import Lexical +import LexicalCodeCore +import LexicalExtension import LexicalHTML +import LexicalHashtag +import LexicalLink +import LexicalList +import LexicalOverflow +import LexicalRichText import Testing -/// Replays `vectors/html/import.json`: `generateNodesFromDOM` makes the -/// same nodes from parsed HTML as `$generateNodesFromDOM` does in jsdom. +/// Replays `vectors/html/import.json` and `vectors/html/import-nodes.json`: +/// `generateNodesFromDOM` makes the same nodes from parsed HTML as +/// `$generateNodesFromDOM` does in jsdom, with the core nodes and with the +/// node packages' (those of `property/documents` and `HorizontalRuleNode`). @Suite(.enabled(if: Vectors.available)) struct HTMLImportTests { struct Case: Decodable, CustomTestStringConvertible, Sendable { @@ -13,10 +22,13 @@ struct HTMLImportTests { } static let cases: [Case] = (try? Vectors.load("html/import")) ?? [] + static let nodesCases: [Case] = (try? Vectors.load("html/import-nodes")) ?? [] @Test func vectorsLoad() throws { #expect(try Vectors.load("html/import", as: Case.self).count == Self.cases.count) #expect(!Self.cases.isEmpty) + #expect(try Vectors.load("html/import-nodes", as: Case.self).count == Self.nodesCases.count) + #expect(!Self.nodesCases.isEmpty) } /// A node and its subtree, as `exportJSON` writes each node. @@ -30,7 +42,23 @@ struct HTMLImportTests { @Test(arguments: cases) func importNodes(_ vector: Case) throws { - let editor = try createEditor(CreateEditorArgs(headless: true)) + try Self.check(vector, try createEditor(CreateEditorArgs(headless: true))) + } + + @Test(arguments: nodesCases) + func importPackageNodes(_ vector: Case) throws { + let nodes: [LexicalNode.Type] = [ + HeadingNode.self, QuoteNode.self, ListNode.self, ListItemNode.self, LinkNode.self, + AutoLinkNode.self, CodeNode.self, CodeHighlightNode.self, OverflowNode.self, + HashtagNode.self, HorizontalRuleNode.self, + ] + try Self.check( + vector, + try createEditor( + CreateEditorArgs(namespace: "", nodes: nodes.map { .klass($0) }, headless: true))) + } + + static func check(_ vector: Case, _ editor: Editor) throws { let dom = DOMParser().parseFromString(vector.html, "text/html") var nodes = "" try editor.update(