mindmap-cli 0.4.0

A CLI program for interacting with MINDMAP files, as described here: https://github.com/roobie/rfc/blob/main/mindmap/MINDMAP.md
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <style>:root {
  --color: black;
  --bg: white;
  --head-bg: white;
  --link: #338;

  --blue: #ccf;
  --red: #fcc;
  --yellow: #ffc;
  --green: #cfc;
}

[data-theme='dark'] {
  --color: white;
  --bg: black;
  --head-bg: #333;
  --link: #aaf;

  --blue: #225;
  --red: #522;
  --yellow: #552;
  --green: #252;
}

html,
body {
  margin: 0;
  padding: 0;
  color: var(--color);
  background: var(--bg);
}

.app {
  margin: 10px;
  padding: 0;
}

.files-list {
  margin: 10px 0 0;
  width: 100%;
  border-collapse: collapse;
}
.files-list__head {
  border: 1px solid #999;
}
.files-list__head > tr > th {
  padding: 10px;
  border: 1px solid #999;
  text-align: left;
  font-weight: normal;
  background: var(--head-bg);
}
.files-list__body {
}
.files-list__file {
  cursor: pointer;
}
.files-list__file:hover {
  background: var(--blue);
}
.files-list__file > td {
  padding: 10px;
  border: 1px solid #999;
}
.files-list__file > td:first-child::before {
  content: '\01F4C4';
  margin-right: 1em;
}
.files-list__file_low {
  background: var(--red);
}
.files-list__file_medium {
  background: var(--yellow);
}
.files-list__file_high {
  background: var(--green);
}
.files-list__file_folder > td:first-child::before {
  content: '\01F4C1';
  margin-right: 1em;
}

.file-header {
  border: 1px solid #999;
  display: flex;
  justify-content: space-between;
  align-items: center;
  position: sticky;
  top: 0;
  background: var(--bg);
}

.file-header__back {
  margin: 10px;
  cursor: pointer;
  flex-shrink: 0;
  flex-grow: 0;
  text-decoration: underline;
  color: var(--link);
}

.file-header__name {
  margin: 10px;
  flex-shrink: 2;
  flex-grow: 2;
}

.file-header__stat {
  margin: 10px;
  flex-shrink: 0;
  flex-grow: 0;
}

.file-content {
  margin: 10px 0 0;
  border: 1px solid #999;
  padding: 10px;
  counter-reset: line;
  display: flex;
  flex-direction: column;
}

.code-line::before {
  content: counter(line);
  margin-right: 72px;
}
.code-line {
  margin: 0;
  height: 1em;
  counter-increment: line;

  position: absolute;
  padding: 0 0.3em 0.3em 0.3em;
  display: inherit;
  width: 100%;
}
.code-line_covered {
  background: var(--green);
}
.code-line_uncovered {
  background: var(--red);
}

.code-text-container {
  position: relative;
  height: 1em;
  padding: 0.3em 0;
}

.cover-indicator {
  display: flex;
  width: 100%;
  position: absolute;
  justify-content: end;
  height: 1em;
  align-items: center;
  padding: 0 0.3em 0.3em 0.3em;
}

.cover-indicator.check-cover::after {
  content: "\2713";
  font-weight: bold;
  background-color: var(--green);
  height: 1em;
}

.cover-indicator.no-cover::after {
  content: "\2716";
  font-weight: bold;
  background-color: var(--red);
  height: 1em;
}

.stat-line-hit {
  max-width: 48px;
  overflow: hidden;
  font-weight: bold;
  margin-right: 4px;
  background-color: var(--green);
  position: relative;
  top: 0.1em;
}

#theme-toggle-label {
  margin-left: 1ch;
}
</style>
</head>
<body>
    <div id="root"></div>
    <script>
        var data = {"files":[{"path":["/","home","jani","devel","mindmap-cli","benches","parser.rs"],"content":"use criterion::{Criterion, black_box, criterion_group, criterion_main};\nuse mindmap_cli::{Mindmap, parse_node_line};\nuse std::io::Cursor;\n\nfn bench_parse_node_line(c: \u0026mut Criterion) {\n    let line =\n        \"[123] **AE: Example Node** - This is a description with [456] and [789] references.\";\n    c.bench_function(\"parse_node_line\", |b| {\n        b.iter(|| {\n            let _ = parse_node_line(black_box(line), 0);\n        })\n    });\n}\n\nfn bench_mindmap_from_string(c: \u0026mut Criterion) {\n    let content = r#\"[1] **AE: First** - Description one [2]\n[2] **AE: Second** - Description two [3]\n[3] **AE: Third** - Description three\"#;\n    c.bench_function(\"mindmap_from_string\", |b| {\n        b.iter(|| {\n            Mindmap::load_from_reader(\n                black_box(Cursor::new(content)),\n                std::path::PathBuf::from(\"-\"),\n            )\n        })\n    });\n}\n\ncriterion_group!(benches, bench_parse_node_line, bench_mindmap_from_string);\ncriterion_main!(benches);\n","traces":[],"covered":0,"coverable":0},{"path":["/","home","jani","devel","mindmap-cli","src","lib.rs"],"content":"use anyhow::{Context, Result};\nuse clap::{Parser, Subcommand};\nuse std::{collections::HashMap, fs, io::Read, path::PathBuf};\n\nmod ui;\n\n#[derive(clap::ValueEnum, Clone)]\npub enum OutputFormat {\n    Default,\n    Json,\n}\n\n#[derive(Parser)]\n#[command(name = \"mindmap\")]\n#[command(about = \"CLI tool for working with MINDMAP files\")]\n#[command(\n    long_about = r#\"mindmap-cli — small CLI for inspecting and safely editing one-line MINDMAP files (default: ./MINDMAP.md).\nOne-node-per-line format: [N] **Title** - description with [N] references. IDs must be stable numeric values.\n\nEXAMPLES:\n  mindmap show 10\n  mindmap list --type AE --grep auth\n  mindmap add --type AE --title \"AuthService\" --desc \"Handles auth [12]\"\n  mindmap edit 12               # opens $EDITOR for an atomic, validated edit\n  mindmap patch 12 --title \"AuthSvc\" --desc \"Updated desc\"   # partial update (PATCH)\n  mindmap put 12 --line \"[31] **WF: Example** - Full line text [12]\"   # full-line replace (PUT)\n  mindmap graph 10 | dot -Tpng \u003e graph.png   # generate neighborhood graph\n  mindmap lint\n\nNotes:\n  - Default file: ./MINDMAP.md (override with --file)\n  - Use `--file -` to read a mindmap from stdin for read-only commands (list/show/refs/links/search/lint/orphans). Mutating commands will error when source is `-`.\n  - Use the EDITOR env var to control the editor used by 'edit'\n\"#\n)]\npub struct Cli {\n    /// Path to MINDMAP file (defaults to ./MINDMAP.md)\n    #[arg(global = true, short, long)]\n    pub file: Option\u003cPathBuf\u003e,\n\n    /// Output format: default (human) or json\n    #[arg(global = true, long, value_enum, default_value_t = OutputFormat::Default)]\n    pub output: OutputFormat,\n\n    #[command(subcommand)]\n    pub command: Commands,\n}\n\n#[derive(Subcommand)]\npub enum Commands {\n    /// Show a node by ID\n    Show { id: u32 },\n\n    /// List nodes (optionally filtered)\n    List {\n        #[arg(long)]\n        r#type: Option\u003cString\u003e,\n        #[arg(long)]\n        grep: Option\u003cString\u003e,\n    },\n\n    /// Show nodes that reference the given ID\n    Refs { id: u32 },\n\n    /// Show nodes that the given ID references\n    Links { id: u32 },\n\n    /// Search nodes by substring\n    Search { query: String },\n\n    /// Add a new node\n    Add {\n        #[arg(long)]\n        r#type: Option\u003cString\u003e,\n        #[arg(long)]\n        title: Option\u003cString\u003e,\n        #[arg(long)]\n        desc: Option\u003cString\u003e,\n        /// When using editor flow, perform strict reference validation\n        #[arg(long)]\n        strict: bool,\n    },\n\n    /// Deprecate a node, redirecting to another\n    Deprecate {\n        id: u32,\n        #[arg(long)]\n        to: u32,\n    },\n\n    /// Edit a node with $EDITOR\n    Edit { id: u32 },\n\n    /// Patch (partial update) a node: --type, --title, --desc\n    Patch {\n        id: u32,\n        #[arg(long)]\n        r#type: Option\u003cString\u003e,\n        #[arg(long)]\n        title: Option\u003cString\u003e,\n        #[arg(long)]\n        desc: Option\u003cString\u003e,\n        #[arg(long)]\n        strict: bool,\n    },\n\n    /// Put (full-line replace) a node: --line\n    Put {\n        id: u32,\n        #[arg(long)]\n        line: String,\n        #[arg(long)]\n        strict: bool,\n    },\n\n    /// Mark a node as needing verification (append verify tag)\n    Verify { id: u32 },\n\n    /// Delete a node by ID; use --force to remove even if referenced\n    Delete {\n        id: u32,\n        #[arg(long)]\n        force: bool,\n    },\n\n    /// Lint the mindmap for basic issues\n    Lint,\n\n    /// Show orphan nodes (no in \u0026 no out, excluding META)\n    Orphans,\n\n    /// Show graph neighborhood for a node (DOT format for Graphviz)\n    Graph { id: u32 },\n}\n\n#[derive(Debug, Clone)]\npub struct Node {\n    pub id: u32,\n    pub raw_title: String,\n    pub description: String,\n    pub references: Vec\u003cu32\u003e,\n    pub line_index: usize,\n}\n\n#[derive(Debug)]\npub struct Mindmap {\n    pub path: PathBuf,\n    pub lines: Vec\u003cString\u003e,\n    pub nodes: Vec\u003cNode\u003e,\n    pub by_id: HashMap\u003cu32, usize\u003e,\n}\n\nimpl Mindmap {\n    pub fn load(path: PathBuf) -\u003e Result\u003cSelf\u003e {\n        // load from file path\n        let content = fs::read_to_string(\u0026path)\n            .with_context(|| format!(\"Failed to read file {}\", path.display()))?;\n        Self::from_string(content, path)\n    }\n\n    /// Load mindmap content from any reader (e.g., stdin). Provide a path placeholder (e.g. \"-\")\n    /// so that callers can detect that the source was non-writable (stdin).\n    pub fn load_from_reader\u003cR: Read\u003e(mut reader: R, path: PathBuf) -\u003e Result\u003cSelf\u003e {\n        let mut content = String::new();\n        reader.read_to_string(\u0026mut content)?;\n        Self::from_string(content, path)\n    }\n\n    fn from_string(content: String, path: PathBuf) -\u003e Result\u003cSelf\u003e {\n        let lines: Vec\u003cString\u003e = content.lines().map(|s| s.to_string()).collect();\n\n        let mut nodes = Vec::new();\n        let mut by_id = HashMap::new();\n\n        for (i, line) in lines.iter().enumerate() {\n            if let Ok(node) = parse_node_line(line, i) {\n                if by_id.contains_key(\u0026node.id) {\n                    eprintln!(\"Warning: duplicate node id {} at line {}\", node.id, i + 1);\n                }\n                by_id.insert(node.id, nodes.len());\n                nodes.push(node);\n            }\n        }\n\n        Ok(Mindmap {\n            path,\n            lines,\n            nodes,\n            by_id,\n        })\n    }\n\n    pub fn save(\u0026self) -\u003e Result\u003c()\u003e {\n        // prevent persisting when loaded from stdin (path == \"-\")\n        if self.path.as_os_str() == \"-\" {\n            return Err(anyhow::anyhow!(\n                \"Cannot save: mindmap was loaded from stdin ('-'); use --file \u003cpath\u003e to save changes\"\n            ));\n        }\n\n        // atomic write: write to a temp file in the same dir then persist\n        let dir = self\n            .path\n            .parent()\n            .map(|p| p.to_path_buf())\n            .unwrap_or_else(|| PathBuf::from(\".\"));\n        let mut tmp = tempfile::NamedTempFile::new_in(\u0026dir)\n            .with_context(|| format!(\"Failed to create temp file in {}\", dir.display()))?;\n        let content = self.lines.join(\"\\n\") + \"\\n\";\n        use std::io::Write;\n        tmp.write_all(content.as_bytes())?;\n        tmp.flush()?;\n        tmp.persist(\u0026self.path)\n            .with_context(|| format!(\"Failed to persist temp file to {}\", self.path.display()))?;\n        Ok(())\n    }\n\n    pub fn next_id(\u0026self) -\u003e u32 {\n        self.by_id.keys().max().copied().unwrap_or(0) + 1\n    }\n\n    pub fn get_node(\u0026self, id: u32) -\u003e Option\u003c\u0026Node\u003e {\n        self.by_id.get(\u0026id).map(|\u0026idx| \u0026self.nodes[idx])\n    }\n}\n\n// Helper: lightweight manual parser for the strict node format\n// Format: ^\\[(\\d+)\\] \\*\\*(.+?)\\*\\* - (.*)$\npub fn parse_node_line(line: \u0026str, line_index: usize) -\u003e Result\u003cNode\u003e {\n    // Fast path sanity checks\n    let trimmed = line.trim_start();\n    if !trimmed.starts_with('[') {\n        return Err(anyhow::anyhow!(\"Line does not match node format\"));\n    }\n\n    // Find closing bracket for ID\n    let end_bracket = match trimmed.find(']') {\n        Some(pos) =\u003e pos,\n        None =\u003e return Err(anyhow::anyhow!(\"Line does not match node format\")),\n    };\n\n    let id_str = \u0026trimmed[1..end_bracket];\n    let id: u32 = id_str.parse()?;\n\n    // Expect a space after ']'\n    let mut pos = end_bracket + 1;\n    let chars = trimmed.as_bytes();\n    if chars.get(pos).map(|b| *b as char) == Some(' ') {\n        pos += 1;\n    } else {\n        return Err(anyhow::anyhow!(\"Line does not match node format\"));\n    }\n\n    // Expect opening '**'\n    if trimmed.get(pos..pos + 2) != Some(\"**\") {\n        return Err(anyhow::anyhow!(\"Line does not match node format\"));\n    }\n    pos += 2;\n\n    // Find closing '**' for title\n    let rem = \u0026trimmed[pos..];\n    let title_rel_end = match rem.find(\"**\") {\n        Some(p) =\u003e p,\n        None =\u003e return Err(anyhow::anyhow!(\"Line does not match node format\")),\n    };\n    let title = rem[..title_rel_end].to_string();\n    pos += title_rel_end + 2; // skip closing '**'\n\n    // Expect ' - ' (space dash space)\n    if trimmed.get(pos..pos + 3) != Some(\" - \") {\n        return Err(anyhow::anyhow!(\"Line does not match node format\"));\n    }\n    pos += 3;\n\n    let description = trimmed[pos..].to_string();\n\n    // Extract references\n    let references = extract_refs_from_str(\u0026description, Some(id));\n\n    Ok(Node {\n        id,\n        raw_title: title,\n        description,\n        references,\n        line_index,\n    })\n}\n\n// Extract references of the form [123] from a description string.\n// If skip_self is Some(id) then occurrences equal to that id are ignored.\nfn extract_refs_from_str(s: \u0026str, skip_self: Option\u003cu32\u003e) -\u003e Vec\u003cu32\u003e {\n    let mut refs = Vec::new();\n    let mut i = 0usize;\n    while i \u003c s.len() {\n        // find next '['\n        if let Some(rel) = s[i..].find('[') {\n            let start = i + rel;\n            if let Some(rel_end) = s[start..].find(']') {\n                let end = start + rel_end;\n                let idslice = \u0026s[start + 1..end];\n                if !idslice.is_empty()\n                    \u0026\u0026 idslice.chars().all(|c| c.is_ascii_digit())\n                    \u0026\u0026 let Ok(rid) = idslice.parse::\u003cu32\u003e()\n                    \u0026\u0026 Some(rid) != skip_self\n                {\n                    refs.push(rid);\n                }\n                i = end + 1;\n                continue;\n            } else {\n                break; // unmatched '['\n            }\n        } else {\n            break;\n        }\n    }\n    refs\n}\n\n// Command helpers\n\npub fn cmd_show(mm: \u0026Mindmap, id: u32) -\u003e String {\n    if let Some(node) = mm.get_node(id) {\n        let mut out = format!(\n            \"[{}] **{}** - {}\",\n            node.id, node.raw_title, node.description\n        );\n\n        // inbound refs\n        let mut inbound = Vec::new();\n        for n in \u0026mm.nodes {\n            if n.references.contains(\u0026id) {\n                inbound.push(n.id);\n            }\n        }\n        if !inbound.is_empty() {\n            out.push_str(\u0026format!(\"\\nReferred to by: {:?}\", inbound));\n        }\n        out\n    } else {\n        format!(\"Node {} not found\", id)\n    }\n}\n\npub fn cmd_list(mm: \u0026Mindmap, type_filter: Option\u003c\u0026str\u003e, grep: Option\u003c\u0026str\u003e) -\u003e Vec\u003cString\u003e {\n    let mut res = Vec::new();\n    for n in \u0026mm.nodes {\n        if let Some(tf) = type_filter\n            \u0026\u0026 !n.raw_title.starts_with(\u0026format!(\"{}:\", tf))\n        {\n            continue;\n        }\n        if let Some(q) = grep {\n            let qlc = q.to_lowercase();\n            if !n.raw_title.to_lowercase().contains(\u0026qlc)\n                \u0026\u0026 !n.description.to_lowercase().contains(\u0026qlc)\n            {\n                continue;\n            }\n        }\n        res.push(format!(\n            \"[{}] **{}** - {}\",\n            n.id, n.raw_title, n.description\n        ));\n    }\n    res\n}\n\npub fn cmd_refs(mm: \u0026Mindmap, id: u32) -\u003e Vec\u003cString\u003e {\n    let mut out = Vec::new();\n    for n in \u0026mm.nodes {\n        if n.references.contains(\u0026id) {\n            out.push(format!(\n                \"[{}] **{}** - {}\",\n                n.id, n.raw_title, n.description\n            ));\n        }\n    }\n    out\n}\n\npub fn cmd_links(mm: \u0026Mindmap, id: u32) -\u003e Option\u003cVec\u003cu32\u003e\u003e {\n    mm.get_node(id).map(|n| n.references.clone())\n}\n\npub fn cmd_search(mm: \u0026Mindmap, query: \u0026str) -\u003e Vec\u003cString\u003e {\n    let qlc = query.to_lowercase();\n    let mut out = Vec::new();\n    for n in \u0026mm.nodes {\n        if n.raw_title.to_lowercase().contains(\u0026qlc) || n.description.to_lowercase().contains(\u0026qlc)\n        {\n            out.push(format!(\n                \"[{}] **{}** - {}\",\n                n.id, n.raw_title, n.description\n            ));\n        }\n    }\n    out\n}\n\npub fn cmd_add(mm: \u0026mut Mindmap, type_prefix: \u0026str, title: \u0026str, desc: \u0026str) -\u003e Result\u003cu32\u003e {\n    let id = mm.next_id();\n    let full_title = format!(\"{}: {}\", type_prefix, title);\n    let line = format!(\"[{}] **{}** - {}\", id, full_title, desc);\n\n    mm.lines.push(line.clone());\n\n    let line_index = mm.lines.len() - 1;\n    let references = extract_refs_from_str(desc, Some(id));\n\n    let node = Node {\n        id,\n        raw_title: full_title,\n        description: desc.to_string(),\n        references,\n        line_index,\n    };\n    mm.by_id.insert(id, mm.nodes.len());\n    mm.nodes.push(node);\n\n    Ok(id)\n}\n\npub fn cmd_add_editor(mm: \u0026mut Mindmap, editor: \u0026str, strict: bool) -\u003e Result\u003cu32\u003e {\n    // require interactive terminal for editor\n    if !atty::is(atty::Stream::Stdin) {\n        return Err(anyhow::anyhow!(\n            \"add via editor requires an interactive terminal\"\n        ));\n    }\n\n    let id = mm.next_id();\n    let template = format!(\"[{}] **TYPE: Title** - description\", id);\n\n    // create temp file and write template\n    let mut tmp = tempfile::NamedTempFile::new()\n        .with_context(|| \"Failed to create temp file for add editor\")?;\n    use std::io::Write;\n    writeln!(tmp, \"{}\", template)?;\n    tmp.flush()?;\n\n    // launch editor\n    let status = std::process::Command::new(editor)\n        .arg(tmp.path())\n        .status()\n        .with_context(|| \"Failed to launch editor\")?;\n    if !status.success() {\n        return Err(anyhow::anyhow!(\"Editor exited with non-zero status\"));\n    }\n\n    // read edited content and pick first non-empty line\n    let edited = std::fs::read_to_string(tmp.path())?;\n    let nonempty: Vec\u003c\u0026str\u003e = edited\n        .lines()\n        .map(|l| l.trim())\n        .filter(|l| !l.is_empty())\n        .collect();\n    if nonempty.is_empty() {\n        return Err(anyhow::anyhow!(\"No content written in editor\"));\n    }\n    if nonempty.len() \u003e 1 {\n        return Err(anyhow::anyhow!(\n            \"Expected exactly one node line in editor; found multiple lines\"\n        ));\n    }\n    let line = nonempty[0];\n\n    // parse and validate\n    let parsed = parse_node_line(line, mm.lines.len())?;\n    if parsed.id != id {\n        return Err(anyhow::anyhow!(format!(\n            \"Added line id changed; expected [{}]\",\n            id\n        )));\n    }\n\n    if strict {\n        for rid in \u0026parsed.references {\n            if !mm.by_id.contains_key(rid) {\n                return Err(anyhow::anyhow!(format!(\n                    \"ADD strict: reference to missing node {}\",\n                    rid\n                )));\n            }\n        }\n    }\n\n    // apply: append line and node\n    mm.lines.push(line.to_string());\n    let line_index = mm.lines.len() - 1;\n    let node = Node {\n        id: parsed.id,\n        raw_title: parsed.raw_title,\n        description: parsed.description,\n        references: parsed.references,\n        line_index,\n    };\n    mm.by_id.insert(id, mm.nodes.len());\n    mm.nodes.push(node);\n\n    Ok(id)\n}\n\npub fn cmd_deprecate(mm: \u0026mut Mindmap, id: u32, to: u32) -\u003e Result\u003c()\u003e {\n    let idx = *mm\n        .by_id\n        .get(\u0026id)\n        .ok_or_else(|| anyhow::anyhow!(format!(\"Node {} not found\", id)))?;\n\n    if !mm.by_id.contains_key(\u0026to) {\n        eprintln!(\n            \"Warning: target node {} does not exist (still updating title)\",\n            to\n        );\n    }\n\n    let node = \u0026mut mm.nodes[idx];\n    if !node.raw_title.starts_with(\"[DEPRECATED\") {\n        node.raw_title = format!(\"[DEPRECATED → {}] {}\", to, node.raw_title);\n        mm.lines[node.line_index] = format!(\n            \"[{}] **{}** - {}\",\n            node.id, node.raw_title, node.description\n        );\n    }\n\n    Ok(())\n}\n\npub fn cmd_verify(mm: \u0026mut Mindmap, id: u32) -\u003e Result\u003c()\u003e {\n    let idx = *mm\n        .by_id\n        .get(\u0026id)\n        .ok_or_else(|| anyhow::anyhow!(format!(\"Node {} not found\", id)))?;\n    let node = \u0026mut mm.nodes[idx];\n\n    let tag = format!(\"(verify {})\", chrono::Local::now().format(\"%Y-%m-%d\"));\n    if !node.description.contains(\"(verify \") {\n        if node.description.is_empty() {\n            node.description = tag.clone();\n        } else {\n            node.description = format!(\"{} {}\", node.description, tag);\n        }\n        mm.lines[node.line_index] = format!(\n            \"[{}] **{}** - {}\",\n            node.id, node.raw_title, node.description\n        );\n    }\n    Ok(())\n}\n\npub fn cmd_edit(mm: \u0026mut Mindmap, id: u32, editor: \u0026str) -\u003e Result\u003c()\u003e {\n    let idx = *mm\n        .by_id\n        .get(\u0026id)\n        .ok_or_else(|| anyhow::anyhow!(format!(\"Node {} not found\", id)))?;\n    let node = \u0026mm.nodes[idx];\n\n    // create temp file with the single node line\n    let mut tmp =\n        tempfile::NamedTempFile::new().with_context(|| \"Failed to create temp file for editing\")?;\n    use std::io::Write;\n    writeln!(\n        tmp,\n        \"[{}] **{}** - {}\",\n        node.id, node.raw_title, node.description\n    )?;\n    tmp.flush()?;\n\n    // launch editor\n    let status = std::process::Command::new(editor)\n        .arg(tmp.path())\n        .status()\n        .with_context(|| \"Failed to launch editor\")?;\n    if !status.success() {\n        return Err(anyhow::anyhow!(\"Editor exited with non-zero status\"));\n    }\n\n    // read edited content\n    let edited = std::fs::read_to_string(tmp.path())?;\n    let edited_line = edited.lines().next().unwrap_or(\"\").trim();\n\n    // parse and validate using manual parser\n    let parsed = parse_node_line(edited_line, node.line_index)?;\n    if parsed.id != id {\n        return Err(anyhow::anyhow!(\"Cannot change node ID\"));\n    }\n\n    // all good: replace line in mm.lines and update node fields\n    mm.lines[node.line_index] = edited_line.to_string();\n    let new_title = parsed.raw_title;\n    let new_desc = parsed.description;\n    let new_refs = parsed.references;\n\n    // update node in-place\n    let node_mut = \u0026mut mm.nodes[idx];\n    node_mut.raw_title = new_title;\n    node_mut.description = new_desc;\n    node_mut.references = new_refs;\n\n    Ok(())\n}\n\npub fn cmd_put(mm: \u0026mut Mindmap, id: u32, line: \u0026str, strict: bool) -\u003e Result\u003c()\u003e {\n    // full-line replace: parse provided line and enforce same id\n    let idx = *mm\n        .by_id\n        .get(\u0026id)\n        .ok_or_else(|| anyhow::anyhow!(format!(\"Node {} not found\", id)))?;\n\n    let parsed = parse_node_line(line, mm.nodes[idx].line_index)?;\n    if parsed.id != id {\n        return Err(anyhow::anyhow!(\"PUT line id does not match target id\"));\n    }\n\n    // strict check for references\n    if strict {\n        for rid in \u0026parsed.references {\n            if !mm.by_id.contains_key(rid) {\n                return Err(anyhow::anyhow!(format!(\n                    \"PUT strict: reference to missing node {}\",\n                    rid\n                )));\n            }\n        }\n    }\n\n    // apply\n    mm.lines[mm.nodes[idx].line_index] = line.to_string();\n    let node_mut = \u0026mut mm.nodes[idx];\n    node_mut.raw_title = parsed.raw_title;\n    node_mut.description = parsed.description;\n    node_mut.references = parsed.references;\n\n    Ok(())\n}\n\npub fn cmd_patch(\n    mm: \u0026mut Mindmap,\n    id: u32,\n    typ: Option\u003c\u0026str\u003e,\n    title: Option\u003c\u0026str\u003e,\n    desc: Option\u003c\u0026str\u003e,\n    strict: bool,\n) -\u003e Result\u003c()\u003e {\n    let idx = *mm\n        .by_id\n        .get(\u0026id)\n        .ok_or_else(|| anyhow::anyhow!(format!(\"Node {} not found\", id)))?;\n    let node = \u0026mm.nodes[idx];\n\n    // split existing raw_title into optional type and title\n    let mut existing_type: Option\u003c\u0026str\u003e = None;\n    let mut existing_title = node.raw_title.as_str();\n    if let Some(pos) = node.raw_title.find(':') {\n        existing_type = Some(node.raw_title[..pos].trim());\n        existing_title = node.raw_title[pos + 1..].trim();\n    }\n\n    let new_type = typ.unwrap_or(existing_type.unwrap_or(\"\"));\n    let new_title = title.unwrap_or(existing_title);\n    let new_desc = desc.unwrap_or(\u0026node.description);\n\n    // build raw title: if type is empty, omit prefix\n    let new_raw_title = if new_type.is_empty() {\n        new_title.to_string()\n    } else {\n        format!(\"{}: {}\", new_type, new_title)\n    };\n\n    let new_line = format!(\"[{}] **{}** - {}\", id, new_raw_title, new_desc);\n\n    // validate\n    let parsed = parse_node_line(\u0026new_line, node.line_index)?;\n    if parsed.id != id {\n        return Err(anyhow::anyhow!(\"Patch resulted in different id\"));\n    }\n\n    if strict {\n        for rid in \u0026parsed.references {\n            if !mm.by_id.contains_key(rid) {\n                return Err(anyhow::anyhow!(format!(\n                    \"PATCH strict: reference to missing node {}\",\n                    rid\n                )));\n            }\n        }\n    }\n\n    // apply\n    mm.lines[node.line_index] = new_line;\n    let node_mut = \u0026mut mm.nodes[idx];\n    node_mut.raw_title = parsed.raw_title;\n    node_mut.description = parsed.description;\n    node_mut.references = parsed.references;\n\n    Ok(())\n}\n\npub fn cmd_delete(mm: \u0026mut Mindmap, id: u32, force: bool) -\u003e Result\u003c()\u003e {\n    // find node index\n    let idx = *mm\n        .by_id\n        .get(\u0026id)\n        .ok_or_else(|| anyhow::anyhow!(format!(\"Node {} not found\", id)))?;\n\n    // check incoming references\n    let mut incoming_from = Vec::new();\n    for n in \u0026mm.nodes {\n        if n.references.contains(\u0026id) {\n            incoming_from.push(n.id);\n        }\n    }\n    if !incoming_from.is_empty() \u0026\u0026 !force {\n        return Err(anyhow::anyhow!(format!(\n            \"Node {} is referenced by {:?}; use --force to delete\",\n            id, incoming_from\n        )));\n    }\n\n    // remove the line from lines\n    let line_idx = mm.nodes[idx].line_index;\n    mm.lines.remove(line_idx);\n\n    // remove node from nodes vector\n    mm.nodes.remove(idx);\n\n    // rebuild by_id and fix line_index for nodes after removed line\n    mm.by_id.clear();\n    for (i, node) in mm.nodes.iter_mut().enumerate() {\n        // if node was after removed line, decrement its line_index\n        if node.line_index \u003e line_idx {\n            node.line_index -= 1;\n        }\n        mm.by_id.insert(node.id, i);\n    }\n\n    Ok(())\n}\n\npub fn cmd_lint(mm: \u0026Mindmap) -\u003e Result\u003cVec\u003cString\u003e\u003e {\n    let mut warnings = Vec::new();\n\n    // 1) Syntax: lines starting with '[' but not matching node format\n    for (i, line) in mm.lines.iter().enumerate() {\n        let trimmed = line.trim_start();\n        if trimmed.starts_with('[') \u0026\u0026 parse_node_line(trimmed, i).is_err() {\n            warnings.push(format!(\n                \"Syntax: line {} starts with '[' but does not match node format\",\n                i + 1\n            ));\n        }\n    }\n\n    // 2) Duplicate IDs: scan lines for node ids\n    let mut id_map: HashMap\u003cu32, Vec\u003cusize\u003e\u003e = HashMap::new();\n    for (i, line) in mm.lines.iter().enumerate() {\n        if let Ok(node) = parse_node_line(line, i) {\n            id_map.entry(node.id).or_default().push(i + 1);\n        }\n    }\n    for (id, locations) in \u0026id_map {\n        if locations.len() \u003e 1 {\n            warnings.push(format!(\n                \"Duplicate ID: node {} appears on lines {:?}\",\n                id, locations\n            ));\n        }\n    }\n\n    // 3) Missing references\n    for n in \u0026mm.nodes {\n        for rid in \u0026n.references {\n            if !mm.by_id.contains_key(rid) {\n                warnings.push(format!(\n                    \"Missing ref: node {} references missing node {}\",\n                    n.id, rid\n                ));\n            }\n        }\n    }\n\n    if warnings.is_empty() {\n        Ok(vec![\"Lint OK\".to_string()])\n    } else {\n        Ok(warnings)\n    }\n}\n\npub fn cmd_orphans(mm: \u0026Mindmap) -\u003e Result\u003cVec\u003cString\u003e\u003e {\n    let mut warnings = Vec::new();\n\n    // Orphans: nodes with no in and no out, excluding META:*\n    let mut incoming: HashMap\u003cu32, usize\u003e = HashMap::new();\n    for n in \u0026mm.nodes {\n        incoming.entry(n.id).or_insert(0);\n    }\n    for n in \u0026mm.nodes {\n        for rid in \u0026n.references {\n            if incoming.contains_key(rid) {\n                *incoming.entry(*rid).or_insert(0) += 1;\n            }\n        }\n    }\n    for n in \u0026mm.nodes {\n        let inc = incoming.get(\u0026n.id).copied().unwrap_or(0);\n        let out = n.references.len();\n        let title_up = n.raw_title.to_uppercase();\n        if inc == 0 \u0026\u0026 out == 0 \u0026\u0026 !title_up.starts_with(\"META\") {\n            warnings.push(format!(\"{}\", n.id));\n        }\n    }\n\n    if warnings.is_empty() {\n        Ok(vec![\"No orphans\".to_string()])\n    } else {\n        Ok(warnings)\n    }\n}\n\npub fn cmd_graph(mm: \u0026Mindmap, id: u32) -\u003e Result\u003cString\u003e {\n    if !mm.by_id.contains_key(\u0026id) {\n        return Err(anyhow::anyhow!(format!(\"Node {} not found\", id)));\n    }\n\n    // Collect 1-hop neighborhood: self, direct references (out), and nodes that reference self (in)\n    let mut nodes = std::collections::HashSet::new();\n    nodes.insert(id);\n\n    // Outgoing: references from self\n    if let Some(node) = mm.get_node(id) {\n        for \u0026rid in \u0026node.references {\n            nodes.insert(rid);\n        }\n    }\n\n    // Incoming: nodes that reference self\n    for n in \u0026mm.nodes {\n        if n.references.contains(\u0026id) {\n            nodes.insert(n.id);\n        }\n    }\n\n    // Generate DOT\n    let mut dot = String::new();\n    dot.push_str(\"digraph {\\n\");\n    dot.push_str(\"  rankdir=LR;\\n\");\n\n    // Add nodes\n    for \u0026nid in \u0026nodes {\n        if let Some(node) = mm.get_node(nid) {\n            let label = format!(\"{}: {}\", node.id, node.raw_title.replace(\"\\\"\", \"\\\\\\\"\"));\n            dot.push_str(\u0026format!(\"  {} [label=\\\"{}\\\"];\\n\", nid, label));\n        }\n    }\n\n    // Add edges: from each node to its references, if both in neighborhood\n    for \u0026nid in \u0026nodes {\n        if let Some(node) = mm.get_node(nid) {\n            for \u0026rid in \u0026node.references {\n                if nodes.contains(\u0026rid) {\n                    dot.push_str(\u0026format!(\"  {} -\u003e {};\\n\", nid, rid));\n                }\n            }\n        }\n    }\n\n    dot.push_str(\"}\\n\");\n    Ok(dot)\n}\n\npub fn run(cli: Cli) -\u003e Result\u003c()\u003e {\n    let path = cli.file.unwrap_or_else(|| PathBuf::from(\"MINDMAP.md\"));\n\n    // If user passed '-' use stdin as source\n    let mut mm = if path.as_os_str() == \"-\" {\n        Mindmap::load_from_reader(std::io::stdin(), path.clone())?\n    } else {\n        Mindmap::load(path.clone())?\n    };\n\n    // determine whether to use pretty output (interactive + default format)\n    let interactive = atty::is(atty::Stream::Stdout);\n    let env_override = std::env::var(\"MINDMAP_PRETTY\").ok();\n    let pretty_enabled = match env_override.as_deref() {\n        Some(\"0\") =\u003e false,\n        Some(\"1\") =\u003e true,\n        _ =\u003e interactive,\n    } \u0026\u0026 matches!(cli.output, OutputFormat::Default);\n\n    let printer: Option\u003cBox\u003cdyn ui::Printer\u003e\u003e = if matches!(cli.output, OutputFormat::Default) {\n        if pretty_enabled {\n            Some(Box::new(crate::ui::PrettyPrinter::new()?))\n        } else {\n            Some(Box::new(crate::ui::PlainPrinter::new()?))\n        }\n    } else {\n        None\n    };\n\n    // helper to reject mutating commands when mm.path == '-'\n    let cannot_write_err = |cmd_name: \u0026str| -\u003e anyhow::Error {\n        anyhow::anyhow!(format!(\n            \"Cannot {}: mindmap was loaded from stdin ('-'); use --file \u003cpath\u003e to save changes\",\n            cmd_name\n        ))\n    };\n\n    match cli.command {\n        Commands::Show { id } =\u003e match mm.get_node(id) {\n            Some(node) =\u003e {\n                if matches!(cli.output, OutputFormat::Json) {\n                    let obj = serde_json::json!({\n                        \"command\": \"show\",\n                        \"node\": {\n                            \"id\": node.id,\n                            \"raw_title\": node.raw_title,\n                            \"description\": node.description,\n                            \"references\": node.references,\n                            \"line_index\": node.line_index,\n                        }\n                    });\n                    println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n                } else {\n                    // compute inbound refs\n                    let mut inbound = Vec::new();\n                    for n in \u0026mm.nodes {\n                        if n.references.contains(\u0026id) {\n                            inbound.push(n.id);\n                        }\n                    }\n\n                    if let Some(p) = \u0026printer {\n                        p.show(node, \u0026inbound, \u0026node.references)?;\n                    } else {\n                        println!(\n                            \"[{}] **{}** - {}\",\n                            node.id, node.raw_title, node.description\n                        );\n                        if !inbound.is_empty() {\n                            eprintln!(\"Referred to by: {:?}\", inbound);\n                        }\n                    }\n                }\n            }\n            None =\u003e return Err(anyhow::anyhow!(format!(\"Node {} not found\", id))),\n        },\n        Commands::List { r#type, grep } =\u003e {\n            let items = cmd_list(\u0026mm, r#type.as_deref(), grep.as_deref());\n            if matches!(cli.output, OutputFormat::Json) {\n                let arr: Vec\u003c_\u003e = items\n                    .into_iter()\n                    .map(|line| serde_json::json!({\"line\": line}))\n                    .collect();\n                let obj = serde_json::json!({\"command\": \"list\", \"items\": arr});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            } else if let Some(p) = \u0026printer {\n                p.list(\u0026items)?;\n            } else {\n                for it in items {\n                    println!(\"{}\", it);\n                }\n            }\n        }\n        Commands::Refs { id } =\u003e {\n            let items = cmd_refs(\u0026mm, id);\n            if matches!(cli.output, OutputFormat::Json) {\n                let obj = serde_json::json!({\"command\": \"refs\", \"items\": items});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            } else if let Some(p) = \u0026printer {\n                p.refs(\u0026items)?;\n            } else {\n                for it in items {\n                    println!(\"{}\", it);\n                }\n            }\n        }\n        Commands::Links { id } =\u003e match cmd_links(\u0026mm, id) {\n            Some(v) =\u003e {\n                if matches!(cli.output, OutputFormat::Json) {\n                    let obj = serde_json::json!({\"command\": \"links\", \"id\": id, \"links\": v});\n                    println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n                } else if let Some(p) = \u0026printer {\n                    p.links(id, \u0026v)?;\n                } else {\n                    println!(\"Node [{}] references: {:?}\", id, v);\n                }\n            }\n            None =\u003e return Err(anyhow::anyhow!(format!(\"Node [{}] not found\", id))),\n        },\n        Commands::Search { query } =\u003e {\n            let items = cmd_search(\u0026mm, \u0026query);\n            if matches!(cli.output, OutputFormat::Json) {\n                let obj = serde_json::json!({\"command\": \"search\", \"query\": query, \"items\": items});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            } else if let Some(p) = \u0026printer {\n                p.search(\u0026items)?;\n            } else {\n                for it in items {\n                    println!(\"{}\", it);\n                }\n            }\n        }\n        Commands::Add {\n            r#type,\n            title,\n            desc,\n            strict,\n        } =\u003e {\n            if mm.path.as_os_str() == \"-\" {\n                return Err(cannot_write_err(\"add\"));\n            }\n            match (r#type.as_deref(), title.as_deref(), desc.as_deref()) {\n                (Some(tp), Some(tt), Some(dd)) =\u003e {\n                    let id = cmd_add(\u0026mut mm, tp, tt, dd)?;\n                    mm.save()?;\n                    if matches!(cli.output, OutputFormat::Json)\n                        \u0026\u0026 let Some(node) = mm.get_node(id)\n                    {\n                        let obj = serde_json::json!({\"command\": \"add\", \"node\": {\"id\": node.id, \"raw_title\": node.raw_title, \"description\": node.description, \"references\": node.references}});\n                        println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n                    }\n                    eprintln!(\"Added node [{}]\", id);\n                }\n                (None, None, None) =\u003e {\n                    // editor flow\n                    if !atty::is(atty::Stream::Stdin) {\n                        return Err(anyhow::anyhow!(\n                            \"add via editor requires an interactive terminal\"\n                        ));\n                    }\n                    let editor = std::env::var(\"EDITOR\").unwrap_or_else(|_| \"vi\".to_string());\n                    let id = cmd_add_editor(\u0026mut mm, \u0026editor, strict)?;\n                    mm.save()?;\n                    if matches!(cli.output, OutputFormat::Json)\n                        \u0026\u0026 let Some(node) = mm.get_node(id)\n                    {\n                        let obj = serde_json::json!({\"command\": \"add\", \"node\": {\"id\": node.id, \"raw_title\": node.raw_title, \"description\": node.description, \"references\": node.references}});\n                        println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n                    }\n                    eprintln!(\"Added node [{}]\", id);\n                }\n                _ =\u003e {\n                    return Err(anyhow::anyhow!(\n                        \"add requires either all of --type,--title,--desc or none (editor)\"\n                    ));\n                }\n            }\n        }\n        Commands::Deprecate { id, to } =\u003e {\n            if mm.path.as_os_str() == \"-\" {\n                return Err(cannot_write_err(\"deprecate\"));\n            }\n            cmd_deprecate(\u0026mut mm, id, to)?;\n            mm.save()?;\n            if matches!(cli.output, OutputFormat::Json)\n                \u0026\u0026 let Some(node) = mm.get_node(id)\n            {\n                let obj = serde_json::json!({\"command\": \"deprecate\", \"node\": {\"id\": node.id, \"raw_title\": node.raw_title}});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            }\n            eprintln!(\"Deprecated node [{}] → [{}]\", id, to);\n        }\n        Commands::Edit { id } =\u003e {\n            if mm.path.as_os_str() == \"-\" {\n                return Err(cannot_write_err(\"edit\"));\n            }\n            let editor = std::env::var(\"EDITOR\").unwrap_or_else(|_| \"vi\".to_string());\n            cmd_edit(\u0026mut mm, id, \u0026editor)?;\n            mm.save()?;\n            if matches!(cli.output, OutputFormat::Json)\n                \u0026\u0026 let Some(node) = mm.get_node(id)\n            {\n                let obj = serde_json::json!({\"command\": \"edit\", \"node\": {\"id\": node.id, \"raw_title\": node.raw_title, \"description\": node.description, \"references\": node.references}});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            }\n            eprintln!(\"Edited node [{}]\", id);\n        }\n        Commands::Patch {\n            id,\n            r#type,\n            title,\n            desc,\n            strict,\n        } =\u003e {\n            if mm.path.as_os_str() == \"-\" {\n                return Err(cannot_write_err(\"patch\"));\n            }\n            cmd_patch(\n                \u0026mut mm,\n                id,\n                r#type.as_deref(),\n                title.as_deref(),\n                desc.as_deref(),\n                strict,\n            )?;\n            mm.save()?;\n            if matches!(cli.output, OutputFormat::Json)\n                \u0026\u0026 let Some(node) = mm.get_node(id)\n            {\n                let obj = serde_json::json!({\"command\": \"patch\", \"node\": {\"id\": node.id, \"raw_title\": node.raw_title, \"description\": node.description, \"references\": node.references}});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            }\n            eprintln!(\"Patched node [{}]\", id);\n        }\n        Commands::Put { id, line, strict } =\u003e {\n            if mm.path.as_os_str() == \"-\" {\n                return Err(cannot_write_err(\"put\"));\n            }\n            cmd_put(\u0026mut mm, id, \u0026line, strict)?;\n            mm.save()?;\n            if matches!(cli.output, OutputFormat::Json)\n                \u0026\u0026 let Some(node) = mm.get_node(id)\n            {\n                let obj = serde_json::json!({\"command\": \"put\", \"node\": {\"id\": node.id, \"raw_title\": node.raw_title, \"description\": node.description, \"references\": node.references}});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            }\n            eprintln!(\"Put node [{}]\", id);\n        }\n        Commands::Verify { id } =\u003e {\n            if mm.path.as_os_str() == \"-\" {\n                return Err(cannot_write_err(\"verify\"));\n            }\n            cmd_verify(\u0026mut mm, id)?;\n            mm.save()?;\n            if matches!(cli.output, OutputFormat::Json)\n                \u0026\u0026 let Some(node) = mm.get_node(id)\n            {\n                let obj = serde_json::json!({\"command\": \"verify\", \"node\": {\"id\": node.id, \"description\": node.description}});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            }\n            eprintln!(\"Marked node [{}] for verification\", id);\n        }\n        Commands::Delete { id, force } =\u003e {\n            if mm.path.as_os_str() == \"-\" {\n                return Err(cannot_write_err(\"delete\"));\n            }\n            cmd_delete(\u0026mut mm, id, force)?;\n            mm.save()?;\n            if matches!(cli.output, OutputFormat::Json) {\n                let obj = serde_json::json!({\"command\": \"delete\", \"deleted\": id});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            }\n            eprintln!(\"Deleted node [{}]\", id);\n        }\n        Commands::Lint =\u003e {\n            let res = cmd_lint(\u0026mm)?;\n            if matches!(cli.output, OutputFormat::Json) {\n                let obj = serde_json::json!({\"command\": \"lint\", \"warnings\": res});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            } else {\n                for r in res {\n                    eprintln!(\"{}\", r);\n                }\n            }\n        }\n        Commands::Orphans =\u003e {\n            let res = cmd_orphans(\u0026mm)?;\n            if matches!(cli.output, OutputFormat::Json) {\n                let obj = serde_json::json!({\"command\": \"orphans\", \"orphans\": res});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            } else if let Some(p) = \u0026printer {\n                p.orphans(\u0026res)?;\n            } else {\n                for r in res {\n                    eprintln!(\"{}\", r);\n                }\n            }\n        }\n        Commands::Graph { id } =\u003e {\n            let dot = cmd_graph(\u0026mm, id)?;\n            println!(\"{}\", dot);\n        }\n    }\n\n    Ok(())\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use assert_fs::prelude::*;\n\n    #[test]\n    fn test_parse_nodes() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\n            \"Header line\\n[1] **AE: A** - refers to [2]\\nSome note\\n[2] **AE: B** - base\\n\",\n        )?;\n\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        assert_eq!(mm.nodes.len(), 2);\n        assert!(mm.by_id.contains_key(\u00261));\n        assert!(mm.by_id.contains_key(\u00262));\n        let n1 = mm.get_node(1).unwrap();\n        assert_eq!(n1.references, vec![2]);\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_save_atomic() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: A** - base\\n\")?;\n\n        let mut mm = Mindmap::load(file.path().to_path_buf())?;\n        // append a node line\n        let id = mm.next_id();\n        mm.lines.push(format!(\"[{}] **AE: C** - new\\n\", id));\n        // reflect node\n        let node = Node {\n            id,\n            raw_title: \"AE: C\".to_string(),\n            description: \"new\".to_string(),\n            references: vec![],\n            line_index: mm.lines.len() - 1,\n        };\n        mm.by_id.insert(id, mm.nodes.len());\n        mm.nodes.push(node);\n\n        mm.save()?;\n\n        let content = std::fs::read_to_string(file.path())?;\n        assert!(content.contains(\"AE: C\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_lint_syntax_and_duplicates_and_orphan() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[bad] not a node\\n[1] **AE: A** - base\\n[1] **AE: Adup** - dup\\n[2] **AE: Orphan** - lonely\\n\")?;\n\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let warnings = cmd_lint(\u0026mm)?;\n        // Expect at least syntax and duplicate warnings from lint\n        let joined = warnings.join(\"\\n\");\n        assert!(joined.contains(\"Syntax\"));\n        assert!(joined.contains(\"Duplicate ID\"));\n\n        // Orphan detection is now a separate command; verify orphans via cmd_orphans()\n        let orphans = cmd_orphans(\u0026mm)?;\n        let joined_o = orphans.join(\"\\n\");\n        // expect node id 2 to be reported as orphan\n        assert!(joined_o.contains(\"2\"));\n\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_put_and_patch_basic() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n[2] **AE: Two** - second\\n\")?;\n\n        let mut mm = Mindmap::load(file.path().to_path_buf())?;\n        // patch title only for node 1\n        cmd_patch(\u0026mut mm, 1, Some(\"AE\"), Some(\"OneNew\"), None, false)?;\n        assert_eq!(mm.get_node(1).unwrap().raw_title, \"AE: OneNew\");\n\n        // put full line for node 2\n        let new_line = \"[2] **DR: Replaced** - replaced desc [1]\";\n        cmd_put(\u0026mut mm, 2, new_line, false)?;\n        assert_eq!(mm.get_node(2).unwrap().raw_title, \"DR: Replaced\");\n        assert_eq!(mm.get_node(2).unwrap().references, vec![1]);\n\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_show() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n[2] **AE: Two** - refers [1]\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let out = cmd_show(\u0026mm, 1);\n        assert!(out.contains(\"[1] **AE: One**\"));\n        assert!(out.contains(\"Referred to by: [2]\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_refs() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n[2] **AE: Two** - refers [1]\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let refs = cmd_refs(\u0026mm, 1);\n        assert_eq!(refs.len(), 1);\n        assert!(refs[0].contains(\"[2] **AE: Two**\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_links() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n[2] **AE: Two** - refers [1]\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let links = cmd_links(\u0026mm, 2);\n        assert_eq!(links, Some(vec![1]));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_search() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n[2] **AE: Two** - second\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let results = cmd_search(\u0026mm, \"first\");\n        assert_eq!(results.len(), 1);\n        assert!(results[0].contains(\"[1] **AE: One**\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_add() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mut mm = Mindmap::load(file.path().to_path_buf())?;\n        let id = cmd_add(\u0026mut mm, \"AE\", \"Two\", \"second\")?;\n        assert_eq!(id, 2);\n        assert_eq!(mm.nodes.len(), 2);\n        let node = mm.get_node(2).unwrap();\n        assert_eq!(node.raw_title, \"AE: Two\");\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_deprecate() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n[2] **AE: Two** - second\\n\")?;\n        let mut mm = Mindmap::load(file.path().to_path_buf())?;\n        cmd_deprecate(\u0026mut mm, 1, 2)?;\n        let node = mm.get_node(1).unwrap();\n        assert!(node.raw_title.starts_with(\"[DEPRECATED → 2]\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_verify() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mut mm = Mindmap::load(file.path().to_path_buf())?;\n        cmd_verify(\u0026mut mm, 1)?;\n        let node = mm.get_node(1).unwrap();\n        assert!(node.description.contains(\"(verify\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_show_non_existing() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let out = cmd_show(\u0026mm, 99);\n        assert_eq!(out, \"Node 99 not found\");\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_refs_non_existing() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let refs = cmd_refs(\u0026mm, 99);\n        assert_eq!(refs.len(), 0);\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_links_non_existing() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let links = cmd_links(\u0026mm, 99);\n        assert_eq!(links, None);\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_put_non_existing() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mut mm = Mindmap::load(file.path().to_path_buf())?;\n        let err = cmd_put(\u0026mut mm, 99, \"[99] **AE: New** - new\", false).unwrap_err();\n        assert!(format!(\"{}\", err).contains(\"Node 99 not found\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_patch_non_existing() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mut mm = Mindmap::load(file.path().to_path_buf())?;\n        let err = cmd_patch(\u0026mut mm, 99, None, Some(\"New\"), None, false).unwrap_err();\n        assert!(format!(\"{}\", err).contains(\"Node 99 not found\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_load_from_reader() -\u003e Result\u003c()\u003e {\n        use std::io::Cursor;\n        let content = \"[1] **AE: One** - first\\n\";\n        let reader = Cursor::new(content);\n        let path = PathBuf::from(\"-\");\n        let mm = Mindmap::load_from_reader(reader, path)?;\n        assert_eq!(mm.nodes.len(), 1);\n        assert_eq!(mm.nodes[0].id, 1);\n        Ok(())\n    }\n\n    #[test]\n    fn test_next_id() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n[3] **AE: Three** - third\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        assert_eq!(mm.next_id(), 4);\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_get_node() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let node = mm.get_node(1).unwrap();\n        assert_eq!(node.id, 1);\n        assert!(mm.get_node(99).is_none());\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_orphans() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n[2] **AE: Orphan** - lonely\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let orphans = cmd_orphans(\u0026mm)?;\n        assert_eq!(orphans, vec![\"1\".to_string(), \"2\".to_string()]);\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_graph() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\n            \"[1] **AE: One** - first\\n[2] **AE: Two** - refers [1]\\n[3] **AE: Three** - also [1]\\n\",\n        )?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let dot = cmd_graph(\u0026mm, 1)?;\n        assert!(dot.contains(\"digraph {\"));\n        assert!(dot.contains(\"1 [label=\\\"1: AE: One\\\"]\"));\n        assert!(dot.contains(\"2 [label=\\\"2: AE: Two\\\"]\"));\n        assert!(dot.contains(\"3 [label=\\\"3: AE: Three\\\"]\"));\n        assert!(dot.contains(\"2 -\u003e 1;\"));\n        assert!(dot.contains(\"3 -\u003e 1;\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_save_stdin_path() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mm = Mindmap::load_from_reader(\n            std::io::Cursor::new(\"[1] **AE: One** - first\\n\"),\n            PathBuf::from(\"-\"),\n        )?;\n        let err = mm.save().unwrap_err();\n        assert!(format!(\"{}\", err).contains(\"Cannot save\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_extract_refs_from_str() {\n        assert_eq!(extract_refs_from_str(\"no refs\", None), vec![] as Vec\u003cu32\u003e);\n        assert_eq!(extract_refs_from_str(\"[1] and [2]\", None), vec![1, 2]);\n        assert_eq!(\n            extract_refs_from_str(\"[1] and [1]\", Some(1)),\n            vec![] as Vec\u003cu32\u003e\n        ); // skip self\n        assert_eq!(\n            extract_refs_from_str(\"[abc] invalid [123]\", None),\n            vec![123]\n        );\n    }\n}\n","traces":[{"line":153,"address":[14067888],"length":1,"stats":{"Line":0}},{"line":154,"address":[6537518],"length":1,"stats":{"Line":8}},{"line":156,"address":[7680629,7682968,7683088,7680624,7683189,7682928,7683147,7683968,7684036],"length":1,"stats":{"Line":38}},{"line":157,"address":[2491072,2491040],"length":1,"stats":{"Line":19}},{"line":158,"address":[6371618,6371689],"length":1,"stats":{"Line":19}},{"line":163,"address":[4966705,4965680,4966117,4966173,4966208,4966649],"length":1,"stats":{"Line":1}},{"line":164,"address":[11715360],"length":1,"stats":{"Line":1}},{"line":165,"address":[5631478,5632112,5631672,5630320,5632848,5632279,5631296,5633038,5632135,5632408,5630325,5632872,5631320],"length":1,"stats":{"Line":2}},{"line":166,"address":[5035265],"length":1,"stats":{"Line":1}},{"line":169,"address":[6293744],"length":1,"stats":{"Line":8}},{"line":170,"address":[4335894],"length":1,"stats":{"Line":32}},{"line":172,"address":[12202537,12202687],"length":1,"stats":{"Line":8}},{"line":173,"address":[5192989],"length":1,"stats":{"Line":8}},{"line":175,"address":[3841495],"length":1,"stats":{"Line":16}},{"line":176,"address":[5799424,5799398],"length":1,"stats":{"Line":24}},{"line":177,"address":[6293974],"length":1,"stats":{"Line":16}},{"line":178,"address":[6355350,6357392,6357372,6356728,6356286,6356306,6355869,6355828,6355889,6357333,6356245,6356667,6356708,6355309,6355370],"length":1,"stats":{"Line":1}},{"line":180,"address":[11708248,11708233],"length":1,"stats":{"Line":16}},{"line":181,"address":[5194364],"length":1,"stats":{"Line":8}},{"line":185,"address":[2743614],"length":1,"stats":{"Line":6}},{"line":186,"address":[5193385],"length":1,"stats":{"Line":7}},{"line":187,"address":[2743492],"length":1,"stats":{"Line":7}},{"line":188,"address":[5111086],"length":1,"stats":{"Line":18}},{"line":189,"address":[6537173],"length":1,"stats":{"Line":6}},{"line":193,"address":[6536816],"length":1,"stats":{"Line":13}},{"line":195,"address":[3841872,3841801,3841782],"length":1,"stats":{"Line":2}},{"line":196,"address":[5902139],"length":1,"stats":{"Line":1}},{"line":197,"address":[3841828],"length":1,"stats":{"Line":0}},{"line":202,"address":[2482661],"length":1,"stats":{"Line":12}},{"line":203,"address":[9552048,9552196,9552202],"length":1,"stats":{"Line":0}},{"line":205,"address":[2491264,2491286],"length":1,"stats":{"Line":3}},{"line":206,"address":[12699580],"length":1,"stats":{"Line":1}},{"line":207,"address":[6357550,6357518],"length":1,"stats":{"Line":2}},{"line":208,"address":[6357555,6357523],"length":1,"stats":{"Line":1}},{"line":209,"address":[5112112],"length":1,"stats":{"Line":2}},{"line":211,"address":[5112184],"length":1,"stats":{"Line":2}},{"line":212,"address":[10437883],"length":1,"stats":{"Line":1}},{"line":213,"address":[12203248],"length":1,"stats":{"Line":2}},{"line":214,"address":[2491520,2491488],"length":1,"stats":{"Line":2}},{"line":215,"address":[9551545,9551518],"length":1,"stats":{"Line":1}},{"line":218,"address":[5112398],"length":1,"stats":{"Line":2}},{"line":219,"address":[3842196],"length":1,"stats":{"Line":2}},{"line":222,"address":[5753670,5753799,5753352],"length":1,"stats":{"Line":5}},{"line":223,"address":[5657523],"length":1,"stats":{"Line":4}},{"line":229,"address":[6384738],"length":1,"stats":{"Line":20}},{"line":231,"address":[7710347],"length":1,"stats":{"Line":33}},{"line":232,"address":[5755034],"length":1,"stats":{"Line":30}},{"line":233,"address":[12698798],"length":1,"stats":{"Line":12}},{"line":237,"address":[11706368],"length":1,"stats":{"Line":19}},{"line":238,"address":[5112728],"length":1,"stats":{"Line":8}},{"line":239,"address":[6358666],"length":1,"stats":{"Line":0}},{"line":242,"address":[6886912],"length":1,"stats":{"Line":8}},{"line":243,"address":[2692879,2693070],"length":1,"stats":{"Line":9}},{"line":246,"address":[11707918],"length":1,"stats":{"Line":8}},{"line":247,"address":[5630596],"length":1,"stats":{"Line":8}},{"line":248,"address":[5109680],"length":1,"stats":{"Line":24}},{"line":249,"address":[5022704],"length":1,"stats":{"Line":8}},{"line":251,"address":[13863494,13863421],"length":1,"stats":{"Line":0}},{"line":255,"address":[7685200],"length":1,"stats":{"Line":27}},{"line":256,"address":[6332970,6332396,6332543,6332664],"length":1,"stats":{"Line":0}},{"line":258,"address":[5803185,5806033,5802065,5801873,5804209],"length":1,"stats":{"Line":16}},{"line":261,"address":[5110206],"length":1,"stats":{"Line":8}},{"line":262,"address":[5212424,5212455],"length":1,"stats":{"Line":8}},{"line":263,"address":[9835430],"length":1,"stats":{"Line":30}},{"line":264,"address":[7265209],"length":1,"stats":{"Line":0}},{"line":266,"address":[5109592],"length":1,"stats":{"Line":8}},{"line":267,"address":[5145146,5144896,5145003,5145098],"length":1,"stats":{"Line":24}},{"line":270,"address":[5109832],"length":1,"stats":{"Line":16}},{"line":271,"address":[7265342],"length":1,"stats":{"Line":0}},{"line":273,"address":[5145290,5145414,5145370],"length":1,"stats":{"Line":16}},{"line":275,"address":[5657903,5657829,5658048],"length":1,"stats":{"Line":27}},{"line":278,"address":[6889061,6889135],"length":1,"stats":{"Line":16}},{"line":280,"address":[5805835,5801718,5803027,5803157,5801117,5804017,5804180,5800991,5801844,5805996],"length":1,"stats":{"Line":8}},{"line":281,"address":[6889188],"length":1,"stats":{"Line":0}},{"line":282,"address":[5269947],"length":1,"stats":{"Line":30}},{"line":283,"address":[6340360,6347325,6345028,6342706],"length":1,"stats":{"Line":30}},{"line":284,"address":[4323216],"length":1,"stats":{"Line":0}},{"line":285,"address":[6333760],"length":1,"stats":{"Line":11}},{"line":291,"address":[6885699],"length":1,"stats":{"Line":8}},{"line":292,"address":[2473885],"length":1,"stats":{"Line":8}},{"line":293,"address":[5146084],"length":1,"stats":{"Line":19}},{"line":294,"address":[7690733,7690001,7689965],"length":1,"stats":{"Line":16}},{"line":296,"address":[5637493,5637553],"length":1,"stats":{"Line":8}},{"line":297,"address":[6885996,6886146],"length":1,"stats":{"Line":2}},{"line":298,"address":[5637644],"length":1,"stats":{"Line":4}},{"line":299,"address":[12700488],"length":1,"stats":{"Line":2}},{"line":300,"address":[7690768,7690960,7690616,7690981,7690891],"length":1,"stats":{"Line":4}},{"line":301,"address":[5114464],"length":1,"stats":{"Line":2}},{"line":302,"address":[5037029,5036409,5036555,5036869,5035833,5037083],"length":1,"stats":{"Line":10}},{"line":303,"address":[12701288],"length":1,"stats":{"Line":3}},{"line":304,"address":[14069349],"length":1,"stats":{"Line":3}},{"line":306,"address":[12697198],"length":1,"stats":{"Line":3}},{"line":308,"address":[9551919],"length":1,"stats":{"Line":13}},{"line":309,"address":[12696672],"length":1,"stats":{"Line":11}},{"line":311,"address":[13857543,13857623,13858478],"length":1,"stats":{"Line":0}},{"line":314,"address":[6328621,6327724],"length":1,"stats":{"Line":0}},{"line":317,"address":[12697424],"length":1,"stats":{"Line":8}},{"line":322,"address":[6328698],"length":1,"stats":{"Line":12}},{"line":323,"address":[5110344],"length":1,"stats":{"Line":13}},{"line":324,"address":[3847010],"length":1,"stats":{"Line":12}},{"line":326,"address":[5012595,5010272,5014891,5007927],"length":1,"stats":{"Line":3}},{"line":330,"address":[13858471],"length":1,"stats":{"Line":1}},{"line":331,"address":[9552019],"length":1,"stats":{"Line":2}},{"line":332,"address":[14068895,14068931,14068736,14068814],"length":1,"stats":{"Line":2}},{"line":333,"address":[12697344],"length":1,"stats":{"Line":1}},{"line":336,"address":[5881287,5877613],"length":1,"stats":{"Line":1}},{"line":337,"address":[5029030,5029131],"length":1,"stats":{"Line":2}},{"line":339,"address":[14069135],"length":1,"stats":{"Line":1}},{"line":341,"address":[5880083,5876397],"length":1,"stats":{"Line":1}},{"line":345,"address":[12698760,12698592],"length":1,"stats":{"Line":1}},{"line":346,"address":[2758423],"length":1,"stats":{"Line":1}},{"line":347,"address":[5016390],"length":1,"stats":{"Line":1}},{"line":348,"address":[2758653,2758753],"length":1,"stats":{"Line":0}},{"line":349,"address":[6348884],"length":1,"stats":{"Line":0}},{"line":351,"address":[7701479],"length":1,"stats":{"Line":0}},{"line":353,"address":[3847062],"length":1,"stats":{"Line":0}},{"line":354,"address":[2759188],"length":1,"stats":{"Line":0}},{"line":355,"address":[5208890,5208819],"length":1,"stats":{"Line":0}},{"line":356,"address":[5016661,5016752],"length":1,"stats":{"Line":0}},{"line":358,"address":[6539143],"length":1,"stats":{"Line":0}},{"line":361,"address":[14043364],"length":1,"stats":{"Line":0}},{"line":362,"address":[6348940],"length":1,"stats":{"Line":0}},{"line":363,"address":[11713820,11713788,11713861],"length":1,"stats":{"Line":0}},{"line":366,"address":[11498893],"length":1,"stats":{"Line":0}},{"line":369,"address":[6512352],"length":1,"stats":{"Line":1}},{"line":370,"address":[14042745],"length":1,"stats":{"Line":2}},{"line":371,"address":[12702543,12702643],"length":1,"stats":{"Line":4}},{"line":372,"address":[5802311],"length":1,"stats":{"Line":4}},{"line":373,"address":[6884731],"length":1,"stats":{"Line":1}},{"line":374,"address":[5878239,5881903],"length":1,"stats":{"Line":0}},{"line":375,"address":[14068165],"length":1,"stats":{"Line":3}},{"line":379,"address":[5045741,5045515,5045629,5045311],"length":1,"stats":{"Line":1}},{"line":382,"address":[5034309],"length":1,"stats":{"Line":1}},{"line":383,"address":[5214543],"length":1,"stats":{"Line":3}},{"line":386,"address":[2682522,2681376,2682294],"length":1,"stats":{"Line":1}},{"line":387,"address":[5016980],"length":1,"stats":{"Line":1}},{"line":388,"address":[6884597],"length":1,"stats":{"Line":1}},{"line":389,"address":[5035120],"length":1,"stats":{"Line":2}},{"line":390,"address":[6349512,6349724,6349461],"length":1,"stats":{"Line":2}},{"line":392,"address":[2682229,2682300],"length":1,"stats":{"Line":2}},{"line":393,"address":[5035031,5034624],"length":1,"stats":{"Line":0}},{"line":394,"address":[5110000,5110168],"length":1,"stats":{"Line":0}},{"line":398,"address":[2681769],"length":1,"stats":{"Line":1}},{"line":401,"address":[5198245,5196720,5198273],"length":1,"stats":{"Line":1}},{"line":402,"address":[5196848],"length":1,"stats":{"Line":2}},{"line":403,"address":[12699229],"length":1,"stats":{"Line":2}},{"line":404,"address":[5017534],"length":1,"stats":{"Line":3}},{"line":406,"address":[5197470,5197385],"length":1,"stats":{"Line":2}},{"line":408,"address":[14066265],"length":1,"stats":{"Line":2}},{"line":409,"address":[2747766,2747830],"length":1,"stats":{"Line":3}},{"line":414,"address":[5060240],"length":1,"stats":{"Line":2}},{"line":418,"address":[6710013],"length":1,"stats":{"Line":4}},{"line":419,"address":[2748239],"length":1,"stats":{"Line":2}},{"line":421,"address":[2748371],"length":1,"stats":{"Line":1}},{"line":424,"address":[6883648,6883696],"length":1,"stats":{"Line":0}},{"line":426,"address":[5034195,5034147],"length":1,"stats":{"Line":0}},{"line":427,"address":[5029410,5027981,5027816,5027778,5029448,5029613],"length":1,"stats":{"Line":0}},{"line":428,"address":[5029631,5027946,5028088,5029578,5027999,5029720],"length":1,"stats":{"Line":0}},{"line":432,"address":[5034224],"length":1,"stats":{"Line":0}},{"line":433,"address":[14066093],"length":1,"stats":{"Line":0}},{"line":436,"address":[5134118,5134320,5134661],"length":1,"stats":{"Line":0}},{"line":437,"address":[5139180,5139245],"length":1,"stats":{"Line":0}},{"line":439,"address":[2688301,2692454,2688230],"length":1,"stats":{"Line":0}},{"line":440,"address":[6536094],"length":1,"stats":{"Line":0}},{"line":443,"address":[6882523],"length":1,"stats":{"Line":0}},{"line":444,"address":[6536196,6536244],"length":1,"stats":{"Line":0}},{"line":446,"address":[5033008],"length":1,"stats":{"Line":0}},{"line":447,"address":[2689013],"length":1,"stats":{"Line":0}},{"line":448,"address":[6392885,6392932,6392849],"length":1,"stats":{"Line":0}},{"line":452,"address":[5143422,5140320,5140151],"length":1,"stats":{"Line":0}},{"line":453,"address":[14065760],"length":1,"stats":{"Line":0}},{"line":455,"address":[5649184],"length":1,"stats":{"Line":0}},{"line":456,"address":[5034105],"length":1,"stats":{"Line":0}},{"line":458,"address":[6354865],"length":1,"stats":{"Line":0}},{"line":459,"address":[2689725,2692335],"length":1,"stats":{"Line":0}},{"line":461,"address":[3632684],"length":1,"stats":{"Line":0}},{"line":462,"address":[5143257,5140871],"length":1,"stats":{"Line":0}},{"line":463,"address":[14066040],"length":1,"stats":{"Line":0}},{"line":466,"address":[13868557],"length":1,"stats":{"Line":0}},{"line":469,"address":[13868587],"length":1,"stats":{"Line":0}},{"line":470,"address":[6883328,6883136,6882768,6882944],"length":1,"stats":{"Line":0}},{"line":471,"address":[5142742,5141240,5143105,5142917],"length":1,"stats":{"Line":0}},{"line":472,"address":[5033306,5033881,5033497,5033689],"length":1,"stats":{"Line":0}},{"line":473,"address":[13870137],"length":1,"stats":{"Line":0}},{"line":477,"address":[6340134,6339732],"length":1,"stats":{"Line":0}},{"line":478,"address":[2690284,2690376],"length":1,"stats":{"Line":0}},{"line":479,"address":[5142325,5141534],"length":1,"stats":{"Line":0}},{"line":480,"address":[13870049],"length":1,"stats":{"Line":0}},{"line":481,"address":[6380167],"length":1,"stats":{"Line":0}},{"line":482,"address":[6536405],"length":1,"stats":{"Line":0}},{"line":489,"address":[2690250,2690535],"length":1,"stats":{"Line":0}},{"line":490,"address":[3633152],"length":1,"stats":{"Line":0}},{"line":492,"address":[2690636],"length":1,"stats":{"Line":0}},{"line":493,"address":[11499802],"length":1,"stats":{"Line":0}},{"line":494,"address":[7707735,7707425],"length":1,"stats":{"Line":0}},{"line":495,"address":[5804906],"length":1,"stats":{"Line":0}},{"line":498,"address":[7707903,7707815],"length":1,"stats":{"Line":0}},{"line":499,"address":[2691011],"length":1,"stats":{"Line":0}},{"line":501,"address":[5806677],"length":1,"stats":{"Line":0}},{"line":504,"address":[7739034],"length":1,"stats":{"Line":1}},{"line":505,"address":[13870749],"length":1,"stats":{"Line":2}},{"line":506,"address":[14070225,14070268],"length":1,"stats":{"Line":0}},{"line":507,"address":[2686456],"length":1,"stats":{"Line":1}},{"line":508,"address":[2686514,2686470],"length":1,"stats":{"Line":1}},{"line":510,"address":[3848336,3848429],"length":1,"stats":{"Line":12}},{"line":511,"address":[6339145],"length":1,"stats":{"Line":0}},{"line":517,"address":[5218176],"length":1,"stats":{"Line":1}},{"line":518,"address":[6539661],"length":1,"stats":{"Line":24}},{"line":519,"address":[5218204],"length":1,"stats":{"Line":12}},{"line":520,"address":[5138531,5138197,5138515],"length":1,"stats":{"Line":2}},{"line":521,"address":[5684238,5684179],"length":1,"stats":{"Line":0}},{"line":522,"address":[6539730,6539839],"length":1,"stats":{"Line":22}},{"line":526,"address":[6339446,6339519],"length":1,"stats":{"Line":1}},{"line":529,"address":[2684207,2682544,2684229],"length":1,"stats":{"Line":1}},{"line":530,"address":[7717826],"length":1,"stats":{"Line":2}},{"line":531,"address":[7704425,7704390],"length":1,"stats":{"Line":0}},{"line":532,"address":[5218252],"length":1,"stats":{"Line":1}},{"line":533,"address":[5133892,5133841],"length":1,"stats":{"Line":1}},{"line":534,"address":[13869483,13868672,13869489],"length":1,"stats":{"Line":1}},{"line":536,"address":[6338341,6338360,6338408],"length":1,"stats":{"Line":1}},{"line":537,"address":[11713168],"length":1,"stats":{"Line":3}},{"line":538,"address":[7715409],"length":1,"stats":{"Line":2}},{"line":539,"address":[5134467,5134851,5134871],"length":1,"stats":{"Line":0}},{"line":541,"address":[5217640],"length":1,"stats":{"Line":2}},{"line":543,"address":[13868875],"length":1,"stats":{"Line":3}},{"line":544,"address":[5217456],"length":1,"stats":{"Line":0}},{"line":545,"address":[13868806],"length":1,"stats":{"Line":0}},{"line":548,"address":[5134374],"length":1,"stats":{"Line":1}},{"line":551,"address":[5200592,5204353,5203948],"length":1,"stats":{"Line":0}},{"line":552,"address":[5804746],"length":1,"stats":{"Line":0}},{"line":553,"address":[5653539,5653812,5649945,5649445,5655910,5652879,5649750,5649617,5656138,5649880,5656166,5649815,5651470,5649685,5653197,5650058],"length":1,"stats":{"Line":0}},{"line":554,"address":[13869401],"length":1,"stats":{"Line":0}},{"line":555,"address":[4967730,4967878,4967712],"length":1,"stats":{"Line":0}},{"line":556,"address":[3632831],"length":1,"stats":{"Line":0}},{"line":559,"address":[4968048],"length":1,"stats":{"Line":0}},{"line":562,"address":[5201205,5204340,5201096,5201474],"length":1,"stats":{"Line":0}},{"line":563,"address":[7715936],"length":1,"stats":{"Line":0}},{"line":565,"address":[11499649],"length":1,"stats":{"Line":0}},{"line":567,"address":[5633939,5633387],"length":1,"stats":{"Line":0}},{"line":570,"address":[5766893,5766796],"length":1,"stats":{"Line":0}},{"line":571,"address":[2751972,2752067],"length":1,"stats":{"Line":0}},{"line":573,"address":[4968064],"length":1,"stats":{"Line":0}},{"line":574,"address":[7691056],"length":1,"stats":{"Line":0}},{"line":575,"address":[2752396,2752310],"length":1,"stats":{"Line":0}},{"line":579,"address":[6340443],"length":1,"stats":{"Line":0}},{"line":580,"address":[2752778,2752693],"length":1,"stats":{"Line":0}},{"line":583,"address":[7691189],"length":1,"stats":{"Line":0}},{"line":584,"address":[13870895],"length":1,"stats":{"Line":0}},{"line":585,"address":[2754398,2753175],"length":1,"stats":{"Line":0}},{"line":589,"address":[2753264,2753303,2753156,2753362,2754366],"length":1,"stats":{"Line":0}},{"line":590,"address":[5203137],"length":1,"stats":{"Line":0}},{"line":591,"address":[7260895],"length":1,"stats":{"Line":0}},{"line":592,"address":[13871003],"length":1,"stats":{"Line":0}},{"line":595,"address":[11499920],"length":1,"stats":{"Line":11}},{"line":596,"address":[6700705],"length":1,"stats":{"Line":11}},{"line":597,"address":[6700894,6700727,6700903],"length":1,"stats":{"Line":11}},{"line":598,"address":[5208163],"length":1,"stats":{"Line":0}},{"line":600,"address":[5203808],"length":1,"stats":{"Line":0}},{"line":603,"address":[13873297],"length":1,"stats":{"Line":1}},{"line":605,"address":[2748706,2748758,2748625],"length":1,"stats":{"Line":3}},{"line":606,"address":[6343102],"length":1,"stats":{"Line":0}},{"line":607,"address":[5630947],"length":1,"stats":{"Line":1}},{"line":608,"address":[4967376,4967542,4967394],"length":1,"stats":{"Line":4}},{"line":610,"address":[7683875],"length":1,"stats":{"Line":1}},{"line":611,"address":[7683945],"length":1,"stats":{"Line":1}},{"line":612,"address":[7683951],"length":1,"stats":{"Line":0}},{"line":616,"address":[2749078],"length":1,"stats":{"Line":1}},{"line":617,"address":[2749154,2749234],"length":1,"stats":{"Line":0}},{"line":618,"address":[5200002,5199110],"length":1,"stats":{"Line":0}},{"line":619,"address":[2750272,2750645,2750478],"length":1,"stats":{"Line":0}},{"line":620,"address":[6700928],"length":1,"stats":{"Line":0}},{"line":621,"address":[3632462,3632288],"length":1,"stats":{"Line":11}},{"line":628,"address":[11715544,11715618],"length":1,"stats":{"Line":2}},{"line":629,"address":[5766380,5766477],"length":1,"stats":{"Line":12}},{"line":630,"address":[4326238],"length":1,"stats":{"Line":1}},{"line":631,"address":[5199602,5199662],"length":1,"stats":{"Line":1}},{"line":632,"address":[13865786],"length":1,"stats":{"Line":1}},{"line":634,"address":[6335472],"length":1,"stats":{"Line":1}},{"line":637,"address":[7709920],"length":1,"stats":{"Line":1}},{"line":645,"address":[6336500,6337178],"length":1,"stats":{"Line":3}},{"line":646,"address":[5219410,5219120,5219404],"length":1,"stats":{"Line":0}},{"line":647,"address":[5214808],"length":1,"stats":{"Line":1}},{"line":648,"address":[7272148,7272076,7272132],"length":1,"stats":{"Line":4}},{"line":649,"address":[13866938],"length":1,"stats":{"Line":1}},{"line":652,"address":[6337131,6336673,6336954],"length":1,"stats":{"Line":1}},{"line":653,"address":[2765622],"length":1,"stats":{"Line":1}},{"line":654,"address":[7739081],"length":1,"stats":{"Line":2}},{"line":655,"address":[7739086],"length":1,"stats":{"Line":1}},{"line":656,"address":[6705514],"length":1,"stats":{"Line":2}},{"line":659,"address":[5215198],"length":1,"stats":{"Line":1}},{"line":660,"address":[5215302],"length":1,"stats":{"Line":1}},{"line":661,"address":[5048200],"length":1,"stats":{"Line":1}},{"line":664,"address":[2766028],"length":1,"stats":{"Line":1}},{"line":665,"address":[5811776,5811781,5811573,5812336,5811568,5812355],"length":1,"stats":{"Line":0}},{"line":667,"address":[5641959],"length":1,"stats":{"Line":1}},{"line":670,"address":[2477099,2477243],"length":1,"stats":{"Line":2}},{"line":673,"address":[5642160],"length":1,"stats":{"Line":2}},{"line":674,"address":[2766988],"length":1,"stats":{"Line":1}},{"line":675,"address":[5685520,5685666],"length":1,"stats":{"Line":0}},{"line":678,"address":[2767011],"length":1,"stats":{"Line":1}},{"line":679,"address":[5216593,5216517],"length":1,"stats":{"Line":0}},{"line":680,"address":[2768170,2767343],"length":1,"stats":{"Line":0}},{"line":681,"address":[2768188,2768394,2768564],"length":1,"stats":{"Line":0}},{"line":682,"address":[2477356],"length":1,"stats":{"Line":0}},{"line":683,"address":[5811600],"length":1,"stats":{"Line":0}},{"line":690,"address":[5217492,5216731,5216793,5216439],"length":1,"stats":{"Line":1}},{"line":691,"address":[5641904],"length":1,"stats":{"Line":1}},{"line":692,"address":[5215247,5215039],"length":1,"stats":{"Line":1}},{"line":693,"address":[5217102,5217162],"length":1,"stats":{"Line":1}},{"line":694,"address":[5217254,5217314],"length":1,"stats":{"Line":1}},{"line":696,"address":[5217418],"length":1,"stats":{"Line":1}},{"line":699,"address":[6337859],"length":1,"stats":{"Line":0}},{"line":701,"address":[7713328],"length":1,"stats":{"Line":0}},{"line":702,"address":[5640150],"length":1,"stats":{"Line":9}},{"line":703,"address":[5046048],"length":1,"stats":{"Line":0}},{"line":704,"address":[7692794,7692576,7692823],"length":1,"stats":{"Line":0}},{"line":707,"address":[7713552],"length":1,"stats":{"Line":3}},{"line":708,"address":[5178584],"length":1,"stats":{"Line":9}},{"line":709,"address":[7692944],"length":1,"stats":{"Line":0}},{"line":710,"address":[2681331],"length":1,"stats":{"Line":0}},{"line":713,"address":[7692432],"length":1,"stats":{"Line":0}},{"line":714,"address":[3318480,3318096,3318256,3318176,3318368,3318560],"length":1,"stats":{"Line":0}},{"line":715,"address":[3318195,3318396,3318284,3318578,3318119,3318498],"length":1,"stats":{"Line":0}},{"line":716,"address":[7713520],"length":1,"stats":{"Line":0}},{"line":721,"address":[7269584],"length":1,"stats":{"Line":0}},{"line":722,"address":[5216956],"length":1,"stats":{"Line":0}},{"line":725,"address":[2680755],"length":1,"stats":{"Line":9}},{"line":728,"address":[5644528],"length":1,"stats":{"Line":0}},{"line":729,"address":[5217077],"length":1,"stats":{"Line":0}},{"line":731,"address":[2681244,2681128],"length":1,"stats":{"Line":0}},{"line":732,"address":[13859900,13859852,13859807],"length":1,"stats":{"Line":0}},{"line":734,"address":[7268748,7269797],"length":1,"stats":{"Line":0}},{"line":737,"address":[7697397],"length":1,"stats":{"Line":0}},{"line":740,"address":[5206169,5207844,5204368],"length":1,"stats":{"Line":1}},{"line":741,"address":[7697476],"length":1,"stats":{"Line":1}},{"line":744,"address":[2754816,2754904],"length":1,"stats":{"Line":2}},{"line":745,"address":[13860431,13860819,13861104],"length":1,"stats":{"Line":2}},{"line":746,"address":[2757891],"length":1,"stats":{"Line":1}},{"line":747,"address":[6330821,6330760],"length":1,"stats":{"Line":2}},{"line":748,"address":[13861183,13861233,13861228],"length":1,"stats":{"Line":0}},{"line":749,"address":[5207689,5207624],"length":1,"stats":{"Line":1}},{"line":755,"address":[7696992],"length":1,"stats":{"Line":1}},{"line":756,"address":[5204860,5204947],"length":1,"stats":{"Line":2}},{"line":757,"address":[5206861,5205222,5206951],"length":1,"stats":{"Line":3}},{"line":758,"address":[7687328,7687744,7687360,7687782],"length":1,"stats":{"Line":2}},{"line":761,"address":[5205264],"length":1,"stats":{"Line":1}},{"line":762,"address":[5047633],"length":1,"stats":{"Line":2}},{"line":763,"address":[5641438],"length":1,"stats":{"Line":1}},{"line":764,"address":[5641494],"length":1,"stats":{"Line":0}},{"line":765,"address":[6379956],"length":1,"stats":{"Line":0}},{"line":771,"address":[5641541],"length":1,"stats":{"Line":1}},{"line":772,"address":[4316912,4317079,4317099,4317108,4317070,4317137,4317128,4316989],"length":1,"stats":{"Line":8}},{"line":773,"address":[5206314],"length":1,"stats":{"Line":0}},{"line":774,"address":[5660384],"length":1,"stats":{"Line":0}},{"line":775,"address":[7713150],"length":1,"stats":{"Line":3}},{"line":776,"address":[7713192],"length":1,"stats":{"Line":0}},{"line":782,"address":[5205644,5206114,5205782],"length":1,"stats":{"Line":2}},{"line":783,"address":[5641037],"length":1,"stats":{"Line":0}},{"line":785,"address":[7277046],"length":1,"stats":{"Line":1}},{"line":789,"address":[5135472,5136718,5137532],"length":1,"stats":{"Line":1}},{"line":790,"address":[5135511],"length":1,"stats":{"Line":1}},{"line":793,"address":[7714561],"length":1,"stats":{"Line":1}},{"line":794,"address":[5135608,5135688],"length":1,"stats":{"Line":2}},{"line":795,"address":[2684590,2686356],"length":1,"stats":{"Line":2}},{"line":797,"address":[5135827],"length":1,"stats":{"Line":1}},{"line":798,"address":[2686089,2684784],"length":1,"stats":{"Line":2}},{"line":799,"address":[5137483,5137370],"length":1,"stats":{"Line":0}},{"line":800,"address":[5137396,5137488],"length":1,"stats":{"Line":0}},{"line":804,"address":[5639049],"length":1,"stats":{"Line":1}},{"line":805,"address":[5050664,5048978],"length":1,"stats":{"Line":2}},{"line":806,"address":[5136811],"length":1,"stats":{"Line":1}},{"line":807,"address":[5639030],"length":1,"stats":{"Line":1}},{"line":808,"address":[2685772,2685857,2685739],"length":1,"stats":{"Line":3}},{"line":809,"address":[2685906],"length":1,"stats":{"Line":1}},{"line":813,"address":[5136193,5136663,5136331],"length":1,"stats":{"Line":2}},{"line":814,"address":[2685556,2685171,2685216],"length":1,"stats":{"Line":0}},{"line":816,"address":[5638605,5638545],"length":1,"stats":{"Line":1}},{"line":820,"address":[5211930,5211962,5211424],"length":1,"stats":{"Line":1}},{"line":821,"address":[7691461],"length":1,"stats":{"Line":1}},{"line":822,"address":[2762035,2762472,2762278],"length":1,"stats":{"Line":0}},{"line":826,"address":[7686434,7687160],"length":1,"stats":{"Line":1}},{"line":827,"address":[5211736],"length":1,"stats":{"Line":1}},{"line":830,"address":[6382142,6383899],"length":1,"stats":{"Line":1}},{"line":831,"address":[2762635,2762724],"length":1,"stats":{"Line":2}},{"line":832,"address":[5212298],"length":1,"stats":{"Line":0}},{"line":837,"address":[2762872,2762674],"length":1,"stats":{"Line":2}},{"line":838,"address":[6694278,6695093,6695823,6697461,6695215],"length":1,"stats":{"Line":5}},{"line":839,"address":[2765065],"length":1,"stats":{"Line":1}},{"line":844,"address":[4319033],"length":1,"stats":{"Line":1}},{"line":845,"address":[7735200],"length":1,"stats":{"Line":1}},{"line":846,"address":[2763106],"length":1,"stats":{"Line":1}},{"line":849,"address":[7274234,7275143],"length":1,"stats":{"Line":1}},{"line":850,"address":[5639332],"length":1,"stats":{"Line":2}},{"line":851,"address":[2764282],"length":1,"stats":{"Line":1}},{"line":852,"address":[2764636,2764723],"length":1,"stats":{"Line":2}},{"line":857,"address":[2763314],"length":1,"stats":{"Line":4}},{"line":858,"address":[2763640,2763466],"length":1,"stats":{"Line":5}},{"line":859,"address":[5213117],"length":1,"stats":{"Line":1}},{"line":860,"address":[4336701,4336677,4336686,4336606,4336710],"length":1,"stats":{"Line":16}},{"line":861,"address":[5645109],"length":1,"stats":{"Line":1}},{"line":867,"address":[7697979,7698013],"length":1,"stats":{"Line":1}},{"line":868,"address":[5223789,5223733],"length":1,"stats":{"Line":1}},{"line":871,"address":[7274785],"length":1,"stats":{"Line":3}},{"line":872,"address":[7716384],"length":1,"stats":{"Line":0}},{"line":875,"address":[7275942],"length":1,"stats":{"Line":0}},{"line":876,"address":[6373465,6375818,6375763,6373520],"length":1,"stats":{"Line":3}},{"line":878,"address":[5223384],"length":1,"stats":{"Line":0}},{"line":882,"address":[7275040,7276149,7276389,7276418,7273693,7276192],"length":1,"stats":{"Line":0}},{"line":883,"address":[7697538],"length":1,"stats":{"Line":0}},{"line":884,"address":[7276672,7276985,7276979],"length":1,"stats":{"Line":0}},{"line":885,"address":[5041330,5043628],"length":1,"stats":{"Line":0}},{"line":886,"address":[5223987],"length":1,"stats":{"Line":3}},{"line":887,"address":[6376048,6373592,6373748,6375891],"length":1,"stats":{"Line":0}},{"line":888,"address":[2698280],"length":1,"stats":{"Line":0}},{"line":890,"address":[2698312,2698338],"length":1,"stats":{"Line":0}},{"line":891,"address":[5663605],"length":1,"stats":{"Line":0}},{"line":892,"address":[5224053],"length":1,"stats":{"Line":0}},{"line":894,"address":[5149413,5149572,5149372],"length":1,"stats":{"Line":3}},{"line":897,"address":[5663621],"length":1,"stats":{"Line":0}},{"line":901,"address":[7277712,7278542,7279327],"length":1,"stats":{"Line":3}},{"line":902,"address":[7716080],"length":1,"stats":{"Line":0}},{"line":903,"address":[7277739],"length":1,"stats":{"Line":0}},{"line":904,"address":[4319728],"length":1,"stats":{"Line":0}},{"line":908,"address":[5042010,5041971,5041930,5044271,5044230,5044310],"length":1,"stats":{"Line":0}},{"line":909,"address":[2698822,2699972],"length":1,"stats":{"Line":0}},{"line":910,"address":[5150943],"length":1,"stats":{"Line":0}},{"line":911,"address":[5226748,5226871,5226892],"length":1,"stats":{"Line":0}},{"line":912,"address":[7277905],"length":1,"stats":{"Line":0}},{"line":913,"address":[4319984],"length":1,"stats":{"Line":3}},{"line":914,"address":[5225305,5225468],"length":1,"stats":{"Line":3}},{"line":915,"address":[5640912],"length":1,"stats":{"Line":3}},{"line":916,"address":[7693691],"length":1,"stats":{"Line":0}},{"line":917,"address":[5640979],"length":1,"stats":{"Line":0}},{"line":918,"address":[7279821],"length":1,"stats":{"Line":0}},{"line":919,"address":[7716310],"length":1,"stats":{"Line":0}},{"line":922,"address":[6698352],"length":1,"stats":{"Line":0}},{"line":925,"address":[7716033],"length":1,"stats":{"Line":0}},{"line":926,"address":[5640457,5640395],"length":1,"stats":{"Line":0}},{"line":927,"address":[7279073,7279295,7279114,7279273],"length":1,"stats":{"Line":0}},{"line":928,"address":[5640528],"length":1,"stats":{"Line":0}},{"line":932,"address":[2700785],"length":1,"stats":{"Line":0}},{"line":933,"address":[5152148,5151732,5151911],"length":1,"stats":{"Line":0}},{"line":935,"address":[4320923],"length":1,"stats":{"Line":0}},{"line":939,"address":[7688345,7689246],"length":1,"stats":{"Line":0}},{"line":940,"address":[6374448,6374757,6376750,6374336,6376695,6376637,6377059,6374393],"length":1,"stats":{"Line":0}},{"line":945,"address":[2471063,2470964],"length":1,"stats":{"Line":0}},{"line":947,"address":[2698877],"length":1,"stats":{"Line":0}},{"line":948,"address":[6373028,6375319],"length":1,"stats":{"Line":0}},{"line":949,"address":[6377372,6375070,6375085,6377387],"length":1,"stats":{"Line":0}},{"line":950,"address":[5155183],"length":1,"stats":{"Line":0}},{"line":952,"address":[5224793],"length":1,"stats":{"Line":0}},{"line":954,"address":[2706648,2705390,2705339],"length":1,"stats":{"Line":0}},{"line":955,"address":[5157287,5156727,5156794],"length":1,"stats":{"Line":0}},{"line":956,"address":[2706370,2705970,2704347,2706539,2705346,2704461],"length":1,"stats":{"Line":0}},{"line":957,"address":[7695426,7695476],"length":1,"stats":{"Line":0}},{"line":959,"address":[5224856],"length":1,"stats":{"Line":0}},{"line":960,"address":[6388734,6384929],"length":1,"stats":{"Line":0}},{"line":964,"address":[7695784],"length":1,"stats":{"Line":0}},{"line":965,"address":[7695716,7695666],"length":1,"stats":{"Line":0}},{"line":966,"address":[5052784,5056655,5052853,5056586],"length":1,"stats":{"Line":0}},{"line":967,"address":[7695780],"length":1,"stats":{"Line":0}},{"line":968,"address":[7280549,7280840],"length":1,"stats":{"Line":0}},{"line":969,"address":[7695686,7695841],"length":1,"stats":{"Line":0}},{"line":970,"address":[5227724],"length":1,"stats":{"Line":0}},{"line":972,"address":[5643174,5643285],"length":1,"stats":{"Line":0}},{"line":973,"address":[7696327,7696260],"length":1,"stats":{"Line":0}},{"line":977,"address":[5149979,5159496],"length":1,"stats":{"Line":0}},{"line":978,"address":[5056973,5053189],"length":1,"stats":{"Line":0}},{"line":979,"address":[2708869],"length":1,"stats":{"Line":0}},{"line":980,"address":[5220524],"length":1,"stats":{"Line":0}},{"line":981,"address":[5161795,5161366,5161433],"length":1,"stats":{"Line":0}},{"line":982,"address":[7273290],"length":1,"stats":{"Line":0}},{"line":983,"address":[5160087,5160280,5160441],"length":1,"stats":{"Line":0}},{"line":985,"address":[6392241,6389376,6392269,6385593,6388603,6388631],"length":1,"stats":{"Line":0}},{"line":988,"address":[5636896,5659014,5636928,5658976],"length":1,"stats":{"Line":0}},{"line":990,"address":[5658994,5636923],"length":1,"stats":{"Line":0}},{"line":991,"address":[7277056],"length":1,"stats":{"Line":0}},{"line":992,"address":[5224338,5224379,5224452],"length":1,"stats":{"Line":0}},{"line":993,"address":[2711393,2712230,2713574],"length":1,"stats":{"Line":0}},{"line":994,"address":[7277280,7277333],"length":1,"stats":{"Line":0}},{"line":995,"address":[2711352,2713035,2711411,2713435,2713522],"length":1,"stats":{"Line":0}},{"line":996,"address":[5056856,5053070],"length":1,"stats":{"Line":0}},{"line":998,"address":[2711953,2711818,2711486],"length":1,"stats":{"Line":0}},{"line":999,"address":[6389768,6389702],"length":1,"stats":{"Line":0}},{"line":1003,"address":[5683675],"length":1,"stats":{"Line":0}},{"line":1009,"address":[6389838,6385932,6385899],"length":1,"stats":{"Line":0}},{"line":1010,"address":[5217953,5218047,5218102],"length":1,"stats":{"Line":0}},{"line":1012,"address":[5647158,5647712,5647510,5647654,5647109,5646950],"length":1,"stats":{"Line":0}},{"line":1013,"address":[2717458],"length":1,"stats":{"Line":0}},{"line":1014,"address":[5168078,5170853],"length":1,"stats":{"Line":0}},{"line":1015,"address":[5170832,5168219],"length":1,"stats":{"Line":0}},{"line":1016,"address":[5056196,5056275,5059834,5059957,5059913,5056319],"length":1,"stats":{"Line":0}},{"line":1017,"address":[5059999,5056279,5059917,5056361],"length":1,"stats":{"Line":0}},{"line":1019,"address":[5054775,5058404],"length":1,"stats":{"Line":0}},{"line":1020,"address":[5202327,5216333,5200262,5204126,5213573,5202024,5206518,5208778,5213934],"length":1,"stats":{"Line":0}},{"line":1022,"address":[7714064],"length":1,"stats":{"Line":0}},{"line":1024,"address":[5661073],"length":1,"stats":{"Line":0}},{"line":1026,"address":[5164902],"length":1,"stats":{"Line":0}},{"line":1027,"address":[5661158],"length":1,"stats":{"Line":0}},{"line":1031,"address":[2714365,2714496],"length":1,"stats":{"Line":0}},{"line":1032,"address":[5165142,5165232,5167934],"length":1,"stats":{"Line":0}},{"line":1033,"address":[5661332],"length":1,"stats":{"Line":0}},{"line":1034,"address":[2714925],"length":1,"stats":{"Line":0}},{"line":1035,"address":[2714977],"length":1,"stats":{"Line":0}},{"line":1037,"address":[7714096],"length":1,"stats":{"Line":0}},{"line":1038,"address":[5661362],"length":1,"stats":{"Line":0}},{"line":1040,"address":[5167779,5165527],"length":1,"stats":{"Line":0}},{"line":1042,"address":[6696768],"length":1,"stats":{"Line":3}},{"line":1043,"address":[7701162],"length":1,"stats":{"Line":3}},{"line":1044,"address":[5661584],"length":1,"stats":{"Line":0}},{"line":1049,"address":[2699319],"length":1,"stats":{"Line":0}},{"line":1050,"address":[4321955],"length":1,"stats":{"Line":3}},{"line":1051,"address":[5054057,5057971,5058003,5054089],"length":1,"stats":{"Line":0}},{"line":1053,"address":[5054249,5058107,5054193,5058163],"length":1,"stats":{"Line":0}},{"line":1054,"address":[7714289],"length":1,"stats":{"Line":0}},{"line":1055,"address":[5171456],"length":1,"stats":{"Line":0}},{"line":1056,"address":[5171524],"length":1,"stats":{"Line":0}},{"line":1058,"address":[6390405],"length":1,"stats":{"Line":0}},{"line":1059,"address":[5661570],"length":1,"stats":{"Line":0}},{"line":1061,"address":[2722871,2721058],"length":1,"stats":{"Line":0}},{"line":1063,"address":[2470558,2470604,2470590],"length":1,"stats":{"Line":0}},{"line":1064,"address":[2699399,2723083],"length":1,"stats":{"Line":0}},{"line":1065,"address":[2726172,2723215],"length":1,"stats":{"Line":0}},{"line":1067,"address":[2489488,2489472],"length":1,"stats":{"Line":0}},{"line":1068,"address":[6695601],"length":1,"stats":{"Line":0}},{"line":1069,"address":[5173903,5176426],"length":1,"stats":{"Line":0}},{"line":1070,"address":[5174037],"length":1,"stats":{"Line":0}},{"line":1071,"address":[2723737],"length":1,"stats":{"Line":0}},{"line":1073,"address":[5660999],"length":1,"stats":{"Line":0}},{"line":1074,"address":[6386638],"length":1,"stats":{"Line":0}},{"line":1076,"address":[6386923,6386662,6386724],"length":1,"stats":{"Line":3}},{"line":1078,"address":[2699539],"length":1,"stats":{"Line":3}},{"line":1085,"address":[2699564,2726245],"length":1,"stats":{"Line":0}},{"line":1086,"address":[5179763,5176677],"length":1,"stats":{"Line":0}},{"line":1089,"address":[7713633],"length":1,"stats":{"Line":0}},{"line":1091,"address":[4319344],"length":1,"stats":{"Line":0}},{"line":1092,"address":[2726451],"length":1,"stats":{"Line":0}},{"line":1093,"address":[6694963],"length":1,"stats":{"Line":0}},{"line":1094,"address":[4319694],"length":1,"stats":{"Line":0}},{"line":1096,"address":[2726783,2729505],"length":1,"stats":{"Line":0}},{"line":1097,"address":[2470057],"length":1,"stats":{"Line":0}},{"line":1098,"address":[2726989],"length":1,"stats":{"Line":0}},{"line":1100,"address":[2729135,2727102],"length":1,"stats":{"Line":0}},{"line":1101,"address":[2728700,2729086,2728629],"length":1,"stats":{"Line":0}},{"line":1103,"address":[5179483,5177231],"length":1,"stats":{"Line":0}},{"line":1105,"address":[2699598],"length":1,"stats":{"Line":0}},{"line":1106,"address":[5150605,5179877],"length":1,"stats":{"Line":0}},{"line":1107,"address":[5180009,5182792],"length":1,"stats":{"Line":0}},{"line":1109,"address":[5661505],"length":1,"stats":{"Line":0}},{"line":1110,"address":[2730015,2732614],"length":1,"stats":{"Line":0}},{"line":1111,"address":[2730169],"length":1,"stats":{"Line":0}},{"line":1112,"address":[2730221],"length":1,"stats":{"Line":0}},{"line":1114,"address":[7737936],"length":1,"stats":{"Line":0}},{"line":1115,"address":[2732318,2731861,2731932],"length":1,"stats":{"Line":0}},{"line":1117,"address":[5180383,5182635],"length":1,"stats":{"Line":0}},{"line":1119,"address":[5150639],"length":1,"stats":{"Line":0}},{"line":1120,"address":[5150657,5182821],"length":1,"stats":{"Line":0}},{"line":1121,"address":[5182952,5185162],"length":1,"stats":{"Line":0}},{"line":1123,"address":[5185141,5182922,5182998],"length":1,"stats":{"Line":0}},{"line":1124,"address":[2732977,2735048],"length":1,"stats":{"Line":0}},{"line":1125,"address":[2733131],"length":1,"stats":{"Line":0}},{"line":1126,"address":[5183295],"length":1,"stats":{"Line":0}},{"line":1128,"address":[5183404,5184934],"length":1,"stats":{"Line":0}},{"line":1129,"address":[5184542,5184904,5184475],"length":1,"stats":{"Line":0}},{"line":1131,"address":[2733153,2734950],"length":1,"stats":{"Line":0}},{"line":1133,"address":[5150691],"length":1,"stats":{"Line":0}},{"line":1134,"address":[2735119,2699786],"length":1,"stats":{"Line":0}},{"line":1135,"address":[2736872,2735267],"length":1,"stats":{"Line":0}},{"line":1137,"address":[5185299,5186871,5185381],"length":1,"stats":{"Line":0}},{"line":1138,"address":[5186850,5185492],"length":1,"stats":{"Line":0}},{"line":1139,"address":[5185626],"length":1,"stats":{"Line":0}},{"line":1140,"address":[2735638,2736778],"length":1,"stats":{"Line":0}},{"line":1141,"address":[5186316,5186768,5186249],"length":1,"stats":{"Line":0}},{"line":1143,"address":[2736650,2735600],"length":1,"stats":{"Line":0}},{"line":1146,"address":[2736885,2699812,2738852],"length":1,"stats":{"Line":0}},{"line":1147,"address":[2737106],"length":1,"stats":{"Line":0}},{"line":1148,"address":[2737195,2737674,2738778],"length":1,"stats":{"Line":0}},{"line":1149,"address":[2738301,2738719,2738230],"length":1,"stats":{"Line":0}},{"line":1151,"address":[5187132,5187258,5187393],"length":1,"stats":{"Line":0}},{"line":1152,"address":[2737458,2737567],"length":1,"stats":{"Line":0}},{"line":1157,"address":[5191023,5150794,5188862],"length":1,"stats":{"Line":0}},{"line":1158,"address":[2739083],"length":1,"stats":{"Line":0}},{"line":1159,"address":[5664584,5682832,5683351,5683527,5664635],"length":1,"stats":{"Line":0}},{"line":1160,"address":[2740566,2740966,2740495],"length":1,"stats":{"Line":0}},{"line":1161,"address":[2740907,2739097,2739156,2740522,2740974],"length":1,"stats":{"Line":0}},{"line":1162,"address":[2739368,2739164,2739509],"length":1,"stats":{"Line":0}},{"line":1164,"address":[5189204,5189507,5189642],"length":1,"stats":{"Line":0}},{"line":1165,"address":[2739844,2739751],"length":1,"stats":{"Line":0}},{"line":1169,"address":[2699880],"length":1,"stats":{"Line":0}},{"line":1170,"address":[2741093,2741515,2699890],"length":1,"stats":{"Line":0}},{"line":1171,"address":[2741342,2741271],"length":1,"stats":{"Line":0}},{"line":1175,"address":[2701633],"length":1,"stats":{"Line":0}}],"covered":265,"coverable":592},{"path":["/","home","jani","devel","mindmap-cli","src","main.rs"],"content":"use clap::Parser;\nuse mindmap_cli::{Cli, run};\n\nfn main() -\u003e anyhow::Result\u003c()\u003e {\n    let cli = Cli::parse();\n    run(cli)\n}\n","traces":[{"line":4,"address":[2213296],"length":1,"stats":{"Line":0}},{"line":5,"address":[2213303],"length":1,"stats":{"Line":0}},{"line":6,"address":[2213314],"length":1,"stats":{"Line":0}}],"covered":0,"coverable":3},{"path":["/","home","jani","devel","mindmap-cli","src","ui.rs"],"content":"use anyhow::Result;\nuse pretty_console::Console;\n\npub trait Printer {\n    fn show(\u0026self, node: \u0026crate::Node, inbound: \u0026[u32], outbound: \u0026[u32]) -\u003e Result\u003c()\u003e;\n    fn list(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e;\n    fn refs(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e;\n    fn links(\u0026self, id: u32, links: \u0026[u32]) -\u003e Result\u003c()\u003e;\n    fn search(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e;\n    fn orphans(\u0026self, orphans: \u0026[String]) -\u003e Result\u003c()\u003e;\n}\n\npub struct PrettyPrinter {}\n\nimpl PrettyPrinter {\n    pub fn new() -\u003e Result\u003cSelf\u003e {\n        Ok(Self {})\n    }\n}\n\nimpl Printer for PrettyPrinter {\n    fn show(\u0026self, node: \u0026crate::Node, inbound: \u0026[u32], outbound: \u0026[u32]) -\u003e Result\u003c()\u003e {\n        // ID in green (no newline)\n        Console::new(format!(\"[{}] \", node.id)).green().print();\n        // Title bold (uncolored) on same line\n        Console::new(\u0026node.raw_title).bold().println();\n\n        // Description on new line\n        Console::new(\u0026node.description).println();\n\n        // Incoming references in blue\n        if !inbound.is_empty() {\n            Console::new(\"Incoming:\").blue().print();\n            Console::new(format!(\" {:?}\", inbound)).blue().println();\n        }\n\n        // Outgoing references in magenta\n        if !outbound.is_empty() {\n            Console::new(\"Outgoing:\").magenta().print();\n            Console::new(format!(\" {:?}\", outbound)).magenta().println();\n        }\n\n        Ok(())\n    }\n\n    fn list(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e {\n        for line in lines {\n            Console::new(line).println();\n        }\n        Ok(())\n    }\n\n    fn refs(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e {\n        for line in lines {\n            Console::new(line).println();\n        }\n        Ok(())\n    }\n\n    fn links(\u0026self, id: u32, links: \u0026[u32]) -\u003e Result\u003c()\u003e {\n        let s = format!(\"Node [{}] references: {:?}\", id, links);\n        Console::new(\u0026s).println();\n        Ok(())\n    }\n\n    fn search(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e {\n        for line in lines {\n            Console::new(line).println();\n        }\n        Ok(())\n    }\n\n    fn orphans(\u0026self, orphans: \u0026[String]) -\u003e Result\u003c()\u003e {\n        // Orphans are data for the orphans command — print to stdout\n        if orphans.is_empty() {\n            Console::new(\"No orphans\").green().println();\n        } else {\n            Console::new(\"Orphans:\").yellow().bold().println();\n            for o in orphans {\n                Console::new(format!(\"[{}]\", o)).println();\n            }\n        }\n        Ok(())\n    }\n}\n\npub struct PlainPrinter {}\n\nimpl PlainPrinter {\n    pub fn new() -\u003e Result\u003cSelf\u003e {\n        Ok(Self {})\n    }\n}\n\nimpl Printer for PlainPrinter {\n    fn show(\u0026self, node: \u0026crate::Node, inbound: \u0026[u32], outbound: \u0026[u32]) -\u003e Result\u003c()\u003e {\n        println!(\"[{}] {}\", node.id, node.raw_title);\n        println!(\"{}\", node.description);\n        if !inbound.is_empty() {\n            println!(\"Incoming: {:?}\", inbound);\n        }\n        if !outbound.is_empty() {\n            println!(\"Outgoing: {:?}\", outbound);\n        }\n        Ok(())\n    }\n\n    fn list(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e {\n        for line in lines {\n            println!(\"{}\", line);\n        }\n        Ok(())\n    }\n\n    fn refs(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e {\n        for line in lines {\n            println!(\"{}\", line);\n        }\n        Ok(())\n    }\n\n    fn links(\u0026self, id: u32, links: \u0026[u32]) -\u003e Result\u003c()\u003e {\n        println!(\"Node [{}] references: {:?}\", id, links);\n        Ok(())\n    }\n\n    fn search(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e {\n        for line in lines {\n            println!(\"{}\", line);\n        }\n        Ok(())\n    }\n\n    fn orphans(\u0026self, orphans: \u0026[String]) -\u003e Result\u003c()\u003e {\n        if orphans.is_empty() {\n            println!(\"No orphans\");\n        } else {\n            println!(\"Orphans:\");\n            for o in orphans {\n                println!(\"{}\", o);\n            }\n        }\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn pretty_printer_smoke() -\u003e Result\u003c()\u003e {\n        let p = PrettyPrinter::new()?;\n        let node = crate::Node {\n            id: 1,\n            raw_title: \"AE: Test\".to_string(),\n            description: \"desc\".to_string(),\n            references: vec![2],\n            line_index: 0,\n        };\n        p.show(\u0026node, \u0026vec![3], \u0026node.references)?;\n        p.list(\u0026vec![\"one\".to_string(), \"two\".to_string()])?;\n        p.refs(\u0026vec![\"ref\".to_string()])?;\n        p.links(1, \u0026vec![2])?;\n        p.search(\u0026vec![\"s\".to_string()])?;\n        p.orphans(\u0026Vec::\u003cString\u003e::new())?;\n        p.orphans(\u0026vec![\"4\".to_string()])?;\n        Ok(())\n    }\n\n    #[test]\n    fn plain_printer_smoke() -\u003e Result\u003c()\u003e {\n        let p = PlainPrinter::new()?;\n        let node = crate::Node {\n            id: 1,\n            raw_title: \"AE: Test\".to_string(),\n            description: \"desc\".to_string(),\n            references: vec![2],\n            line_index: 0,\n        };\n        p.show(\u0026node, \u0026vec![3], \u0026node.references)?;\n        p.list(\u0026vec![\"one\".to_string(), \"two\".to_string()])?;\n        p.refs(\u0026vec![\"ref\".to_string()])?;\n        p.links(1, \u0026vec![2])?;\n        p.search(\u0026vec![\"s\".to_string()])?;\n        p.orphans(\u0026Vec::\u003cString\u003e::new())?;\n        p.orphans(\u0026vec![\"4\".to_string()])?;\n        Ok(())\n    }\n}\n","traces":[{"line":22,"address":[2864554,2863536,2864560],"length":1,"stats":{"Line":1}},{"line":24,"address":[2863596],"length":1,"stats":{"Line":1}},{"line":26,"address":[2863873],"length":1,"stats":{"Line":1}},{"line":29,"address":[2864004],"length":1,"stats":{"Line":1}},{"line":32,"address":[2864104],"length":1,"stats":{"Line":1}},{"line":33,"address":[2864130,2864242],"length":1,"stats":{"Line":1}},{"line":34,"address":[2864311],"length":1,"stats":{"Line":1}},{"line":38,"address":[2864207],"length":1,"stats":{"Line":1}},{"line":39,"address":[2864660,2864573],"length":1,"stats":{"Line":1}},{"line":40,"address":[2864726],"length":1,"stats":{"Line":1}},{"line":46,"address":[2863056,2863274,2863280],"length":1,"stats":{"Line":1}},{"line":47,"address":[2863104,2863120],"length":1,"stats":{"Line":2}},{"line":48,"address":[2863220,2863177],"length":1,"stats":{"Line":1}},{"line":53,"address":[2863520,2863514,2863296],"length":1,"stats":{"Line":1}},{"line":54,"address":[2863360,2863344],"length":1,"stats":{"Line":2}},{"line":55,"address":[2863417,2863460],"length":1,"stats":{"Line":1}},{"line":60,"address":[2864976,2865327,2865333],"length":1,"stats":{"Line":1}},{"line":61,"address":[2865010],"length":1,"stats":{"Line":1}},{"line":62,"address":[2865167,2865227],"length":1,"stats":{"Line":2}},{"line":66,"address":[2865578,2865584,2865360],"length":1,"stats":{"Line":1}},{"line":67,"address":[2865424,2865408],"length":1,"stats":{"Line":2}},{"line":68,"address":[5356544,5356514],"length":1,"stats":{"Line":1}},{"line":73,"address":[2865600,2866253,2866259],"length":1,"stats":{"Line":1}},{"line":75,"address":[5356691],"length":1,"stats":{"Line":1}},{"line":76,"address":[2866272,2865781],"length":1,"stats":{"Line":1}},{"line":78,"address":[5356873,5356700],"length":1,"stats":{"Line":1}},{"line":79,"address":[2865926,2865948],"length":1,"stats":{"Line":2}},{"line":80,"address":[2866029,2866193],"length":1,"stats":{"Line":1}},{"line":96,"address":[2861856],"length":1,"stats":{"Line":1}},{"line":97,"address":[2861907],"length":1,"stats":{"Line":1}},{"line":98,"address":[5353104],"length":1,"stats":{"Line":1}},{"line":99,"address":[2862114],"length":1,"stats":{"Line":1}},{"line":100,"address":[5353206],"length":1,"stats":{"Line":1}},{"line":102,"address":[2862231],"length":1,"stats":{"Line":1}},{"line":103,"address":[5353322],"length":1,"stats":{"Line":1}},{"line":108,"address":[2861440],"length":1,"stats":{"Line":1}},{"line":109,"address":[5352573,5352557],"length":1,"stats":{"Line":2}},{"line":110,"address":[2861555],"length":1,"stats":{"Line":1}},{"line":115,"address":[2861648],"length":1,"stats":{"Line":1}},{"line":116,"address":[2861709,2861693],"length":1,"stats":{"Line":2}},{"line":117,"address":[5352835],"length":1,"stats":{"Line":1}},{"line":122,"address":[2862368],"length":1,"stats":{"Line":1}},{"line":123,"address":[2862391],"length":1,"stats":{"Line":1}},{"line":127,"address":[2862528],"length":1,"stats":{"Line":1}},{"line":128,"address":[5353661,5353645],"length":1,"stats":{"Line":2}},{"line":129,"address":[2862643],"length":1,"stats":{"Line":1}},{"line":134,"address":[2862736],"length":1,"stats":{"Line":1}},{"line":135,"address":[2862794],"length":1,"stats":{"Line":1}},{"line":136,"address":[2862861],"length":1,"stats":{"Line":1}},{"line":138,"address":[2862804],"length":1,"stats":{"Line":1}},{"line":139,"address":[2862843,2862895],"length":1,"stats":{"Line":2}},{"line":140,"address":[2862949],"length":1,"stats":{"Line":1}}],"covered":52,"coverable":52}]};
        var previousData = {"files":[{"path":["/","home","jani","devel","mindmap-cli","src","lib.rs"],"content":"use anyhow::{Context, Result};\nuse clap::{Parser, Subcommand};\nuse std::{collections::HashMap, fs, io::Read, path::PathBuf};\n\nmod ui;\n\n#[derive(clap::ValueEnum, Clone)]\npub enum OutputFormat {\n    Default,\n    Json,\n}\n\n#[derive(Parser)]\n#[command(name = \"mindmap\")]\n#[command(about = \"CLI tool for working with MINDMAP files\")]\n#[command(\n    long_about = r#\"mindmap-cli — small CLI for inspecting and safely editing one-line MINDMAP files (default: ./MINDMAP.md).\nOne-node-per-line format: [N] **Title** - description with [N] references. IDs must be stable numeric values.\n\nEXAMPLES:\n  mindmap show 10\n  mindmap list --type AE --grep auth\n  mindmap add --type AE --title \"AuthService\" --desc \"Handles auth [12]\"\n  mindmap edit 12               # opens $EDITOR for an atomic, validated edit\n  mindmap patch 12 --title \"AuthSvc\" --desc \"Updated desc\"   # partial update (PATCH)\n  mindmap put 12 --line \"[31] **WF: Example** - Full line text [12]\"   # full-line replace (PUT)\n  mindmap graph 10 | dot -Tpng \u003e graph.png   # generate neighborhood graph\n  mindmap lint\n\nNotes:\n  - Default file: ./MINDMAP.md (override with --file)\n  - Use `--file -` to read a mindmap from stdin for read-only commands (list/show/refs/links/search/lint/orphans). Mutating commands will error when source is `-`.\n  - Use the EDITOR env var to control the editor used by 'edit'\n\"#\n)]\npub struct Cli {\n    /// Path to MINDMAP file (defaults to ./MINDMAP.md)\n    #[arg(global = true, short, long)]\n    pub file: Option\u003cPathBuf\u003e,\n\n    /// Output format: default (human) or json\n    #[arg(global = true, long, value_enum, default_value_t = OutputFormat::Default)]\n    pub output: OutputFormat,\n\n    #[command(subcommand)]\n    pub command: Commands,\n}\n\n#[derive(Subcommand)]\npub enum Commands {\n    /// Show a node by ID\n    Show { id: u32 },\n\n    /// List nodes (optionally filtered)\n    List {\n        #[arg(long)]\n        r#type: Option\u003cString\u003e,\n        #[arg(long)]\n        grep: Option\u003cString\u003e,\n    },\n\n    /// Show nodes that reference the given ID\n    Refs { id: u32 },\n\n    /// Show nodes that the given ID references\n    Links { id: u32 },\n\n    /// Search nodes by substring\n    Search { query: String },\n\n    /// Add a new node\n    Add {\n        #[arg(long)]\n        r#type: Option\u003cString\u003e,\n        #[arg(long)]\n        title: Option\u003cString\u003e,\n        #[arg(long)]\n        desc: Option\u003cString\u003e,\n        /// When using editor flow, perform strict reference validation\n        #[arg(long)]\n        strict: bool,\n    },\n\n    /// Deprecate a node, redirecting to another\n    Deprecate {\n        id: u32,\n        #[arg(long)]\n        to: u32,\n    },\n\n    /// Edit a node with $EDITOR\n    Edit { id: u32 },\n\n    /// Patch (partial update) a node: --type, --title, --desc\n    Patch {\n        id: u32,\n        #[arg(long)]\n        r#type: Option\u003cString\u003e,\n        #[arg(long)]\n        title: Option\u003cString\u003e,\n        #[arg(long)]\n        desc: Option\u003cString\u003e,\n        #[arg(long)]\n        strict: bool,\n    },\n\n    /// Put (full-line replace) a node: --line\n    Put {\n        id: u32,\n        #[arg(long)]\n        line: String,\n        #[arg(long)]\n        strict: bool,\n    },\n\n    /// Mark a node as needing verification (append verify tag)\n    Verify { id: u32 },\n\n    /// Delete a node by ID; use --force to remove even if referenced\n    Delete {\n        id: u32,\n        #[arg(long)]\n        force: bool,\n    },\n\n    /// Lint the mindmap for basic issues\n    Lint,\n\n    /// Show orphan nodes (no in \u0026 no out, excluding META)\n    Orphans,\n\n    /// Show graph neighborhood for a node (DOT format for Graphviz)\n    Graph { id: u32 },\n}\n\n#[derive(Debug, Clone)]\npub struct Node {\n    pub id: u32,\n    pub raw_title: String,\n    pub description: String,\n    pub references: Vec\u003cu32\u003e,\n    pub line_index: usize,\n}\n\n#[derive(Debug)]\npub struct Mindmap {\n    pub path: PathBuf,\n    pub lines: Vec\u003cString\u003e,\n    pub nodes: Vec\u003cNode\u003e,\n    pub by_id: HashMap\u003cu32, usize\u003e,\n}\n\nimpl Mindmap {\n    pub fn load(path: PathBuf) -\u003e Result\u003cSelf\u003e {\n        // load from file path\n        let content = fs::read_to_string(\u0026path)\n            .with_context(|| format!(\"Failed to read file {}\", path.display()))?;\n        Self::from_string(content, path)\n    }\n\n    /// Load mindmap content from any reader (e.g., stdin). Provide a path placeholder (e.g. \"-\")\n    /// so that callers can detect that the source was non-writable (stdin).\n    pub fn load_from_reader\u003cR: Read\u003e(mut reader: R, path: PathBuf) -\u003e Result\u003cSelf\u003e {\n        let mut content = String::new();\n        reader.read_to_string(\u0026mut content)?;\n        Self::from_string(content, path)\n    }\n\n    fn from_string(content: String, path: PathBuf) -\u003e Result\u003cSelf\u003e {\n        let lines: Vec\u003cString\u003e = content.lines().map(|s| s.to_string()).collect();\n\n        let mut nodes = Vec::new();\n        let mut by_id = HashMap::new();\n\n        for (i, line) in lines.iter().enumerate() {\n            if let Ok(node) = parse_node_line(line, i) {\n                if by_id.contains_key(\u0026node.id) {\n                    eprintln!(\"Warning: duplicate node id {} at line {}\", node.id, i + 1);\n                }\n                by_id.insert(node.id, nodes.len());\n                nodes.push(node);\n            }\n        }\n\n        Ok(Mindmap {\n            path,\n            lines,\n            nodes,\n            by_id,\n        })\n    }\n\n    pub fn save(\u0026self) -\u003e Result\u003c()\u003e {\n        // prevent persisting when loaded from stdin (path == \"-\")\n        if self.path.as_os_str() == \"-\" {\n            return Err(anyhow::anyhow!(\n                \"Cannot save: mindmap was loaded from stdin ('-'); use --file \u003cpath\u003e to save changes\"\n            ));\n        }\n\n        // atomic write: write to a temp file in the same dir then persist\n        let dir = self\n            .path\n            .parent()\n            .map(|p| p.to_path_buf())\n            .unwrap_or_else(|| PathBuf::from(\".\"));\n        let mut tmp = tempfile::NamedTempFile::new_in(\u0026dir)\n            .with_context(|| format!(\"Failed to create temp file in {}\", dir.display()))?;\n        let content = self.lines.join(\"\\n\") + \"\\n\";\n        use std::io::Write;\n        tmp.write_all(content.as_bytes())?;\n        tmp.flush()?;\n        tmp.persist(\u0026self.path)\n            .with_context(|| format!(\"Failed to persist temp file to {}\", self.path.display()))?;\n        Ok(())\n    }\n\n    pub fn next_id(\u0026self) -\u003e u32 {\n        self.by_id.keys().max().copied().unwrap_or(0) + 1\n    }\n\n    pub fn get_node(\u0026self, id: u32) -\u003e Option\u003c\u0026Node\u003e {\n        self.by_id.get(\u0026id).map(|\u0026idx| \u0026self.nodes[idx])\n    }\n}\n\n// Helper: lightweight manual parser for the strict node format\n// Format: ^\\[(\\d+)\\] \\*\\*(.+?)\\*\\* - (.*)$\npub fn parse_node_line(line: \u0026str, line_index: usize) -\u003e Result\u003cNode\u003e {\n    // Fast path sanity checks\n    let trimmed = line.trim_start();\n    if !trimmed.starts_with('[') {\n        return Err(anyhow::anyhow!(\"Line does not match node format\"));\n    }\n\n    // Find closing bracket for ID\n    let end_bracket = match trimmed.find(']') {\n        Some(pos) =\u003e pos,\n        None =\u003e return Err(anyhow::anyhow!(\"Line does not match node format\")),\n    };\n\n    let id_str = \u0026trimmed[1..end_bracket];\n    let id: u32 = id_str.parse()?;\n\n    // Expect a space after ']'\n    let mut pos = end_bracket + 1;\n    let chars = trimmed.as_bytes();\n    if chars.get(pos).map(|b| *b as char) == Some(' ') {\n        pos += 1;\n    } else {\n        return Err(anyhow::anyhow!(\"Line does not match node format\"));\n    }\n\n    // Expect opening '**'\n    if trimmed.get(pos..pos + 2) != Some(\"**\") {\n        return Err(anyhow::anyhow!(\"Line does not match node format\"));\n    }\n    pos += 2;\n\n    // Find closing '**' for title\n    let rem = \u0026trimmed[pos..];\n    let title_rel_end = match rem.find(\"**\") {\n        Some(p) =\u003e p,\n        None =\u003e return Err(anyhow::anyhow!(\"Line does not match node format\")),\n    };\n    let title = rem[..title_rel_end].to_string();\n    pos += title_rel_end + 2; // skip closing '**'\n\n    // Expect ' - ' (space dash space)\n    if trimmed.get(pos..pos + 3) != Some(\" - \") {\n        return Err(anyhow::anyhow!(\"Line does not match node format\"));\n    }\n    pos += 3;\n\n    let description = trimmed[pos..].to_string();\n\n    // Extract references\n    let references = extract_refs_from_str(\u0026description, Some(id));\n\n    Ok(Node {\n        id,\n        raw_title: title,\n        description,\n        references,\n        line_index,\n    })\n}\n\n// Extract references of the form [123] from a description string.\n// If skip_self is Some(id) then occurrences equal to that id are ignored.\nfn extract_refs_from_str(s: \u0026str, skip_self: Option\u003cu32\u003e) -\u003e Vec\u003cu32\u003e {\n    let mut refs = Vec::new();\n    let mut i = 0usize;\n    while i \u003c s.len() {\n        // find next '['\n        if let Some(rel) = s[i..].find('[') {\n            let start = i + rel;\n            if let Some(rel_end) = s[start..].find(']') {\n                let end = start + rel_end;\n                let idslice = \u0026s[start + 1..end];\n                if !idslice.is_empty()\n                    \u0026\u0026 idslice.chars().all(|c| c.is_ascii_digit())\n                    \u0026\u0026 let Ok(rid) = idslice.parse::\u003cu32\u003e()\n                    \u0026\u0026 Some(rid) != skip_self\n                {\n                    refs.push(rid);\n                }\n                i = end + 1;\n                continue;\n            } else {\n                break; // unmatched '['\n            }\n        } else {\n            break;\n        }\n    }\n    refs\n}\n\n// Command helpers\n\npub fn cmd_show(mm: \u0026Mindmap, id: u32) -\u003e String {\n    if let Some(node) = mm.get_node(id) {\n        let mut out = format!(\n            \"[{}] **{}** - {}\",\n            node.id, node.raw_title, node.description\n        );\n\n        // inbound refs\n        let mut inbound = Vec::new();\n        for n in \u0026mm.nodes {\n            if n.references.contains(\u0026id) {\n                inbound.push(n.id);\n            }\n        }\n        if !inbound.is_empty() {\n            out.push_str(\u0026format!(\"\\nReferred to by: {:?}\", inbound));\n        }\n        out\n    } else {\n        format!(\"Node {} not found\", id)\n    }\n}\n\npub fn cmd_list(mm: \u0026Mindmap, type_filter: Option\u003c\u0026str\u003e, grep: Option\u003c\u0026str\u003e) -\u003e Vec\u003cString\u003e {\n    let mut res = Vec::new();\n    for n in \u0026mm.nodes {\n        if let Some(tf) = type_filter\n            \u0026\u0026 !n.raw_title.starts_with(\u0026format!(\"{}:\", tf))\n        {\n            continue;\n        }\n        if let Some(q) = grep {\n            let qlc = q.to_lowercase();\n            if !n.raw_title.to_lowercase().contains(\u0026qlc)\n                \u0026\u0026 !n.description.to_lowercase().contains(\u0026qlc)\n            {\n                continue;\n            }\n        }\n        res.push(format!(\n            \"[{}] **{}** - {}\",\n            n.id, n.raw_title, n.description\n        ));\n    }\n    res\n}\n\npub fn cmd_refs(mm: \u0026Mindmap, id: u32) -\u003e Vec\u003cString\u003e {\n    let mut out = Vec::new();\n    for n in \u0026mm.nodes {\n        if n.references.contains(\u0026id) {\n            out.push(format!(\n                \"[{}] **{}** - {}\",\n                n.id, n.raw_title, n.description\n            ));\n        }\n    }\n    out\n}\n\npub fn cmd_links(mm: \u0026Mindmap, id: u32) -\u003e Option\u003cVec\u003cu32\u003e\u003e {\n    mm.get_node(id).map(|n| n.references.clone())\n}\n\npub fn cmd_search(mm: \u0026Mindmap, query: \u0026str) -\u003e Vec\u003cString\u003e {\n    let qlc = query.to_lowercase();\n    let mut out = Vec::new();\n    for n in \u0026mm.nodes {\n        if n.raw_title.to_lowercase().contains(\u0026qlc) || n.description.to_lowercase().contains(\u0026qlc)\n        {\n            out.push(format!(\n                \"[{}] **{}** - {}\",\n                n.id, n.raw_title, n.description\n            ));\n        }\n    }\n    out\n}\n\npub fn cmd_add(mm: \u0026mut Mindmap, type_prefix: \u0026str, title: \u0026str, desc: \u0026str) -\u003e Result\u003cu32\u003e {\n    let id = mm.next_id();\n    let full_title = format!(\"{}: {}\", type_prefix, title);\n    let line = format!(\"[{}] **{}** - {}\", id, full_title, desc);\n\n    mm.lines.push(line.clone());\n\n    let line_index = mm.lines.len() - 1;\n    let references = extract_refs_from_str(desc, Some(id));\n\n    let node = Node {\n        id,\n        raw_title: full_title,\n        description: desc.to_string(),\n        references,\n        line_index,\n    };\n    mm.by_id.insert(id, mm.nodes.len());\n    mm.nodes.push(node);\n\n    Ok(id)\n}\n\npub fn cmd_add_editor(mm: \u0026mut Mindmap, editor: \u0026str, strict: bool) -\u003e Result\u003cu32\u003e {\n    // require interactive terminal for editor\n    if !atty::is(atty::Stream::Stdin) {\n        return Err(anyhow::anyhow!(\n            \"add via editor requires an interactive terminal\"\n        ));\n    }\n\n    let id = mm.next_id();\n    let template = format!(\"[{}] **TYPE: Title** - description\", id);\n\n    // create temp file and write template\n    let mut tmp = tempfile::NamedTempFile::new()\n        .with_context(|| \"Failed to create temp file for add editor\")?;\n    use std::io::Write;\n    writeln!(tmp, \"{}\", template)?;\n    tmp.flush()?;\n\n    // launch editor\n    let status = std::process::Command::new(editor)\n        .arg(tmp.path())\n        .status()\n        .with_context(|| \"Failed to launch editor\")?;\n    if !status.success() {\n        return Err(anyhow::anyhow!(\"Editor exited with non-zero status\"));\n    }\n\n    // read edited content and pick first non-empty line\n    let edited = std::fs::read_to_string(tmp.path())?;\n    let nonempty: Vec\u003c\u0026str\u003e = edited\n        .lines()\n        .map(|l| l.trim())\n        .filter(|l| !l.is_empty())\n        .collect();\n    if nonempty.is_empty() {\n        return Err(anyhow::anyhow!(\"No content written in editor\"));\n    }\n    if nonempty.len() \u003e 1 {\n        return Err(anyhow::anyhow!(\n            \"Expected exactly one node line in editor; found multiple lines\"\n        ));\n    }\n    let line = nonempty[0];\n\n    // parse and validate\n    let parsed = parse_node_line(line, mm.lines.len())?;\n    if parsed.id != id {\n        return Err(anyhow::anyhow!(format!(\n            \"Added line id changed; expected [{}]\",\n            id\n        )));\n    }\n\n    if strict {\n        for rid in \u0026parsed.references {\n            if !mm.by_id.contains_key(rid) {\n                return Err(anyhow::anyhow!(format!(\n                    \"ADD strict: reference to missing node {}\",\n                    rid\n                )));\n            }\n        }\n    }\n\n    // apply: append line and node\n    mm.lines.push(line.to_string());\n    let line_index = mm.lines.len() - 1;\n    let node = Node {\n        id: parsed.id,\n        raw_title: parsed.raw_title,\n        description: parsed.description,\n        references: parsed.references,\n        line_index,\n    };\n    mm.by_id.insert(id, mm.nodes.len());\n    mm.nodes.push(node);\n\n    Ok(id)\n}\n\npub fn cmd_deprecate(mm: \u0026mut Mindmap, id: u32, to: u32) -\u003e Result\u003c()\u003e {\n    let idx = *mm\n        .by_id\n        .get(\u0026id)\n        .ok_or_else(|| anyhow::anyhow!(format!(\"Node {} not found\", id)))?;\n\n    if !mm.by_id.contains_key(\u0026to) {\n        eprintln!(\n            \"Warning: target node {} does not exist (still updating title)\",\n            to\n        );\n    }\n\n    let node = \u0026mut mm.nodes[idx];\n    if !node.raw_title.starts_with(\"[DEPRECATED\") {\n        node.raw_title = format!(\"[DEPRECATED → {}] {}\", to, node.raw_title);\n        mm.lines[node.line_index] = format!(\n            \"[{}] **{}** - {}\",\n            node.id, node.raw_title, node.description\n        );\n    }\n\n    Ok(())\n}\n\npub fn cmd_verify(mm: \u0026mut Mindmap, id: u32) -\u003e Result\u003c()\u003e {\n    let idx = *mm\n        .by_id\n        .get(\u0026id)\n        .ok_or_else(|| anyhow::anyhow!(format!(\"Node {} not found\", id)))?;\n    let node = \u0026mut mm.nodes[idx];\n\n    let tag = format!(\"(verify {})\", chrono::Local::now().format(\"%Y-%m-%d\"));\n    if !node.description.contains(\"(verify \") {\n        if node.description.is_empty() {\n            node.description = tag.clone();\n        } else {\n            node.description = format!(\"{} {}\", node.description, tag);\n        }\n        mm.lines[node.line_index] = format!(\n            \"[{}] **{}** - {}\",\n            node.id, node.raw_title, node.description\n        );\n    }\n    Ok(())\n}\n\npub fn cmd_edit(mm: \u0026mut Mindmap, id: u32, editor: \u0026str) -\u003e Result\u003c()\u003e {\n    let idx = *mm\n        .by_id\n        .get(\u0026id)\n        .ok_or_else(|| anyhow::anyhow!(format!(\"Node {} not found\", id)))?;\n    let node = \u0026mm.nodes[idx];\n\n    // create temp file with the single node line\n    let mut tmp =\n        tempfile::NamedTempFile::new().with_context(|| \"Failed to create temp file for editing\")?;\n    use std::io::Write;\n    writeln!(\n        tmp,\n        \"[{}] **{}** - {}\",\n        node.id, node.raw_title, node.description\n    )?;\n    tmp.flush()?;\n\n    // launch editor\n    let status = std::process::Command::new(editor)\n        .arg(tmp.path())\n        .status()\n        .with_context(|| \"Failed to launch editor\")?;\n    if !status.success() {\n        return Err(anyhow::anyhow!(\"Editor exited with non-zero status\"));\n    }\n\n    // read edited content\n    let edited = std::fs::read_to_string(tmp.path())?;\n    let edited_line = edited.lines().next().unwrap_or(\"\").trim();\n\n    // parse and validate using manual parser\n    let parsed = parse_node_line(edited_line, node.line_index)?;\n    if parsed.id != id {\n        return Err(anyhow::anyhow!(\"Cannot change node ID\"));\n    }\n\n    // all good: replace line in mm.lines and update node fields\n    mm.lines[node.line_index] = edited_line.to_string();\n    let new_title = parsed.raw_title;\n    let new_desc = parsed.description;\n    let new_refs = parsed.references;\n\n    // update node in-place\n    let node_mut = \u0026mut mm.nodes[idx];\n    node_mut.raw_title = new_title;\n    node_mut.description = new_desc;\n    node_mut.references = new_refs;\n\n    Ok(())\n}\n\npub fn cmd_put(mm: \u0026mut Mindmap, id: u32, line: \u0026str, strict: bool) -\u003e Result\u003c()\u003e {\n    // full-line replace: parse provided line and enforce same id\n    let idx = *mm\n        .by_id\n        .get(\u0026id)\n        .ok_or_else(|| anyhow::anyhow!(format!(\"Node {} not found\", id)))?;\n\n    let parsed = parse_node_line(line, mm.nodes[idx].line_index)?;\n    if parsed.id != id {\n        return Err(anyhow::anyhow!(\"PUT line id does not match target id\"));\n    }\n\n    // strict check for references\n    if strict {\n        for rid in \u0026parsed.references {\n            if !mm.by_id.contains_key(rid) {\n                return Err(anyhow::anyhow!(format!(\n                    \"PUT strict: reference to missing node {}\",\n                    rid\n                )));\n            }\n        }\n    }\n\n    // apply\n    mm.lines[mm.nodes[idx].line_index] = line.to_string();\n    let node_mut = \u0026mut mm.nodes[idx];\n    node_mut.raw_title = parsed.raw_title;\n    node_mut.description = parsed.description;\n    node_mut.references = parsed.references;\n\n    Ok(())\n}\n\npub fn cmd_patch(\n    mm: \u0026mut Mindmap,\n    id: u32,\n    typ: Option\u003c\u0026str\u003e,\n    title: Option\u003c\u0026str\u003e,\n    desc: Option\u003c\u0026str\u003e,\n    strict: bool,\n) -\u003e Result\u003c()\u003e {\n    let idx = *mm\n        .by_id\n        .get(\u0026id)\n        .ok_or_else(|| anyhow::anyhow!(format!(\"Node {} not found\", id)))?;\n    let node = \u0026mm.nodes[idx];\n\n    // split existing raw_title into optional type and title\n    let mut existing_type: Option\u003c\u0026str\u003e = None;\n    let mut existing_title = node.raw_title.as_str();\n    if let Some(pos) = node.raw_title.find(':') {\n        existing_type = Some(node.raw_title[..pos].trim());\n        existing_title = node.raw_title[pos + 1..].trim();\n    }\n\n    let new_type = typ.unwrap_or(existing_type.unwrap_or(\"\"));\n    let new_title = title.unwrap_or(existing_title);\n    let new_desc = desc.unwrap_or(\u0026node.description);\n\n    // build raw title: if type is empty, omit prefix\n    let new_raw_title = if new_type.is_empty() {\n        new_title.to_string()\n    } else {\n        format!(\"{}: {}\", new_type, new_title)\n    };\n\n    let new_line = format!(\"[{}] **{}** - {}\", id, new_raw_title, new_desc);\n\n    // validate\n    let parsed = parse_node_line(\u0026new_line, node.line_index)?;\n    if parsed.id != id {\n        return Err(anyhow::anyhow!(\"Patch resulted in different id\"));\n    }\n\n    if strict {\n        for rid in \u0026parsed.references {\n            if !mm.by_id.contains_key(rid) {\n                return Err(anyhow::anyhow!(format!(\n                    \"PATCH strict: reference to missing node {}\",\n                    rid\n                )));\n            }\n        }\n    }\n\n    // apply\n    mm.lines[node.line_index] = new_line;\n    let node_mut = \u0026mut mm.nodes[idx];\n    node_mut.raw_title = parsed.raw_title;\n    node_mut.description = parsed.description;\n    node_mut.references = parsed.references;\n\n    Ok(())\n}\n\npub fn cmd_delete(mm: \u0026mut Mindmap, id: u32, force: bool) -\u003e Result\u003c()\u003e {\n    // find node index\n    let idx = *mm\n        .by_id\n        .get(\u0026id)\n        .ok_or_else(|| anyhow::anyhow!(format!(\"Node {} not found\", id)))?;\n\n    // check incoming references\n    let mut incoming_from = Vec::new();\n    for n in \u0026mm.nodes {\n        if n.references.contains(\u0026id) {\n            incoming_from.push(n.id);\n        }\n    }\n    if !incoming_from.is_empty() \u0026\u0026 !force {\n        return Err(anyhow::anyhow!(format!(\n            \"Node {} is referenced by {:?}; use --force to delete\",\n            id, incoming_from\n        )));\n    }\n\n    // remove the line from lines\n    let line_idx = mm.nodes[idx].line_index;\n    mm.lines.remove(line_idx);\n\n    // remove node from nodes vector\n    mm.nodes.remove(idx);\n\n    // rebuild by_id and fix line_index for nodes after removed line\n    mm.by_id.clear();\n    for (i, node) in mm.nodes.iter_mut().enumerate() {\n        // if node was after removed line, decrement its line_index\n        if node.line_index \u003e line_idx {\n            node.line_index -= 1;\n        }\n        mm.by_id.insert(node.id, i);\n    }\n\n    Ok(())\n}\n\npub fn cmd_lint(mm: \u0026Mindmap) -\u003e Result\u003cVec\u003cString\u003e\u003e {\n    let mut warnings = Vec::new();\n\n    // 1) Syntax: lines starting with '[' but not matching node format\n    for (i, line) in mm.lines.iter().enumerate() {\n        let trimmed = line.trim_start();\n        if trimmed.starts_with('[') \u0026\u0026 parse_node_line(trimmed, i).is_err() {\n            warnings.push(format!(\n                \"Syntax: line {} starts with '[' but does not match node format\",\n                i + 1\n            ));\n        }\n    }\n\n    // 2) Duplicate IDs: scan lines for node ids\n    let mut id_map: HashMap\u003cu32, Vec\u003cusize\u003e\u003e = HashMap::new();\n    for (i, line) in mm.lines.iter().enumerate() {\n        if let Ok(node) = parse_node_line(line, i) {\n            id_map.entry(node.id).or_default().push(i + 1);\n        }\n    }\n    for (id, locations) in \u0026id_map {\n        if locations.len() \u003e 1 {\n            warnings.push(format!(\n                \"Duplicate ID: node {} appears on lines {:?}\",\n                id, locations\n            ));\n        }\n    }\n\n    // 3) Missing references\n    for n in \u0026mm.nodes {\n        for rid in \u0026n.references {\n            if !mm.by_id.contains_key(rid) {\n                warnings.push(format!(\n                    \"Missing ref: node {} references missing node {}\",\n                    n.id, rid\n                ));\n            }\n        }\n    }\n\n    if warnings.is_empty() {\n        Ok(vec![\"Lint OK\".to_string()])\n    } else {\n        Ok(warnings)\n    }\n}\n\npub fn cmd_orphans(mm: \u0026Mindmap) -\u003e Result\u003cVec\u003cString\u003e\u003e {\n    let mut warnings = Vec::new();\n\n    // Orphans: nodes with no in and no out, excluding META:*\n    let mut incoming: HashMap\u003cu32, usize\u003e = HashMap::new();\n    for n in \u0026mm.nodes {\n        incoming.entry(n.id).or_insert(0);\n    }\n    for n in \u0026mm.nodes {\n        for rid in \u0026n.references {\n            if incoming.contains_key(rid) {\n                *incoming.entry(*rid).or_insert(0) += 1;\n            }\n        }\n    }\n    for n in \u0026mm.nodes {\n        let inc = incoming.get(\u0026n.id).copied().unwrap_or(0);\n        let out = n.references.len();\n        let title_up = n.raw_title.to_uppercase();\n        if inc == 0 \u0026\u0026 out == 0 \u0026\u0026 !title_up.starts_with(\"META\") {\n            warnings.push(format!(\"{}\", n.id));\n        }\n    }\n\n    if warnings.is_empty() {\n        Ok(vec![\"No orphans\".to_string()])\n    } else {\n        Ok(warnings)\n    }\n}\n\npub fn cmd_graph(mm: \u0026Mindmap, id: u32) -\u003e Result\u003cString\u003e {\n    if !mm.by_id.contains_key(\u0026id) {\n        return Err(anyhow::anyhow!(format!(\"Node {} not found\", id)));\n    }\n\n    // Collect 1-hop neighborhood: self, direct references (out), and nodes that reference self (in)\n    let mut nodes = std::collections::HashSet::new();\n    nodes.insert(id);\n\n    // Outgoing: references from self\n    if let Some(node) = mm.get_node(id) {\n        for \u0026rid in \u0026node.references {\n            nodes.insert(rid);\n        }\n    }\n\n    // Incoming: nodes that reference self\n    for n in \u0026mm.nodes {\n        if n.references.contains(\u0026id) {\n            nodes.insert(n.id);\n        }\n    }\n\n    // Generate DOT\n    let mut dot = String::new();\n    dot.push_str(\"digraph {\\n\");\n    dot.push_str(\"  rankdir=LR;\\n\");\n\n    // Add nodes\n    for \u0026nid in \u0026nodes {\n        if let Some(node) = mm.get_node(nid) {\n            let label = format!(\"{}: {}\", node.id, node.raw_title.replace(\"\\\"\", \"\\\\\\\"\"));\n            dot.push_str(\u0026format!(\"  {} [label=\\\"{}\\\"];\\n\", nid, label));\n        }\n    }\n\n    // Add edges: from each node to its references, if both in neighborhood\n    for \u0026nid in \u0026nodes {\n        if let Some(node) = mm.get_node(nid) {\n            for \u0026rid in \u0026node.references {\n                if nodes.contains(\u0026rid) {\n                    dot.push_str(\u0026format!(\"  {} -\u003e {};\\n\", nid, rid));\n                }\n            }\n        }\n    }\n\n    dot.push_str(\"}\\n\");\n    Ok(dot)\n}\n\npub fn run(cli: Cli) -\u003e Result\u003c()\u003e {\n    let path = cli.file.unwrap_or_else(|| PathBuf::from(\"MINDMAP.md\"));\n\n    // If user passed '-' use stdin as source\n    let mut mm = if path.as_os_str() == \"-\" {\n        Mindmap::load_from_reader(std::io::stdin(), path.clone())?\n    } else {\n        Mindmap::load(path.clone())?\n    };\n\n    // determine whether to use pretty output (interactive + default format)\n    let interactive = atty::is(atty::Stream::Stdout);\n    let env_override = std::env::var(\"MINDMAP_PRETTY\").ok();\n    let pretty_enabled = match env_override.as_deref() {\n        Some(\"0\") =\u003e false,\n        Some(\"1\") =\u003e true,\n        _ =\u003e interactive,\n    } \u0026\u0026 matches!(cli.output, OutputFormat::Default);\n\n    let printer: Option\u003cBox\u003cdyn ui::Printer\u003e\u003e = if matches!(cli.output, OutputFormat::Default) {\n        if pretty_enabled {\n            Some(Box::new(crate::ui::PrettyPrinter::new()?))\n        } else {\n            Some(Box::new(crate::ui::PlainPrinter::new()?))\n        }\n    } else {\n        None\n    };\n\n    // helper to reject mutating commands when mm.path == '-'\n    let cannot_write_err = |cmd_name: \u0026str| -\u003e anyhow::Error {\n        anyhow::anyhow!(format!(\n            \"Cannot {}: mindmap was loaded from stdin ('-'); use --file \u003cpath\u003e to save changes\",\n            cmd_name\n        ))\n    };\n\n    match cli.command {\n        Commands::Show { id } =\u003e match mm.get_node(id) {\n            Some(node) =\u003e {\n                if matches!(cli.output, OutputFormat::Json) {\n                    let obj = serde_json::json!({\n                        \"command\": \"show\",\n                        \"node\": {\n                            \"id\": node.id,\n                            \"raw_title\": node.raw_title,\n                            \"description\": node.description,\n                            \"references\": node.references,\n                            \"line_index\": node.line_index,\n                        }\n                    });\n                    println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n                } else {\n                    // compute inbound refs\n                    let mut inbound = Vec::new();\n                    for n in \u0026mm.nodes {\n                        if n.references.contains(\u0026id) {\n                            inbound.push(n.id);\n                        }\n                    }\n\n                    if let Some(p) = \u0026printer {\n                        p.show(node, \u0026inbound, \u0026node.references)?;\n                    } else {\n                        println!(\n                            \"[{}] **{}** - {}\",\n                            node.id, node.raw_title, node.description\n                        );\n                        if !inbound.is_empty() {\n                            eprintln!(\"Referred to by: {:?}\", inbound);\n                        }\n                    }\n                }\n            }\n            None =\u003e return Err(anyhow::anyhow!(format!(\"Node {} not found\", id))),\n        },\n        Commands::List { r#type, grep } =\u003e {\n            let items = cmd_list(\u0026mm, r#type.as_deref(), grep.as_deref());\n            if matches!(cli.output, OutputFormat::Json) {\n                let arr: Vec\u003c_\u003e = items\n                    .into_iter()\n                    .map(|line| serde_json::json!({\"line\": line}))\n                    .collect();\n                let obj = serde_json::json!({\"command\": \"list\", \"items\": arr});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            } else if let Some(p) = \u0026printer {\n                p.list(\u0026items)?;\n            } else {\n                for it in items {\n                    println!(\"{}\", it);\n                }\n            }\n        }\n        Commands::Refs { id } =\u003e {\n            let items = cmd_refs(\u0026mm, id);\n            if matches!(cli.output, OutputFormat::Json) {\n                let obj = serde_json::json!({\"command\": \"refs\", \"items\": items});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            } else if let Some(p) = \u0026printer {\n                p.refs(\u0026items)?;\n            } else {\n                for it in items {\n                    println!(\"{}\", it);\n                }\n            }\n        }\n        Commands::Links { id } =\u003e match cmd_links(\u0026mm, id) {\n            Some(v) =\u003e {\n                if matches!(cli.output, OutputFormat::Json) {\n                    let obj = serde_json::json!({\"command\": \"links\", \"id\": id, \"links\": v});\n                    println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n                } else if let Some(p) = \u0026printer {\n                    p.links(id, \u0026v)?;\n                } else {\n                    println!(\"Node [{}] references: {:?}\", id, v);\n                }\n            }\n            None =\u003e return Err(anyhow::anyhow!(format!(\"Node [{}] not found\", id))),\n        },\n        Commands::Search { query } =\u003e {\n            let items = cmd_search(\u0026mm, \u0026query);\n            if matches!(cli.output, OutputFormat::Json) {\n                let obj = serde_json::json!({\"command\": \"search\", \"query\": query, \"items\": items});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            } else if let Some(p) = \u0026printer {\n                p.search(\u0026items)?;\n            } else {\n                for it in items {\n                    println!(\"{}\", it);\n                }\n            }\n        }\n        Commands::Add {\n            r#type,\n            title,\n            desc,\n            strict,\n        } =\u003e {\n            if mm.path.as_os_str() == \"-\" {\n                return Err(cannot_write_err(\"add\"));\n            }\n            match (r#type.as_deref(), title.as_deref(), desc.as_deref()) {\n                (Some(tp), Some(tt), Some(dd)) =\u003e {\n                    let id = cmd_add(\u0026mut mm, tp, tt, dd)?;\n                    mm.save()?;\n                    if matches!(cli.output, OutputFormat::Json)\n                        \u0026\u0026 let Some(node) = mm.get_node(id)\n                    {\n                        let obj = serde_json::json!({\"command\": \"add\", \"node\": {\"id\": node.id, \"raw_title\": node.raw_title, \"description\": node.description, \"references\": node.references}});\n                        println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n                    }\n                    eprintln!(\"Added node [{}]\", id);\n                }\n                (None, None, None) =\u003e {\n                    // editor flow\n                    if !atty::is(atty::Stream::Stdin) {\n                        return Err(anyhow::anyhow!(\n                            \"add via editor requires an interactive terminal\"\n                        ));\n                    }\n                    let editor = std::env::var(\"EDITOR\").unwrap_or_else(|_| \"vi\".to_string());\n                    let id = cmd_add_editor(\u0026mut mm, \u0026editor, strict)?;\n                    mm.save()?;\n                    if matches!(cli.output, OutputFormat::Json)\n                        \u0026\u0026 let Some(node) = mm.get_node(id)\n                    {\n                        let obj = serde_json::json!({\"command\": \"add\", \"node\": {\"id\": node.id, \"raw_title\": node.raw_title, \"description\": node.description, \"references\": node.references}});\n                        println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n                    }\n                    eprintln!(\"Added node [{}]\", id);\n                }\n                _ =\u003e {\n                    return Err(anyhow::anyhow!(\n                        \"add requires either all of --type,--title,--desc or none (editor)\"\n                    ));\n                }\n            }\n        }\n        Commands::Deprecate { id, to } =\u003e {\n            if mm.path.as_os_str() == \"-\" {\n                return Err(cannot_write_err(\"deprecate\"));\n            }\n            cmd_deprecate(\u0026mut mm, id, to)?;\n            mm.save()?;\n            if matches!(cli.output, OutputFormat::Json)\n                \u0026\u0026 let Some(node) = mm.get_node(id)\n            {\n                let obj = serde_json::json!({\"command\": \"deprecate\", \"node\": {\"id\": node.id, \"raw_title\": node.raw_title}});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            }\n            eprintln!(\"Deprecated node [{}] → [{}]\", id, to);\n        }\n        Commands::Edit { id } =\u003e {\n            if mm.path.as_os_str() == \"-\" {\n                return Err(cannot_write_err(\"edit\"));\n            }\n            let editor = std::env::var(\"EDITOR\").unwrap_or_else(|_| \"vi\".to_string());\n            cmd_edit(\u0026mut mm, id, \u0026editor)?;\n            mm.save()?;\n            if matches!(cli.output, OutputFormat::Json)\n                \u0026\u0026 let Some(node) = mm.get_node(id)\n            {\n                let obj = serde_json::json!({\"command\": \"edit\", \"node\": {\"id\": node.id, \"raw_title\": node.raw_title, \"description\": node.description, \"references\": node.references}});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            }\n            eprintln!(\"Edited node [{}]\", id);\n        }\n        Commands::Patch {\n            id,\n            r#type,\n            title,\n            desc,\n            strict,\n        } =\u003e {\n            if mm.path.as_os_str() == \"-\" {\n                return Err(cannot_write_err(\"patch\"));\n            }\n            cmd_patch(\n                \u0026mut mm,\n                id,\n                r#type.as_deref(),\n                title.as_deref(),\n                desc.as_deref(),\n                strict,\n            )?;\n            mm.save()?;\n            if matches!(cli.output, OutputFormat::Json)\n                \u0026\u0026 let Some(node) = mm.get_node(id)\n            {\n                let obj = serde_json::json!({\"command\": \"patch\", \"node\": {\"id\": node.id, \"raw_title\": node.raw_title, \"description\": node.description, \"references\": node.references}});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            }\n            eprintln!(\"Patched node [{}]\", id);\n        }\n        Commands::Put { id, line, strict } =\u003e {\n            if mm.path.as_os_str() == \"-\" {\n                return Err(cannot_write_err(\"put\"));\n            }\n            cmd_put(\u0026mut mm, id, \u0026line, strict)?;\n            mm.save()?;\n            if matches!(cli.output, OutputFormat::Json)\n                \u0026\u0026 let Some(node) = mm.get_node(id)\n            {\n                let obj = serde_json::json!({\"command\": \"put\", \"node\": {\"id\": node.id, \"raw_title\": node.raw_title, \"description\": node.description, \"references\": node.references}});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            }\n            eprintln!(\"Put node [{}]\", id);\n        }\n        Commands::Verify { id } =\u003e {\n            if mm.path.as_os_str() == \"-\" {\n                return Err(cannot_write_err(\"verify\"));\n            }\n            cmd_verify(\u0026mut mm, id)?;\n            mm.save()?;\n            if matches!(cli.output, OutputFormat::Json)\n                \u0026\u0026 let Some(node) = mm.get_node(id)\n            {\n                let obj = serde_json::json!({\"command\": \"verify\", \"node\": {\"id\": node.id, \"description\": node.description}});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            }\n            eprintln!(\"Marked node [{}] for verification\", id);\n        }\n        Commands::Delete { id, force } =\u003e {\n            if mm.path.as_os_str() == \"-\" {\n                return Err(cannot_write_err(\"delete\"));\n            }\n            cmd_delete(\u0026mut mm, id, force)?;\n            mm.save()?;\n            if matches!(cli.output, OutputFormat::Json) {\n                let obj = serde_json::json!({\"command\": \"delete\", \"deleted\": id});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            }\n            eprintln!(\"Deleted node [{}]\", id);\n        }\n        Commands::Lint =\u003e {\n            let res = cmd_lint(\u0026mm)?;\n            if matches!(cli.output, OutputFormat::Json) {\n                let obj = serde_json::json!({\"command\": \"lint\", \"warnings\": res});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            } else {\n                for r in res {\n                    eprintln!(\"{}\", r);\n                }\n            }\n        }\n        Commands::Orphans =\u003e {\n            let res = cmd_orphans(\u0026mm)?;\n            if matches!(cli.output, OutputFormat::Json) {\n                let obj = serde_json::json!({\"command\": \"orphans\", \"orphans\": res});\n                println!(\"{}\", serde_json::to_string_pretty(\u0026obj)?);\n            } else if let Some(p) = \u0026printer {\n                p.orphans(\u0026res)?;\n            } else {\n                for r in res {\n                    eprintln!(\"{}\", r);\n                }\n            }\n        }\n        Commands::Graph { id } =\u003e {\n            let dot = cmd_graph(\u0026mm, id)?;\n            println!(\"{}\", dot);\n        }\n    }\n\n    Ok(())\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use assert_fs::prelude::*;\n\n    #[test]\n    fn test_parse_nodes() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\n            \"Header line\\n[1] **AE: A** - refers to [2]\\nSome note\\n[2] **AE: B** - base\\n\",\n        )?;\n\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        assert_eq!(mm.nodes.len(), 2);\n        assert!(mm.by_id.contains_key(\u00261));\n        assert!(mm.by_id.contains_key(\u00262));\n        let n1 = mm.get_node(1).unwrap();\n        assert_eq!(n1.references, vec![2]);\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_save_atomic() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: A** - base\\n\")?;\n\n        let mut mm = Mindmap::load(file.path().to_path_buf())?;\n        // append a node line\n        let id = mm.next_id();\n        mm.lines.push(format!(\"[{}] **AE: C** - new\\n\", id));\n        // reflect node\n        let node = Node {\n            id,\n            raw_title: \"AE: C\".to_string(),\n            description: \"new\".to_string(),\n            references: vec![],\n            line_index: mm.lines.len() - 1,\n        };\n        mm.by_id.insert(id, mm.nodes.len());\n        mm.nodes.push(node);\n\n        mm.save()?;\n\n        let content = std::fs::read_to_string(file.path())?;\n        assert!(content.contains(\"AE: C\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_lint_syntax_and_duplicates_and_orphan() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[bad] not a node\\n[1] **AE: A** - base\\n[1] **AE: Adup** - dup\\n[2] **AE: Orphan** - lonely\\n\")?;\n\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let warnings = cmd_lint(\u0026mm)?;\n        // Expect at least syntax and duplicate warnings from lint\n        let joined = warnings.join(\"\\n\");\n        assert!(joined.contains(\"Syntax\"));\n        assert!(joined.contains(\"Duplicate ID\"));\n\n        // Orphan detection is now a separate command; verify orphans via cmd_orphans()\n        let orphans = cmd_orphans(\u0026mm)?;\n        let joined_o = orphans.join(\"\\n\");\n        // expect node id 2 to be reported as orphan\n        assert!(joined_o.contains(\"2\"));\n\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_put_and_patch_basic() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n[2] **AE: Two** - second\\n\")?;\n\n        let mut mm = Mindmap::load(file.path().to_path_buf())?;\n        // patch title only for node 1\n        cmd_patch(\u0026mut mm, 1, Some(\"AE\"), Some(\"OneNew\"), None, false)?;\n        assert_eq!(mm.get_node(1).unwrap().raw_title, \"AE: OneNew\");\n\n        // put full line for node 2\n        let new_line = \"[2] **DR: Replaced** - replaced desc [1]\";\n        cmd_put(\u0026mut mm, 2, new_line, false)?;\n        assert_eq!(mm.get_node(2).unwrap().raw_title, \"DR: Replaced\");\n        assert_eq!(mm.get_node(2).unwrap().references, vec![1]);\n\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_show() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n[2] **AE: Two** - refers [1]\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let out = cmd_show(\u0026mm, 1);\n        assert!(out.contains(\"[1] **AE: One**\"));\n        assert!(out.contains(\"Referred to by: [2]\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_refs() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n[2] **AE: Two** - refers [1]\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let refs = cmd_refs(\u0026mm, 1);\n        assert_eq!(refs.len(), 1);\n        assert!(refs[0].contains(\"[2] **AE: Two**\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_links() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n[2] **AE: Two** - refers [1]\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let links = cmd_links(\u0026mm, 2);\n        assert_eq!(links, Some(vec![1]));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_search() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n[2] **AE: Two** - second\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let results = cmd_search(\u0026mm, \"first\");\n        assert_eq!(results.len(), 1);\n        assert!(results[0].contains(\"[1] **AE: One**\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_add() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mut mm = Mindmap::load(file.path().to_path_buf())?;\n        let id = cmd_add(\u0026mut mm, \"AE\", \"Two\", \"second\")?;\n        assert_eq!(id, 2);\n        assert_eq!(mm.nodes.len(), 2);\n        let node = mm.get_node(2).unwrap();\n        assert_eq!(node.raw_title, \"AE: Two\");\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_deprecate() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n[2] **AE: Two** - second\\n\")?;\n        let mut mm = Mindmap::load(file.path().to_path_buf())?;\n        cmd_deprecate(\u0026mut mm, 1, 2)?;\n        let node = mm.get_node(1).unwrap();\n        assert!(node.raw_title.starts_with(\"[DEPRECATED → 2]\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_verify() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mut mm = Mindmap::load(file.path().to_path_buf())?;\n        cmd_verify(\u0026mut mm, 1)?;\n        let node = mm.get_node(1).unwrap();\n        assert!(node.description.contains(\"(verify\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_show_non_existing() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let out = cmd_show(\u0026mm, 99);\n        assert_eq!(out, \"Node 99 not found\");\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_refs_non_existing() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let refs = cmd_refs(\u0026mm, 99);\n        assert_eq!(refs.len(), 0);\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_links_non_existing() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let links = cmd_links(\u0026mm, 99);\n        assert_eq!(links, None);\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_put_non_existing() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mut mm = Mindmap::load(file.path().to_path_buf())?;\n        let err = cmd_put(\u0026mut mm, 99, \"[99] **AE: New** - new\", false).unwrap_err();\n        assert!(format!(\"{}\", err).contains(\"Node 99 not found\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_patch_non_existing() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mut mm = Mindmap::load(file.path().to_path_buf())?;\n        let err = cmd_patch(\u0026mut mm, 99, None, Some(\"New\"), None, false).unwrap_err();\n        assert!(format!(\"{}\", err).contains(\"Node 99 not found\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_load_from_reader() -\u003e Result\u003c()\u003e {\n        use std::io::Cursor;\n        let content = \"[1] **AE: One** - first\\n\";\n        let reader = Cursor::new(content);\n        let path = PathBuf::from(\"-\");\n        let mm = Mindmap::load_from_reader(reader, path)?;\n        assert_eq!(mm.nodes.len(), 1);\n        assert_eq!(mm.nodes[0].id, 1);\n        Ok(())\n    }\n\n    #[test]\n    fn test_next_id() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n[3] **AE: Three** - third\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        assert_eq!(mm.next_id(), 4);\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_get_node() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let node = mm.get_node(1).unwrap();\n        assert_eq!(node.id, 1);\n        assert!(mm.get_node(99).is_none());\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_orphans() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n[2] **AE: Orphan** - lonely\\n\")?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let orphans = cmd_orphans(\u0026mm)?;\n        assert_eq!(orphans, vec![\"1\".to_string(), \"2\".to_string()]);\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_cmd_graph() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\n            \"[1] **AE: One** - first\\n[2] **AE: Two** - refers [1]\\n[3] **AE: Three** - also [1]\\n\",\n        )?;\n        let mm = Mindmap::load(file.path().to_path_buf())?;\n        let dot = cmd_graph(\u0026mm, 1)?;\n        assert!(dot.contains(\"digraph {\"));\n        assert!(dot.contains(\"1 [label=\\\"1: AE: One\\\"]\"));\n        assert!(dot.contains(\"2 [label=\\\"2: AE: Two\\\"]\"));\n        assert!(dot.contains(\"3 [label=\\\"3: AE: Three\\\"]\"));\n        assert!(dot.contains(\"2 -\u003e 1;\"));\n        assert!(dot.contains(\"3 -\u003e 1;\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_save_stdin_path() -\u003e Result\u003c()\u003e {\n        let temp = assert_fs::TempDir::new()?;\n        let file = temp.child(\"MINDMAP.md\");\n        file.write_str(\"[1] **AE: One** - first\\n\")?;\n        let mm = Mindmap::load_from_reader(\n            std::io::Cursor::new(\"[1] **AE: One** - first\\n\"),\n            PathBuf::from(\"-\"),\n        )?;\n        let err = mm.save().unwrap_err();\n        assert!(format!(\"{}\", err).contains(\"Cannot save\"));\n        temp.close()?;\n        Ok(())\n    }\n\n    #[test]\n    fn test_extract_refs_from_str() {\n        assert_eq!(extract_refs_from_str(\"no refs\", None), vec![] as Vec\u003cu32\u003e);\n        assert_eq!(extract_refs_from_str(\"[1] and [2]\", None), vec![1, 2]);\n        assert_eq!(\n            extract_refs_from_str(\"[1] and [1]\", Some(1)),\n            vec![] as Vec\u003cu32\u003e\n        ); // skip self\n        assert_eq!(\n            extract_refs_from_str(\"[abc] invalid [123]\", None),\n            vec![123]\n        );\n    }\n}\n","traces":[{"line":149,"address":[6470953,6470985,6471022],"length":1,"stats":{"Line":1}},{"line":150,"address":[3918368],"length":1,"stats":{"Line":19}},{"line":152,"address":[6470296,6470837,6470804,6470427],"length":1,"stats":{"Line":16}},{"line":153,"address":[5084902,5084864],"length":1,"stats":{"Line":8}},{"line":154,"address":[2592725],"length":1,"stats":{"Line":8}},{"line":159,"address":[3918481],"length":1,"stats":{"Line":11}},{"line":160,"address":[11847236],"length":1,"stats":{"Line":12}},{"line":161,"address":[5127896,5127801,5127865,5127959],"length":1,"stats":{"Line":2}},{"line":162,"address":[6459924,6460018],"length":1,"stats":{"Line":1}},{"line":165,"address":[2590416,2592406,2592340],"length":1,"stats":{"Line":8}},{"line":166,"address":[11847311],"length":1,"stats":{"Line":32}},{"line":168,"address":[2590614],"length":1,"stats":{"Line":8}},{"line":169,"address":[2590677],"length":1,"stats":{"Line":8}},{"line":171,"address":[5117712],"length":1,"stats":{"Line":16}},{"line":172,"address":[6380185,6380335],"length":1,"stats":{"Line":24}},{"line":173,"address":[11840067],"length":1,"stats":{"Line":16}},{"line":174,"address":[2591820],"length":1,"stats":{"Line":1}},{"line":176,"address":[5330241,5330527],"length":1,"stats":{"Line":16}},{"line":177,"address":[11840233,11840160,11840179],"length":1,"stats":{"Line":8}},{"line":181,"address":[5097912],"length":1,"stats":{"Line":6}},{"line":182,"address":[6442635,6443474,6442116,6444140,6443052],"length":1,"stats":{"Line":6}},{"line":183,"address":[6810608],"length":1,"stats":{"Line":6}},{"line":184,"address":[3911359],"length":1,"stats":{"Line":6}},{"line":185,"address":[12341307,12341317,12341488],"length":1,"stats":{"Line":6}},{"line":189,"address":[5332741,5332701,5331376],"length":1,"stats":{"Line":1}},{"line":191,"address":[5331396],"length":1,"stats":{"Line":13}},{"line":192,"address":[6380560],"length":1,"stats":{"Line":11}},{"line":193,"address":[5879695],"length":1,"stats":{"Line":11}},{"line":198,"address":[11840457],"length":1,"stats":{"Line":1}},{"line":199,"address":[14282345,14282226,14282336],"length":1,"stats":{"Line":0}},{"line":201,"address":[14107514],"length":1,"stats":{"Line":14}},{"line":202,"address":[5940824],"length":1,"stats":{"Line":12}},{"line":203,"address":[9583722,9583568,9583716],"length":1,"stats":{"Line":2}},{"line":204,"address":[2767862,2767824],"length":1,"stats":{"Line":1}},{"line":205,"address":[6479129],"length":1,"stats":{"Line":2}},{"line":207,"address":[2594281,2593687,2593616],"length":1,"stats":{"Line":2}},{"line":208,"address":[7821578],"length":1,"stats":{"Line":1}},{"line":209,"address":[2593954,2594111,2594053,2594240],"length":1,"stats":{"Line":2}},{"line":210,"address":[14282368],"length":1,"stats":{"Line":2}},{"line":211,"address":[6479229],"length":1,"stats":{"Line":1}},{"line":214,"address":[12442819],"length":1,"stats":{"Line":1}},{"line":215,"address":[5917819],"length":1,"stats":{"Line":1}},{"line":218,"address":[5098971],"length":1,"stats":{"Line":2}},{"line":219,"address":[5202621],"length":1,"stats":{"Line":6}},{"line":225,"address":[7830781],"length":1,"stats":{"Line":9}},{"line":227,"address":[12890797],"length":1,"stats":{"Line":9}},{"line":228,"address":[5280792],"length":1,"stats":{"Line":20}},{"line":229,"address":[6654162],"length":1,"stats":{"Line":13}},{"line":233,"address":[2541351],"length":1,"stats":{"Line":19}},{"line":234,"address":[6653408],"length":1,"stats":{"Line":8}},{"line":235,"address":[5729602],"length":1,"stats":{"Line":0}},{"line":238,"address":[5281005],"length":1,"stats":{"Line":8}},{"line":239,"address":[5877786],"length":1,"stats":{"Line":9}},{"line":242,"address":[2541754,2541890],"length":1,"stats":{"Line":8}},{"line":243,"address":[5922595,5918910],"length":1,"stats":{"Line":8}},{"line":244,"address":[7197577],"length":1,"stats":{"Line":24}},{"line":245,"address":[6477720,6477990,6477820],"length":1,"stats":{"Line":8}},{"line":247,"address":[2541903],"length":1,"stats":{"Line":0}},{"line":251,"address":[5109714],"length":1,"stats":{"Line":16}},{"line":252,"address":[2521343],"length":1,"stats":{"Line":0}},{"line":254,"address":[2542438,2542183,2542324],"length":1,"stats":{"Line":27}},{"line":257,"address":[12888700],"length":1,"stats":{"Line":8}},{"line":258,"address":[2542388],"length":1,"stats":{"Line":8}},{"line":259,"address":[14282201],"length":1,"stats":{"Line":8}},{"line":260,"address":[2542539],"length":1,"stats":{"Line":0}},{"line":262,"address":[3405543,3409215],"length":1,"stats":{"Line":8}},{"line":263,"address":[3912318,3913029,3912384,3913095,3915319,3914451,3914385,3917221,3917143,3915397],"length":1,"stats":{"Line":46}},{"line":266,"address":[9583322],"length":1,"stats":{"Line":16}},{"line":267,"address":[3405687,3409358],"length":1,"stats":{"Line":0}},{"line":269,"address":[3914578,3913307,3913217,3917356,3915538,3912506,3914665,3917451,3912596,3915633],"length":1,"stats":{"Line":38}},{"line":271,"address":[14279451],"length":1,"stats":{"Line":16}},{"line":274,"address":[7831040],"length":1,"stats":{"Line":16}},{"line":276,"address":[5098277],"length":1,"stats":{"Line":8}},{"line":277,"address":[5203440],"length":1,"stats":{"Line":0}},{"line":278,"address":[5282761],"length":1,"stats":{"Line":8}},{"line":279,"address":[5282809],"length":1,"stats":{"Line":30}},{"line":280,"address":[7434912],"length":1,"stats":{"Line":0}},{"line":281,"address":[7199770],"length":1,"stats":{"Line":0}},{"line":287,"address":[5095001,5094791],"length":1,"stats":{"Line":8}},{"line":288,"address":[2543686],"length":1,"stats":{"Line":8}},{"line":289,"address":[5203632],"length":1,"stats":{"Line":8}},{"line":290,"address":[6429857,6427500,6427447,6432139,6434407,6429804,6427616,6434576,6432086,6429973,6432255,6434460],"length":1,"stats":{"Line":16}},{"line":292,"address":[6430206,6427683,6427733,6432319,6434690,6434640,6430090,6432485,6434806,6432369,6427849,6430040],"length":1,"stats":{"Line":8}},{"line":293,"address":[5283591,5283681],"length":1,"stats":{"Line":13}},{"line":294,"address":[5925477,5921830],"length":1,"stats":{"Line":4}},{"line":295,"address":[5199917],"length":1,"stats":{"Line":13}},{"line":296,"address":[7197248,7197270,7196225,7196588],"length":1,"stats":{"Line":4}},{"line":297,"address":[7811342],"length":1,"stats":{"Line":2}},{"line":298,"address":[7811420],"length":1,"stats":{"Line":7}},{"line":299,"address":[14283784],"length":1,"stats":{"Line":2}},{"line":300,"address":[6472224,6474590,6474596],"length":1,"stats":{"Line":2}},{"line":302,"address":[6428548,6430875,6426323,6433284,6430990,6428665,6433163,6426207],"length":1,"stats":{"Line":2}},{"line":304,"address":[6428593,6433208,6426252,6430920],"length":1,"stats":{"Line":3}},{"line":305,"address":[6426286,6433244,6428627,6430953],"length":1,"stats":{"Line":0}},{"line":307,"address":[5200813],"length":1,"stats":{"Line":11}},{"line":310,"address":[7804540,7805475],"length":1,"stats":{"Line":0}},{"line":313,"address":[5086880],"length":1,"stats":{"Line":8}},{"line":318,"address":[14282791],"length":1,"stats":{"Line":1}},{"line":319,"address":[5728272],"length":1,"stats":{"Line":1}},{"line":320,"address":[5333760],"length":1,"stats":{"Line":1}},{"line":322,"address":[6474250],"length":1,"stats":{"Line":11}},{"line":326,"address":[2526256],"length":1,"stats":{"Line":4}},{"line":327,"address":[7381408],"length":1,"stats":{"Line":2}},{"line":328,"address":[7188435,7189623],"length":1,"stats":{"Line":2}},{"line":329,"address":[5200704],"length":1,"stats":{"Line":1}},{"line":332,"address":[2608899],"length":1,"stats":{"Line":1}},{"line":333,"address":[6654987],"length":1,"stats":{"Line":2}},{"line":335,"address":[5200941],"length":1,"stats":{"Line":1}},{"line":337,"address":[5879864,5879938],"length":1,"stats":{"Line":1}},{"line":341,"address":[7189024],"length":1,"stats":{"Line":0}},{"line":342,"address":[6630256],"length":1,"stats":{"Line":0}},{"line":343,"address":[12890716,12890616],"length":1,"stats":{"Line":3}},{"line":344,"address":[7189301],"length":1,"stats":{"Line":0}},{"line":345,"address":[7190110],"length":1,"stats":{"Line":1}},{"line":347,"address":[6655488],"length":1,"stats":{"Line":1}},{"line":349,"address":[6655610,6655680],"length":1,"stats":{"Line":0}},{"line":350,"address":[5202127,5202227],"length":1,"stats":{"Line":1}},{"line":351,"address":[5721111],"length":1,"stats":{"Line":0}},{"line":352,"address":[5721142],"length":1,"stats":{"Line":0}},{"line":354,"address":[3916859],"length":1,"stats":{"Line":0}},{"line":357,"address":[11845677],"length":1,"stats":{"Line":0}},{"line":358,"address":[6655639],"length":1,"stats":{"Line":0}},{"line":359,"address":[3916902],"length":1,"stats":{"Line":0}},{"line":362,"address":[5103008],"length":1,"stats":{"Line":0}},{"line":365,"address":[3698544],"length":1,"stats":{"Line":1}},{"line":366,"address":[5205832,5205664],"length":1,"stats":{"Line":1}},{"line":367,"address":[7380956],"length":1,"stats":{"Line":5}},{"line":368,"address":[2607665,2607744],"length":1,"stats":{"Line":2}},{"line":369,"address":[5882281],"length":1,"stats":{"Line":1}},{"line":370,"address":[14258105],"length":1,"stats":{"Line":0}},{"line":371,"address":[9583397],"length":1,"stats":{"Line":0}},{"line":375,"address":[11842992],"length":1,"stats":{"Line":4}},{"line":378,"address":[12891299,12891199],"length":1,"stats":{"Line":1}},{"line":379,"address":[2768928,2768912],"length":1,"stats":{"Line":3}},{"line":382,"address":[2530112,2531018,2531242],"length":1,"stats":{"Line":1}},{"line":383,"address":[5093331],"length":1,"stats":{"Line":1}},{"line":384,"address":[3410355,3406702],"length":1,"stats":{"Line":4}},{"line":385,"address":[6655792],"length":1,"stats":{"Line":2}},{"line":386,"address":[6435917],"length":1,"stats":{"Line":2}},{"line":388,"address":[5918855,5924214,5922540,5920562],"length":1,"stats":{"Line":2}},{"line":389,"address":[6436256,6435963,6436014],"length":1,"stats":{"Line":0}},{"line":390,"address":[5104162,5104213,5104425],"length":1,"stats":{"Line":0}},{"line":394,"address":[6654549],"length":1,"stats":{"Line":1}},{"line":397,"address":[5332912,5334438,5334466],"length":1,"stats":{"Line":1}},{"line":398,"address":[2594685],"length":1,"stats":{"Line":1}},{"line":399,"address":[5333078],"length":1,"stats":{"Line":1}},{"line":400,"address":[6436573],"length":1,"stats":{"Line":2}},{"line":402,"address":[2595317,2595232],"length":1,"stats":{"Line":3}},{"line":404,"address":[5333689,5333789],"length":1,"stats":{"Line":2}},{"line":405,"address":[5202812],"length":1,"stats":{"Line":3}},{"line":410,"address":[7822311,7822096,7822305],"length":1,"stats":{"Line":2}},{"line":414,"address":[5204583],"length":1,"stats":{"Line":3}},{"line":415,"address":[2595868],"length":1,"stats":{"Line":3}},{"line":417,"address":[5334336],"length":1,"stats":{"Line":1}},{"line":420,"address":[2539929,2536272,2541088],"length":1,"stats":{"Line":2}},{"line":422,"address":[6447638,6447700,6447829,6446006,6446197,6446068],"length":1,"stats":{"Line":1}},{"line":423,"address":[12893967,12893377,12893698,12894134],"length":1,"stats":{"Line":2}},{"line":424,"address":[6446419,6448051,6446363,6446536,6448168,6447995],"length":1,"stats":{"Line":0}},{"line":428,"address":[6448776,6448634,6447002,6447144,6447055,6448687],"length":1,"stats":{"Line":0}},{"line":429,"address":[6487657,6488081],"length":1,"stats":{"Line":0}},{"line":432,"address":[5093200],"length":1,"stats":{"Line":0}},{"line":433,"address":[5082448],"length":1,"stats":{"Line":0}},{"line":435,"address":[5093237],"length":1,"stats":{"Line":0}},{"line":436,"address":[12916150,12916342,12916674],"length":1,"stats":{"Line":0}},{"line":439,"address":[14281120],"length":1,"stats":{"Line":0}},{"line":440,"address":[12916535],"length":1,"stats":{"Line":0}},{"line":442,"address":[7822624],"length":1,"stats":{"Line":0}},{"line":443,"address":[5091979],"length":1,"stats":{"Line":0}},{"line":444,"address":[2537739,2537808],"length":1,"stats":{"Line":0}},{"line":448,"address":[5721432],"length":1,"stats":{"Line":0}},{"line":449,"address":[6481315,6481237,6481199],"length":1,"stats":{"Line":0}},{"line":451,"address":[2765515,2765472],"length":1,"stats":{"Line":0}},{"line":452,"address":[2538243],"length":1,"stats":{"Line":0}},{"line":454,"address":[6481515],"length":1,"stats":{"Line":0}},{"line":455,"address":[5280489,5278007],"length":1,"stats":{"Line":0}},{"line":457,"address":[7381045,7381008,7380984],"length":1,"stats":{"Line":0}},{"line":458,"address":[6487601],"length":1,"stats":{"Line":0}},{"line":459,"address":[14280619],"length":1,"stats":{"Line":0}},{"line":462,"address":[14280688,14280636],"length":1,"stats":{"Line":0}},{"line":465,"address":[6483712],"length":1,"stats":{"Line":0}},{"line":466,"address":[2538823],"length":1,"stats":{"Line":0}},{"line":467,"address":[5721878,5721810],"length":1,"stats":{"Line":0}},{"line":468,"address":[5728086,5721964],"length":1,"stats":{"Line":0}},{"line":469,"address":[14112235],"length":1,"stats":{"Line":0}},{"line":473,"address":[14113753],"length":1,"stats":{"Line":0}},{"line":474,"address":[2539028,2538948],"length":1,"stats":{"Line":0}},{"line":475,"address":[5278724,5279503],"length":1,"stats":{"Line":0}},{"line":476,"address":[6485161],"length":1,"stats":{"Line":0}},{"line":477,"address":[14114134,14113732],"length":1,"stats":{"Line":0}},{"line":478,"address":[7823550],"length":1,"stats":{"Line":0}},{"line":485,"address":[6653001],"length":1,"stats":{"Line":0}},{"line":486,"address":[6653096],"length":1,"stats":{"Line":0}},{"line":488,"address":[14281663],"length":1,"stats":{"Line":0}},{"line":489,"address":[5886802,5886728],"length":1,"stats":{"Line":0}},{"line":490,"address":[11847429],"length":1,"stats":{"Line":0}},{"line":491,"address":[2539360],"length":1,"stats":{"Line":0}},{"line":494,"address":[5726743,5727021],"length":1,"stats":{"Line":0}},{"line":495,"address":[3916826],"length":1,"stats":{"Line":0}},{"line":497,"address":[5844384],"length":1,"stats":{"Line":0}},{"line":500,"address":[6485352],"length":1,"stats":{"Line":1}},{"line":501,"address":[2535127,2535084,2535167],"length":1,"stats":{"Line":2}},{"line":502,"address":[11847336],"length":1,"stats":{"Line":0}},{"line":503,"address":[2535096],"length":1,"stats":{"Line":1}},{"line":504,"address":[14114283,14114339,14114200],"length":1,"stats":{"Line":1}},{"line":506,"address":[6656375,6656332],"length":1,"stats":{"Line":1}},{"line":507,"address":[5274934],"length":1,"stats":{"Line":0}},{"line":513,"address":[5275045],"length":1,"stats":{"Line":1}},{"line":514,"address":[7827608,7823986,7823819,7828260],"length":1,"stats":{"Line":2}},{"line":515,"address":[11846917],"length":1,"stats":{"Line":12}},{"line":516,"address":[6484688],"length":1,"stats":{"Line":2}},{"line":517,"address":[5279584],"length":1,"stats":{"Line":0}},{"line":518,"address":[5886364,5886312],"length":1,"stats":{"Line":22}},{"line":522,"address":[2535619],"length":1,"stats":{"Line":23}},{"line":525,"address":[3918288,3918345,3918256],"length":1,"stats":{"Line":23}},{"line":526,"address":[3699648],"length":1,"stats":{"Line":2}},{"line":527,"address":[11628423],"length":1,"stats":{"Line":0}},{"line":528,"address":[5271092],"length":1,"stats":{"Line":1}},{"line":529,"address":[7838320],"length":1,"stats":{"Line":1}},{"line":530,"address":[5271211],"length":1,"stats":{"Line":1}},{"line":532,"address":[7825379,7825245],"length":1,"stats":{"Line":1}},{"line":533,"address":[5279675],"length":1,"stats":{"Line":3}},{"line":534,"address":[5271595,5272192,5271639],"length":1,"stats":{"Line":2}},{"line":535,"address":[5734608],"length":1,"stats":{"Line":0}},{"line":537,"address":[5734662],"length":1,"stats":{"Line":2}},{"line":539,"address":[7835932],"length":1,"stats":{"Line":3}},{"line":540,"address":[5724520,5724388],"length":1,"stats":{"Line":0}},{"line":541,"address":[11845172,11845147],"length":1,"stats":{"Line":0}},{"line":544,"address":[5725034],"length":1,"stats":{"Line":1}},{"line":547,"address":[11845334],"length":1,"stats":{"Line":0}},{"line":548,"address":[7380232],"length":1,"stats":{"Line":0}},{"line":549,"address":[5725446,5725144],"length":1,"stats":{"Line":0}},{"line":550,"address":[2598554],"length":1,"stats":{"Line":0}},{"line":551,"address":[5336928,5336874],"length":1,"stats":{"Line":0}},{"line":552,"address":[7826502],"length":1,"stats":{"Line":0}},{"line":555,"address":[14113023],"length":1,"stats":{"Line":0}},{"line":558,"address":[3699099],"length":1,"stats":{"Line":0}},{"line":559,"address":[5705864],"length":1,"stats":{"Line":0}},{"line":561,"address":[3699184,3699396,3699422],"length":1,"stats":{"Line":0}},{"line":563,"address":[3699208],"length":1,"stats":{"Line":0}},{"line":566,"address":[5340383,5337793,5337980,5338018],"length":1,"stats":{"Line":0}},{"line":567,"address":[3699406,3699247,3699386],"length":1,"stats":{"Line":0}},{"line":569,"address":[2599808,2599559,2599742,2602171,2599673],"length":1,"stats":{"Line":0}},{"line":570,"address":[5843932,5844029],"length":1,"stats":{"Line":0}},{"line":571,"address":[5338114,5338183],"length":1,"stats":{"Line":0}},{"line":575,"address":[5338140,5340362,5338288],"length":1,"stats":{"Line":0}},{"line":576,"address":[7812107],"length":1,"stats":{"Line":0}},{"line":579,"address":[7836272],"length":1,"stats":{"Line":0}},{"line":580,"address":[6486066,6486009,6486050],"length":1,"stats":{"Line":0}},{"line":581,"address":[5735044],"length":1,"stats":{"Line":0}},{"line":585,"address":[2600826,2600787,2600885,2601889,2600682],"length":1,"stats":{"Line":0}},{"line":586,"address":[7370872],"length":1,"stats":{"Line":0}},{"line":587,"address":[2601060],"length":1,"stats":{"Line":0}},{"line":588,"address":[5339336],"length":1,"stats":{"Line":0}},{"line":591,"address":[2601229,2601156],"length":1,"stats":{"Line":0}},{"line":592,"address":[2601237,2601293],"length":1,"stats":{"Line":0}},{"line":593,"address":[2601383,2601443],"length":1,"stats":{"Line":0}},{"line":594,"address":[5269641],"length":1,"stats":{"Line":0}},{"line":596,"address":[5339911],"length":1,"stats":{"Line":11}},{"line":599,"address":[7836160],"length":1,"stats":{"Line":1}},{"line":601,"address":[14116540,14116336,14116534],"length":1,"stats":{"Line":3}},{"line":602,"address":[5704416],"length":1,"stats":{"Line":0}},{"line":603,"address":[6487873],"length":1,"stats":{"Line":1}},{"line":604,"address":[6487887,6487944],"length":1,"stats":{"Line":4}},{"line":606,"address":[5703408],"length":1,"stats":{"Line":1}},{"line":607,"address":[5703427],"length":1,"stats":{"Line":1}},{"line":608,"address":[6812383],"length":1,"stats":{"Line":0}},{"line":612,"address":[5335017],"length":1,"stats":{"Line":1}},{"line":613,"address":[5269483],"length":1,"stats":{"Line":0}},{"line":614,"address":[2597841,2596945],"length":1,"stats":{"Line":0}},{"line":615,"address":[5336365,5336527,5336167],"length":1,"stats":{"Line":0}},{"line":616,"address":[2522693,2522716],"length":1,"stats":{"Line":0}},{"line":624,"address":[6479993],"length":1,"stats":{"Line":13}},{"line":625,"address":[5335567],"length":1,"stats":{"Line":12}},{"line":626,"address":[3918688],"length":1,"stats":{"Line":12}},{"line":627,"address":[2515969],"length":1,"stats":{"Line":23}},{"line":628,"address":[6480336],"length":1,"stats":{"Line":1}},{"line":630,"address":[6804910],"length":1,"stats":{"Line":1}},{"line":633,"address":[5728640,5729366,5729391],"length":1,"stats":{"Line":1}},{"line":641,"address":[5347803,5347716,5347854],"length":1,"stats":{"Line":3}},{"line":642,"address":[5728428],"length":1,"stats":{"Line":0}},{"line":643,"address":[6482002,6482904],"length":1,"stats":{"Line":1}},{"line":644,"address":[5086637,5086450,5086432],"length":1,"stats":{"Line":4}},{"line":645,"address":[5728563,5728472,5728602],"length":1,"stats":{"Line":1}},{"line":648,"address":[5347957],"length":1,"stats":{"Line":1}},{"line":649,"address":[5347969],"length":1,"stats":{"Line":1}},{"line":650,"address":[7829865],"length":1,"stats":{"Line":2}},{"line":651,"address":[14110610],"length":1,"stats":{"Line":1}},{"line":652,"address":[2610065,2610345,2610390],"length":1,"stats":{"Line":2}},{"line":655,"address":[5348152],"length":1,"stats":{"Line":1}},{"line":656,"address":[7808970,7809666],"length":1,"stats":{"Line":1}},{"line":657,"address":[2610238],"length":1,"stats":{"Line":1}},{"line":660,"address":[7370329,7370304,7370380,7370445],"length":1,"stats":{"Line":1}},{"line":661,"address":[14111470],"length":1,"stats":{"Line":0}},{"line":663,"address":[6481483],"length":1,"stats":{"Line":1}},{"line":666,"address":[14109238],"length":1,"stats":{"Line":2}},{"line":669,"address":[6468840],"length":1,"stats":{"Line":2}},{"line":670,"address":[5349295],"length":1,"stats":{"Line":1}},{"line":671,"address":[7859602,7859661],"length":1,"stats":{"Line":0}},{"line":674,"address":[7815935],"length":1,"stats":{"Line":1}},{"line":675,"address":[2611489,2611409],"length":1,"stats":{"Line":0}},{"line":676,"address":[2612428,2611601],"length":1,"stats":{"Line":0}},{"line":677,"address":[5512560],"length":1,"stats":{"Line":0}},{"line":678,"address":[7815376],"length":1,"stats":{"Line":0}},{"line":679,"address":[6477532],"length":1,"stats":{"Line":0}},{"line":686,"address":[5732245],"length":1,"stats":{"Line":1}},{"line":687,"address":[2611820],"length":1,"stats":{"Line":1}},{"line":688,"address":[5714307],"length":1,"stats":{"Line":1}},{"line":689,"address":[7833561],"length":1,"stats":{"Line":1}},{"line":690,"address":[7833572],"length":1,"stats":{"Line":1}},{"line":692,"address":[4375623],"length":1,"stats":{"Line":1}},{"line":695,"address":[2528352,2530094,2529390],"length":1,"stats":{"Line":0}},{"line":697,"address":[5268288,5268335,5268386],"length":1,"stats":{"Line":0}},{"line":698,"address":[7377783,7378584,7378697,7378457,7378467,7378648,7378488,7378330],"length":1,"stats":{"Line":0}},{"line":699,"address":[2528412],"length":1,"stats":{"Line":0}},{"line":700,"address":[6483450],"length":1,"stats":{"Line":0}},{"line":703,"address":[5134928],"length":1,"stats":{"Line":0}},{"line":704,"address":[7813812,7813783,7813568],"length":1,"stats":{"Line":0}},{"line":705,"address":[6486368],"length":1,"stats":{"Line":0}},{"line":706,"address":[5709356,5709500],"length":1,"stats":{"Line":3}},{"line":709,"address":[7834046],"length":1,"stats":{"Line":0}},{"line":710,"address":[7813967],"length":1,"stats":{"Line":0}},{"line":711,"address":[5135067],"length":1,"stats":{"Line":0}},{"line":712,"address":[6467187],"length":1,"stats":{"Line":0}},{"line":717,"address":[7379304,7379250],"length":1,"stats":{"Line":0}},{"line":718,"address":[2529426],"length":1,"stats":{"Line":0}},{"line":721,"address":[6476119,6476163,6474624],"length":1,"stats":{"Line":0}},{"line":724,"address":[5269388],"length":1,"stats":{"Line":0}},{"line":725,"address":[14104800,14103159,14104813],"length":1,"stats":{"Line":9}},{"line":727,"address":[6467450],"length":1,"stats":{"Line":0}},{"line":728,"address":[6467653],"length":1,"stats":{"Line":0}},{"line":730,"address":[7379807],"length":1,"stats":{"Line":0}},{"line":733,"address":[14103526],"length":1,"stats":{"Line":0}},{"line":736,"address":[6795208,6803140],"length":1,"stats":{"Line":4}},{"line":737,"address":[7818341],"length":1,"stats":{"Line":1}},{"line":740,"address":[2602424,2602336],"length":1,"stats":{"Line":2}},{"line":741,"address":[2605302,2602699],"length":1,"stats":{"Line":2}},{"line":742,"address":[6475377],"length":1,"stats":{"Line":1}},{"line":743,"address":[2605641,2605593],"length":1,"stats":{"Line":2}},{"line":744,"address":[14103877],"length":1,"stats":{"Line":0}},{"line":745,"address":[6476176,6475599,6475987],"length":1,"stats":{"Line":1}},{"line":751,"address":[6468279],"length":1,"stats":{"Line":1}},{"line":752,"address":[7833712],"length":1,"stats":{"Line":2}},{"line":753,"address":[14104396,14104109],"length":1,"stats":{"Line":3}},{"line":754,"address":[14103390,14104377,14104417,14103238,14103598,14104605],"length":1,"stats":{"Line":2}},{"line":757,"address":[5341360],"length":1,"stats":{"Line":1}},{"line":758,"address":[5136345],"length":1,"stats":{"Line":2}},{"line":759,"address":[5342657],"length":1,"stats":{"Line":1}},{"line":761,"address":[5136418],"length":1,"stats":{"Line":0}},{"line":767,"address":[5341557],"length":1,"stats":{"Line":1}},{"line":768,"address":[2603523,2604083],"length":1,"stats":{"Line":2}},{"line":769,"address":[2604195],"length":1,"stats":{"Line":0}},{"line":770,"address":[5714000],"length":1,"stats":{"Line":0}},{"line":771,"address":[5714037],"length":1,"stats":{"Line":0}},{"line":772,"address":[6795136,6795323,6795332,6795213,6795303,6795361,6795352,6795294],"length":1,"stats":{"Line":6}},{"line":778,"address":[7814736],"length":1,"stats":{"Line":2}},{"line":779,"address":[5341913,5342241,5341878],"length":1,"stats":{"Line":3}},{"line":781,"address":[4362362],"length":1,"stats":{"Line":4}},{"line":785,"address":[5285110],"length":1,"stats":{"Line":1}},{"line":786,"address":[5713642,5713564],"length":1,"stats":{"Line":1}},{"line":789,"address":[5139515,5138889,5137342,5138992,5137811,5137248],"length":1,"stats":{"Line":1}},{"line":790,"address":[6471048,6469398,6469408,6470973,6469332,6471058],"length":1,"stats":{"Line":2}},{"line":791,"address":[5272990,5274698],"length":1,"stats":{"Line":2}},{"line":793,"address":[7835057],"length":1,"stats":{"Line":1}},{"line":794,"address":[5273172,5274431],"length":1,"stats":{"Line":2}},{"line":795,"address":[5706571],"length":1,"stats":{"Line":0}},{"line":796,"address":[5706025,5706634],"length":1,"stats":{"Line":0}},{"line":800,"address":[5711280],"length":1,"stats":{"Line":1}},{"line":801,"address":[5711319],"length":1,"stats":{"Line":2}},{"line":802,"address":[7812670,7812610],"length":1,"stats":{"Line":1}},{"line":803,"address":[5274034],"length":1,"stats":{"Line":1}},{"line":804,"address":[5274085,5274203,5274132],"length":1,"stats":{"Line":3}},{"line":805,"address":[5274252],"length":1,"stats":{"Line":1}},{"line":809,"address":[5273393,5273851,5273531],"length":1,"stats":{"Line":2}},{"line":810,"address":[6471555,6469854,6469791,6471489],"length":1,"stats":{"Line":0}},{"line":812,"address":[6470095,6471823],"length":1,"stats":{"Line":1}},{"line":816,"address":[7812289,7812349],"length":1,"stats":{"Line":0}},{"line":817,"address":[5711184],"length":1,"stats":{"Line":0}},{"line":820,"address":[2546465,2545854,2545771],"length":1,"stats":{"Line":0}},{"line":821,"address":[2546262,2545978,2589230],"length":1,"stats":{"Line":0}},{"line":823,"address":[2546216,2546000,2545971],"length":1,"stats":{"Line":0}},{"line":827,"address":[6470417,6470276,6472014,6472163,6472074,6470331],"length":1,"stats":{"Line":0}},{"line":828,"address":[2546530],"length":1,"stats":{"Line":0}},{"line":829,"address":[5138528,5140282,5138552,5140308],"length":1,"stats":{"Line":0}},{"line":830,"address":[5140315,5138558],"length":1,"stats":{"Line":0}},{"line":831,"address":[2546803,2546862],"length":1,"stats":{"Line":0}},{"line":832,"address":[5140300,5138545],"length":1,"stats":{"Line":0}},{"line":833,"address":[2546904],"length":1,"stats":{"Line":0}},{"line":835,"address":[2511514,2508267,2509861,2509196],"length":1,"stats":{"Line":3}},{"line":836,"address":[5712164],"length":1,"stats":{"Line":3}},{"line":837,"address":[5286919,5286498,5286760],"length":1,"stats":{"Line":0}},{"line":839,"address":[2547230,2546979,2547020],"length":1,"stats":{"Line":0}},{"line":842,"address":[7812800],"length":1,"stats":{"Line":0}},{"line":846,"address":[5736746,5755140],"length":1,"stats":{"Line":0}},{"line":847,"address":[7812852],"length":1,"stats":{"Line":0}},{"line":848,"address":[5282594],"length":1,"stats":{"Line":0}},{"line":849,"address":[5711795],"length":1,"stats":{"Line":0}},{"line":853,"address":[2547186],"length":1,"stats":{"Line":3}},{"line":854,"address":[2548564,2547462],"length":1,"stats":{"Line":0}},{"line":855,"address":[2548611],"length":1,"stats":{"Line":3}},{"line":856,"address":[5288091],"length":1,"stats":{"Line":3}},{"line":857,"address":[6816049],"length":1,"stats":{"Line":3}},{"line":858,"address":[2527221],"length":1,"stats":{"Line":3}},{"line":859,"address":[5131810,5129519],"length":1,"stats":{"Line":0}},{"line":860,"address":[4383154,4383238,4383226,4383253,4383262],"length":1,"stats":{"Line":15}},{"line":861,"address":[5717557],"length":1,"stats":{"Line":0}},{"line":862,"address":[5717658],"length":1,"stats":{"Line":6}},{"line":864,"address":[2527453],"length":1,"stats":{"Line":3}},{"line":867,"address":[5717675,5717709],"length":1,"stats":{"Line":0}},{"line":870,"address":[5288540],"length":1,"stats":{"Line":3}},{"line":871,"address":[2551615,2551520],"length":1,"stats":{"Line":3}},{"line":872,"address":[7819060],"length":1,"stats":{"Line":0}},{"line":873,"address":[5717817],"length":1,"stats":{"Line":0}},{"line":877,"address":[5129943,5132241],"length":1,"stats":{"Line":0}},{"line":878,"address":[5284204],"length":1,"stats":{"Line":0}},{"line":880,"address":[7836780],"length":1,"stats":{"Line":3}},{"line":884,"address":[7385984,7386291,7386297],"length":1,"stats":{"Line":0}},{"line":885,"address":[7386014],"length":1,"stats":{"Line":0}},{"line":890,"address":[7836864],"length":1,"stats":{"Line":0}},{"line":892,"address":[5735630],"length":1,"stats":{"Line":0}},{"line":893,"address":[2547581,2552748],"length":1,"stats":{"Line":3}},{"line":894,"address":[2512079,2511541],"length":1,"stats":{"Line":6}},{"line":895,"address":[6800408,6800513],"length":1,"stats":{"Line":3}},{"line":897,"address":[5082894,5082864],"length":1,"stats":{"Line":0}},{"line":899,"address":[5130226,5132549,5132526,5130249,5130300,5132600],"length":1,"stats":{"Line":0}},{"line":900,"address":[6799504],"length":1,"stats":{"Line":0}},{"line":901,"address":[5285744,5287291,5286574],"length":1,"stats":{"Line":3}},{"line":902,"address":[5293753,5293584],"length":1,"stats":{"Line":0}},{"line":904,"address":[5735381],"length":1,"stats":{"Line":0}},{"line":905,"address":[5285862],"length":1,"stats":{"Line":0}},{"line":909,"address":[2547627],"length":1,"stats":{"Line":0}},{"line":910,"address":[5287692,5287589],"length":1,"stats":{"Line":0}},{"line":911,"address":[7389015,7389036,7388892],"length":1,"stats":{"Line":0}},{"line":912,"address":[2555340,2556399,2555252],"length":1,"stats":{"Line":0}},{"line":913,"address":[5735499],"length":1,"stats":{"Line":3}},{"line":914,"address":[6798302],"length":1,"stats":{"Line":3}},{"line":915,"address":[5287361,5286260,5286337,5287328],"length":1,"stats":{"Line":3}},{"line":917,"address":[5735536],"length":1,"stats":{"Line":0}},{"line":918,"address":[7836793,7836832,7836833],"length":1,"stats":{"Line":0}},{"line":922,"address":[7387787,7387537,7387800],"length":1,"stats":{"Line":0}},{"line":923,"address":[5296546],"length":1,"stats":{"Line":0}},{"line":924,"address":[7814038],"length":1,"stats":{"Line":0}},{"line":925,"address":[5735297],"length":1,"stats":{"Line":0}},{"line":926,"address":[7388217],"length":1,"stats":{"Line":0}},{"line":927,"address":[2559106,2559049,2557779,2559221,2558665],"length":1,"stats":{"Line":0}},{"line":928,"address":[5735325],"length":1,"stats":{"Line":0}},{"line":930,"address":[5298759,5298509],"length":1,"stats":{"Line":0}},{"line":933,"address":[2557372],"length":1,"stats":{"Line":0}},{"line":935,"address":[5708133,5708912,5709026,5708975,5708080],"length":1,"stats":{"Line":0}},{"line":936,"address":[2547770,2559723],"length":1,"stats":{"Line":0}},{"line":937,"address":[2559766],"length":1,"stats":{"Line":0}},{"line":938,"address":[5300310,5299065,5298977],"length":1,"stats":{"Line":0}},{"line":939,"address":[6462894,6465196,6465058,6462758],"length":1,"stats":{"Line":0}},{"line":940,"address":[2561231,2559795,2561116,2560678,2561062],"length":1,"stats":{"Line":0}},{"line":941,"address":[2561408,2561239],"length":1,"stats":{"Line":0}},{"line":943,"address":[5300875,5300740,5300459],"length":1,"stats":{"Line":0}},{"line":944,"address":[2561807,2561949],"length":1,"stats":{"Line":0}},{"line":948,"address":[2547868],"length":1,"stats":{"Line":0}},{"line":954,"address":[6476976,6473360],"length":1,"stats":{"Line":0}},{"line":955,"address":[5715152,5715361],"length":1,"stats":{"Line":0}},{"line":957,"address":[7816468,7816418],"length":1,"stats":{"Line":0}},{"line":958,"address":[6477000,6473384],"length":1,"stats":{"Line":0}},{"line":959,"address":[5285640],"length":1,"stats":{"Line":0}},{"line":960,"address":[5144961,5141342],"length":1,"stats":{"Line":0}},{"line":961,"address":[6477055,6473435],"length":1,"stats":{"Line":0}},{"line":962,"address":[7389493,7389559],"length":1,"stats":{"Line":0}},{"line":964,"address":[5305393,5307339],"length":1,"stats":{"Line":0}},{"line":965,"address":[7816658,7816708],"length":1,"stats":{"Line":0}},{"line":967,"address":[2568490,2566251],"length":1,"stats":{"Line":0}},{"line":969,"address":[7816833,7816678],"length":1,"stats":{"Line":0}},{"line":971,"address":[2562685],"length":1,"stats":{"Line":0}},{"line":972,"address":[5141479],"length":1,"stats":{"Line":0}},{"line":973,"address":[7382106,7382032,7383186],"length":1,"stats":{"Line":0}},{"line":976,"address":[2562870,2562747],"length":1,"stats":{"Line":0}},{"line":977,"address":[7817328],"length":1,"stats":{"Line":0}},{"line":978,"address":[7382712],"length":1,"stats":{"Line":0}},{"line":979,"address":[2563299],"length":1,"stats":{"Line":0}},{"line":980,"address":[7382996],"length":1,"stats":{"Line":0}},{"line":982,"address":[7383010],"length":1,"stats":{"Line":0}},{"line":983,"address":[5281782],"length":1,"stats":{"Line":0}},{"line":985,"address":[2565613,2563355],"length":1,"stats":{"Line":0}},{"line":987,"address":[2512574],"length":1,"stats":{"Line":0}},{"line":988,"address":[2512616],"length":1,"stats":{"Line":0}},{"line":989,"address":[6473698,6477336],"length":1,"stats":{"Line":0}},{"line":994,"address":[5285373,5285320],"length":1,"stats":{"Line":0}},{"line":995,"address":[7819534],"length":1,"stats":{"Line":0}},{"line":996,"address":[6473987,6477628],"length":1,"stats":{"Line":0}},{"line":998,"address":[7819476,7819088],"length":1,"stats":{"Line":0}},{"line":999,"address":[6474531,6474465],"length":1,"stats":{"Line":0}},{"line":1000,"address":[5717920,5717973],"length":1,"stats":{"Line":0}},{"line":1001,"address":[5288730],"length":1,"stats":{"Line":0}},{"line":1003,"address":[2569519,2571065],"length":1,"stats":{"Line":0}},{"line":1004,"address":[5309952,5309539,5309606],"length":1,"stats":{"Line":0}},{"line":1006,"address":[5142391,5142329,5145952,5146014],"length":1,"stats":{"Line":0}},{"line":1008,"address":[5279296,5279470],"length":1,"stats":{"Line":0}},{"line":1009,"address":[2548039,2571349],"length":1,"stats":{"Line":0}},{"line":1010,"address":[2574406,2571481],"length":1,"stats":{"Line":0}},{"line":1012,"address":[2571450,2571519],"length":1,"stats":{"Line":0}},{"line":1013,"address":[5720138,5720225,5719043,5718646,5718829,5719560],"length":1,"stats":{"Line":0}},{"line":1014,"address":[7820101],"length":1,"stats":{"Line":0}},{"line":1015,"address":[2571951],"length":1,"stats":{"Line":0}},{"line":1016,"address":[5310854,5310930],"length":1,"stats":{"Line":0}},{"line":1018,"address":[5311001,5312966],"length":1,"stats":{"Line":0}},{"line":1019,"address":[5147093,5143300],"length":1,"stats":{"Line":0}},{"line":1021,"address":[5313098,5310892],"length":1,"stats":{"Line":0}},{"line":1023,"address":[7369386,7362302,7371622,7376874,7366187,7376512,7366994,7364692,7379143],"length":1,"stats":{"Line":0}},{"line":1030,"address":[6476198,6479759,6479821,6479985,6475966,6476034],"length":1,"stats":{"Line":0}},{"line":1031,"address":[2577749,2574615],"length":1,"stats":{"Line":0}},{"line":1035,"address":[7822082,7821632,7822076],"length":1,"stats":{"Line":0}},{"line":1036,"address":[7821691],"length":1,"stats":{"Line":0}},{"line":1037,"address":[7821719,7821787],"length":1,"stats":{"Line":0}},{"line":1038,"address":[7834590],"length":1,"stats":{"Line":0}},{"line":1039,"address":[5142578,5146088],"length":1,"stats":{"Line":0}},{"line":1041,"address":[5313846,5316460],"length":1,"stats":{"Line":0}},{"line":1042,"address":[5720778],"length":1,"stats":{"Line":3}},{"line":1043,"address":[5314070,5313994],"length":1,"stats":{"Line":3}},{"line":1045,"address":[6799851,6799909,6799941,6799974,6799882],"length":1,"stats":{"Line":0}},{"line":1046,"address":[2576934,2577304,2576863],"length":1,"stats":{"Line":0}},{"line":1048,"address":[2577485,2575227],"length":1,"stats":{"Line":0}},{"line":1050,"address":[6800238],"length":1,"stats":{"Line":3}},{"line":1051,"address":[6474942,6478484,6478452,6474974],"length":1,"stats":{"Line":0}},{"line":1052,"address":[5720744,5720488],"length":1,"stats":{"Line":0}},{"line":1054,"address":[2577972,2578056,2580805],"length":1,"stats":{"Line":0}},{"line":1055,"address":[5316966,5319457],"length":1,"stats":{"Line":0}},{"line":1056,"address":[5317100],"length":1,"stats":{"Line":0}},{"line":1057,"address":[2578385,2578465],"length":1,"stats":{"Line":0}},{"line":1059,"address":[5317261,5319226],"length":1,"stats":{"Line":0}},{"line":1060,"address":[5143224,5143256],"length":1,"stats":{"Line":0}},{"line":1062,"address":[2578427,2580685],"length":1,"stats":{"Line":0}},{"line":1064,"address":[2548339],"length":1,"stats":{"Line":0}},{"line":1065,"address":[2580855,2548357],"length":1,"stats":{"Line":0}},{"line":1066,"address":[5319659,5321837],"length":1,"stats":{"Line":0}},{"line":1068,"address":[6798577],"length":1,"stats":{"Line":0}},{"line":1069,"address":[2583186,2581147],"length":1,"stats":{"Line":0}},{"line":1070,"address":[6478748,6478702,6478884],"length":1,"stats":{"Line":0}},{"line":1071,"address":[5320040,5319964],"length":1,"stats":{"Line":0}},{"line":1073,"address":[5732983],"length":1,"stats":{"Line":0}},{"line":1074,"address":[5321182,5321249,5321595],"length":1,"stats":{"Line":0}},{"line":1076,"address":[2510620],"length":1,"stats":{"Line":3}},{"line":1078,"address":[5147004,5147036],"length":1,"stats":{"Line":0}},{"line":1079,"address":[5733376],"length":1,"stats":{"Line":0}},{"line":1080,"address":[6799488],"length":1,"stats":{"Line":3}},{"line":1082,"address":[5321974,5322056,5323508],"length":1,"stats":{"Line":0}},{"line":1083,"address":[5322167,5323487],"length":1,"stats":{"Line":0}},{"line":1084,"address":[2583716],"length":1,"stats":{"Line":0}},{"line":1085,"address":[2584804,2583783,2583738],"length":1,"stats":{"Line":0}},{"line":1086,"address":[2584774,2584410,2584339],"length":1,"stats":{"Line":0}},{"line":1088,"address":[2583753,2584848],"length":1,"stats":{"Line":0}},{"line":1091,"address":[2508768],"length":1,"stats":{"Line":0}},{"line":1092,"address":[6797811],"length":1,"stats":{"Line":0}},{"line":1093,"address":[5324927,5323892,5323774],"length":1,"stats":{"Line":0}},{"line":1094,"address":[6797961],"length":1,"stats":{"Line":0}},{"line":1096,"address":[2586450,2585232,2586585],"length":1,"stats":{"Line":0}},{"line":1097,"address":[6797972],"length":1,"stats":{"Line":0}},{"line":1101,"address":[5148717],"length":1,"stats":{"Line":0}},{"line":1102,"address":[6480808],"length":1,"stats":{"Line":0}},{"line":1103,"address":[2587136],"length":1,"stats":{"Line":0}},{"line":1104,"address":[5325671,5325759,5326784],"length":1,"stats":{"Line":0}},{"line":1105,"address":[2587870,2588250,2587799],"length":1,"stats":{"Line":0}},{"line":1106,"address":[5326319,5326743,5326836,5326692,5325678],"length":1,"stats":{"Line":0}},{"line":1107,"address":[2588359,2588504],"length":1,"stats":{"Line":0}},{"line":1109,"address":[2588791,2588414,2588656],"length":1,"stats":{"Line":0}},{"line":1110,"address":[2588868,2589069],"length":1,"stats":{"Line":0}},{"line":1116,"address":[2551294],"length":1,"stats":{"Line":0}}],"covered":254,"coverable":563},{"path":["/","home","jani","devel","mindmap-cli","src","main.rs"],"content":"use clap::Parser;\nuse mindmap_cli::{Cli, run};\n\nfn main() -\u003e anyhow::Result\u003c()\u003e {\n    let cli = Cli::parse();\n    run(cli)\n}\n","traces":[{"line":4,"address":[2240080],"length":1,"stats":{"Line":0}},{"line":5,"address":[2240084],"length":1,"stats":{"Line":0}},{"line":6,"address":[2240095],"length":1,"stats":{"Line":0}}],"covered":0,"coverable":3},{"path":["/","home","jani","devel","mindmap-cli","src","ui.rs"],"content":"use anyhow::Result;\nuse pretty_console::Console;\n\npub trait Printer {\n    fn show(\u0026self, node: \u0026crate::Node, inbound: \u0026[u32], outbound: \u0026[u32]) -\u003e Result\u003c()\u003e;\n    fn list(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e;\n    fn refs(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e;\n    fn links(\u0026self, id: u32, links: \u0026[u32]) -\u003e Result\u003c()\u003e;\n    fn search(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e;\n    fn orphans(\u0026self, orphans: \u0026[String]) -\u003e Result\u003c()\u003e;\n}\n\npub struct PrettyPrinter {}\n\nimpl PrettyPrinter {\n    pub fn new() -\u003e Result\u003cSelf\u003e {\n        Ok(Self {})\n    }\n}\n\nimpl Printer for PrettyPrinter {\n    fn show(\u0026self, node: \u0026crate::Node, inbound: \u0026[u32], outbound: \u0026[u32]) -\u003e Result\u003c()\u003e {\n        // ID in green (no newline)\n        Console::new(format!(\"[{}] \", node.id)).green().print();\n        // Title bold (uncolored) on same line\n        Console::new(\u0026node.raw_title).bold().println();\n\n        // Description on new line\n        Console::new(\u0026node.description).println();\n\n        // Incoming references in blue\n        if !inbound.is_empty() {\n            Console::new(\"Incoming:\").blue().print();\n            Console::new(format!(\" {:?}\", inbound)).blue().println();\n        }\n\n        // Outgoing references in magenta\n        if !outbound.is_empty() {\n            Console::new(\"Outgoing:\").magenta().print();\n            Console::new(format!(\" {:?}\", outbound)).magenta().println();\n        }\n\n        Ok(())\n    }\n\n    fn list(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e {\n        for line in lines {\n            Console::new(line).println();\n        }\n        Ok(())\n    }\n\n    fn refs(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e {\n        for line in lines {\n            Console::new(line).println();\n        }\n        Ok(())\n    }\n\n    fn links(\u0026self, id: u32, links: \u0026[u32]) -\u003e Result\u003c()\u003e {\n        let s = format!(\"Node [{}] references: {:?}\", id, links);\n        Console::new(\u0026s).println();\n        Ok(())\n    }\n\n    fn search(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e {\n        for line in lines {\n            Console::new(line).println();\n        }\n        Ok(())\n    }\n\n    fn orphans(\u0026self, orphans: \u0026[String]) -\u003e Result\u003c()\u003e {\n        // Orphans are data for the orphans command — print to stdout\n        if orphans.is_empty() {\n            Console::new(\"No orphans\").green().println();\n        } else {\n            Console::new(\"Orphans:\").yellow().bold().println();\n            for o in orphans {\n                Console::new(format!(\"[{}]\", o)).println();\n            }\n        }\n        Ok(())\n    }\n}\n\npub struct PlainPrinter {}\n\nimpl PlainPrinter {\n    pub fn new() -\u003e Result\u003cSelf\u003e {\n        Ok(Self {})\n    }\n}\n\nimpl Printer for PlainPrinter {\n    fn show(\u0026self, node: \u0026crate::Node, inbound: \u0026[u32], outbound: \u0026[u32]) -\u003e Result\u003c()\u003e {\n        println!(\"[{}] {}\", node.id, node.raw_title);\n        println!(\"{}\", node.description);\n        if !inbound.is_empty() {\n            println!(\"Incoming: {:?}\", inbound);\n        }\n        if !outbound.is_empty() {\n            println!(\"Outgoing: {:?}\", outbound);\n        }\n        Ok(())\n    }\n\n    fn list(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e {\n        for line in lines {\n            println!(\"{}\", line);\n        }\n        Ok(())\n    }\n\n    fn refs(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e {\n        for line in lines {\n            println!(\"{}\", line);\n        }\n        Ok(())\n    }\n\n    fn links(\u0026self, id: u32, links: \u0026[u32]) -\u003e Result\u003c()\u003e {\n        println!(\"Node [{}] references: {:?}\", id, links);\n        Ok(())\n    }\n\n    fn search(\u0026self, lines: \u0026[String]) -\u003e Result\u003c()\u003e {\n        for line in lines {\n            println!(\"{}\", line);\n        }\n        Ok(())\n    }\n\n    fn orphans(\u0026self, orphans: \u0026[String]) -\u003e Result\u003c()\u003e {\n        if orphans.is_empty() {\n            println!(\"No orphans\");\n        } else {\n            println!(\"Orphans:\");\n            for o in orphans {\n                println!(\"{}\", o);\n            }\n        }\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn pretty_printer_smoke() -\u003e Result\u003c()\u003e {\n        let p = PrettyPrinter::new()?;\n        let node = crate::Node {\n            id: 1,\n            raw_title: \"AE: Test\".to_string(),\n            description: \"desc\".to_string(),\n            references: vec![2],\n            line_index: 0,\n        };\n        p.show(\u0026node, \u0026vec![3], \u0026node.references)?;\n        p.list(\u0026vec![\"one\".to_string(), \"two\".to_string()])?;\n        p.refs(\u0026vec![\"ref\".to_string()])?;\n        p.links(1, \u0026vec![2])?;\n        p.search(\u0026vec![\"s\".to_string()])?;\n        p.orphans(\u0026Vec::\u003cString\u003e::new())?;\n        p.orphans(\u0026vec![\"4\".to_string()])?;\n        Ok(())\n    }\n\n    #[test]\n    fn plain_printer_smoke() -\u003e Result\u003c()\u003e {\n        let p = PlainPrinter::new()?;\n        let node = crate::Node {\n            id: 1,\n            raw_title: \"AE: Test\".to_string(),\n            description: \"desc\".to_string(),\n            references: vec![2],\n            line_index: 0,\n        };\n        p.show(\u0026node, \u0026vec![3], \u0026node.references)?;\n        p.list(\u0026vec![\"one\".to_string(), \"two\".to_string()])?;\n        p.refs(\u0026vec![\"ref\".to_string()])?;\n        p.links(1, \u0026vec![2])?;\n        p.search(\u0026vec![\"s\".to_string()])?;\n        p.orphans(\u0026Vec::\u003cString\u003e::new())?;\n        p.orphans(\u0026vec![\"4\".to_string()])?;\n        Ok(())\n    }\n}\n","traces":[{"line":22,"address":[2799024,2800099,2800105],"length":1,"stats":{"Line":1}},{"line":24,"address":[2799087],"length":1,"stats":{"Line":1}},{"line":26,"address":[2799388],"length":1,"stats":{"Line":1}},{"line":29,"address":[2799534],"length":1,"stats":{"Line":1}},{"line":32,"address":[2799634],"length":1,"stats":{"Line":1}},{"line":33,"address":[2799772,2799660],"length":1,"stats":{"Line":1}},{"line":34,"address":[2799841],"length":1,"stats":{"Line":1}},{"line":38,"address":[2799737],"length":1,"stats":{"Line":1}},{"line":39,"address":[2800118,2800205],"length":1,"stats":{"Line":1}},{"line":40,"address":[2800271],"length":1,"stats":{"Line":1}},{"line":46,"address":[2798544,2798762,2798768],"length":1,"stats":{"Line":1}},{"line":47,"address":[2798592,2798608],"length":1,"stats":{"Line":2}},{"line":48,"address":[2798665,2798708],"length":1,"stats":{"Line":1}},{"line":53,"address":[2799002,2798784,2799008],"length":1,"stats":{"Line":1}},{"line":54,"address":[2798848,2798832],"length":1,"stats":{"Line":2}},{"line":55,"address":[2798905,2798948],"length":1,"stats":{"Line":1}},{"line":60,"address":[2800544,2800918,2800924],"length":1,"stats":{"Line":1}},{"line":61,"address":[2800578],"length":1,"stats":{"Line":1}},{"line":62,"address":[2800818,2800758],"length":1,"stats":{"Line":2}},{"line":66,"address":[2800944,2801168,2801162],"length":1,"stats":{"Line":1}},{"line":67,"address":[2800992,2801008],"length":1,"stats":{"Line":2}},{"line":68,"address":[5119858,5119888],"length":1,"stats":{"Line":1}},{"line":73,"address":[2801184,2801854,2801860],"length":1,"stats":{"Line":1}},{"line":75,"address":[5120035],"length":1,"stats":{"Line":1}},{"line":76,"address":[2801873,2801365],"length":1,"stats":{"Line":1}},{"line":78,"address":[5120217,5120044],"length":1,"stats":{"Line":1}},{"line":79,"address":[2801532,2801510],"length":1,"stats":{"Line":2}},{"line":80,"address":[2801794,2801613],"length":1,"stats":{"Line":1}},{"line":96,"address":[2797152],"length":1,"stats":{"Line":1}},{"line":97,"address":[2797203],"length":1,"stats":{"Line":1}},{"line":98,"address":[5116182],"length":1,"stats":{"Line":1}},{"line":99,"address":[2797451],"length":1,"stats":{"Line":1}},{"line":100,"address":[5116303],"length":1,"stats":{"Line":1}},{"line":102,"address":[2797578],"length":1,"stats":{"Line":1}},{"line":103,"address":[5116429],"length":1,"stats":{"Line":1}},{"line":108,"address":[2796672],"length":1,"stats":{"Line":1}},{"line":109,"address":[5115577,5115561],"length":1,"stats":{"Line":2}},{"line":110,"address":[2796799],"length":1,"stats":{"Line":1}},{"line":115,"address":[2796912],"length":1,"stats":{"Line":1}},{"line":116,"address":[2796969,2796985],"length":1,"stats":{"Line":2}},{"line":117,"address":[5115871],"length":1,"stats":{"Line":1}},{"line":122,"address":[2797728],"length":1,"stats":{"Line":1}},{"line":123,"address":[2797757],"length":1,"stats":{"Line":1}},{"line":127,"address":[2797920],"length":1,"stats":{"Line":1}},{"line":128,"address":[5116809,5116825],"length":1,"stats":{"Line":2}},{"line":129,"address":[2798047],"length":1,"stats":{"Line":1}},{"line":134,"address":[2798160],"length":1,"stats":{"Line":1}},{"line":135,"address":[2798227],"length":1,"stats":{"Line":1}},{"line":136,"address":[2798300],"length":1,"stats":{"Line":1}},{"line":138,"address":[2798237],"length":1,"stats":{"Line":1}},{"line":139,"address":[2798276,2798334],"length":1,"stats":{"Line":2}},{"line":140,"address":[2798407],"length":1,"stats":{"Line":1}}],"covered":52,"coverable":52}]};
    </script>
    <script crossorigin>/** @license React v16.13.1
 * react.production.min.js
 *
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */
'use strict';(function(d,r){"object"===typeof exports&&"undefined"!==typeof module?r(exports):"function"===typeof define&&define.amd?define(["exports"],r):(d=d||self,r(d.React={}))})(this,function(d){function r(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c<arguments.length;c++)b+="&args[]="+encodeURIComponent(arguments[c]);return"Minified React error #"+a+"; visit "+b+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}
function w(a,b,c){this.props=a;this.context=b;this.refs=ba;this.updater=c||ca}function da(){}function L(a,b,c){this.props=a;this.context=b;this.refs=ba;this.updater=c||ca}function ea(a,b,c){var g,e={},fa=null,d=null;if(null!=b)for(g in void 0!==b.ref&&(d=b.ref),void 0!==b.key&&(fa=""+b.key),b)ha.call(b,g)&&!ia.hasOwnProperty(g)&&(e[g]=b[g]);var h=arguments.length-2;if(1===h)e.children=c;else if(1<h){for(var k=Array(h),f=0;f<h;f++)k[f]=arguments[f+2];e.children=k}if(a&&a.defaultProps)for(g in h=a.defaultProps,
h)void 0===e[g]&&(e[g]=h[g]);return{$$typeof:x,type:a,key:fa,ref:d,props:e,_owner:M.current}}function va(a,b){return{$$typeof:x,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function N(a){return"object"===typeof a&&null!==a&&a.$$typeof===x}function wa(a){var b={"=":"=0",":":"=2"};return"$"+(""+a).replace(/[=:]/g,function(a){return b[a]})}function ja(a,b,c,g){if(C.length){var e=C.pop();e.result=a;e.keyPrefix=b;e.func=c;e.context=g;e.count=0;return e}return{result:a,keyPrefix:b,func:c,
context:g,count:0}}function ka(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>C.length&&C.push(a)}function O(a,b,c,g){var e=typeof a;if("undefined"===e||"boolean"===e)a=null;var d=!1;if(null===a)d=!0;else switch(e){case "string":case "number":d=!0;break;case "object":switch(a.$$typeof){case x:case xa:d=!0}}if(d)return c(g,a,""===b?"."+P(a,0):b),1;d=0;b=""===b?".":b+":";if(Array.isArray(a))for(var f=0;f<a.length;f++){e=a[f];var h=b+P(e,f);d+=O(e,h,c,g)}else if(null===a||
"object"!==typeof a?h=null:(h=la&&a[la]||a["@@iterator"],h="function"===typeof h?h:null),"function"===typeof h)for(a=h.call(a),f=0;!(e=a.next()).done;)e=e.value,h=b+P(e,f++),d+=O(e,h,c,g);else if("object"===e)throw c=""+a,Error(r(31,"[object Object]"===c?"object with keys {"+Object.keys(a).join(", ")+"}":c,""));return d}function Q(a,b,c){return null==a?0:O(a,"",b,c)}function P(a,b){return"object"===typeof a&&null!==a&&null!=a.key?wa(a.key):b.toString(36)}function ya(a,b,c){a.func.call(a.context,b,
a.count++)}function za(a,b,c){var g=a.result,e=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?R(a,g,c,function(a){return a}):null!=a&&(N(a)&&(a=va(a,e+(!a.key||b&&b.key===a.key?"":(""+a.key).replace(ma,"$&/")+"/")+c)),g.push(a))}function R(a,b,c,g,e){var d="";null!=c&&(d=(""+c).replace(ma,"$&/")+"/");b=ja(b,d,g,e);Q(a,za,b);ka(b)}function t(){var a=na.current;if(null===a)throw Error(r(321));return a}function S(a,b){var c=a.length;a.push(b);a:for(;;){var g=c-1>>>1,e=a[g];if(void 0!==
e&&0<D(e,b))a[g]=b,a[c]=e,c=g;else break a}}function n(a){a=a[0];return void 0===a?null:a}function E(a){var b=a[0];if(void 0!==b){var c=a.pop();if(c!==b){a[0]=c;a:for(var g=0,e=a.length;g<e;){var d=2*(g+1)-1,f=a[d],h=d+1,k=a[h];if(void 0!==f&&0>D(f,c))void 0!==k&&0>D(k,f)?(a[g]=k,a[h]=c,g=h):(a[g]=f,a[d]=c,g=d);else if(void 0!==k&&0>D(k,c))a[g]=k,a[h]=c,g=h;else break a}}return b}return null}function D(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}function F(a){for(var b=n(u);null!==
b;){if(null===b.callback)E(u);else if(b.startTime<=a)E(u),b.sortIndex=b.expirationTime,S(p,b);else break;b=n(u)}}function T(a){y=!1;F(a);if(!v)if(null!==n(p))v=!0,z(U);else{var b=n(u);null!==b&&G(T,b.startTime-a)}}function U(a,b){v=!1;y&&(y=!1,V());H=!0;var c=m;try{F(b);for(l=n(p);null!==l&&(!(l.expirationTime>b)||a&&!W());){var g=l.callback;if(null!==g){l.callback=null;m=l.priorityLevel;var e=g(l.expirationTime<=b);b=q();"function"===typeof e?l.callback=e:l===n(p)&&E(p);F(b)}else E(p);l=n(p)}if(null!==
l)var d=!0;else{var f=n(u);null!==f&&G(T,f.startTime-b);d=!1}return d}finally{l=null,m=c,H=!1}}function oa(a){switch(a){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1E4;default:return 5E3}}var f="function"===typeof Symbol&&Symbol.for,x=f?Symbol.for("react.element"):60103,xa=f?Symbol.for("react.portal"):60106,Aa=f?Symbol.for("react.fragment"):60107,Ba=f?Symbol.for("react.strict_mode"):60108,Ca=f?Symbol.for("react.profiler"):60114,Da=f?Symbol.for("react.provider"):60109,
Ea=f?Symbol.for("react.context"):60110,Fa=f?Symbol.for("react.forward_ref"):60112,Ga=f?Symbol.for("react.suspense"):60113,Ha=f?Symbol.for("react.memo"):60115,Ia=f?Symbol.for("react.lazy"):60116,la="function"===typeof Symbol&&Symbol.iterator,pa=Object.getOwnPropertySymbols,Ja=Object.prototype.hasOwnProperty,Ka=Object.prototype.propertyIsEnumerable,I=function(){try{if(!Object.assign)return!1;var a=new String("abc");a[5]="de";if("5"===Object.getOwnPropertyNames(a)[0])return!1;var b={};for(a=0;10>a;a++)b["_"+
String.fromCharCode(a)]=a;if("0123456789"!==Object.getOwnPropertyNames(b).map(function(a){return b[a]}).join(""))return!1;var c={};"abcdefghijklmnopqrst".split("").forEach(function(a){c[a]=a});return"abcdefghijklmnopqrst"!==Object.keys(Object.assign({},c)).join("")?!1:!0}catch(g){return!1}}()?Object.assign:function(a,b){if(null===a||void 0===a)throw new TypeError("Object.assign cannot be called with null or undefined");var c=Object(a);for(var g,e=1;e<arguments.length;e++){var d=Object(arguments[e]);
for(var f in d)Ja.call(d,f)&&(c[f]=d[f]);if(pa){g=pa(d);for(var h=0;h<g.length;h++)Ka.call(d,g[h])&&(c[g[h]]=d[g[h]])}}return c},ca={isMounted:function(a){return!1},enqueueForceUpdate:function(a,b,c){},enqueueReplaceState:function(a,b,c,d){},enqueueSetState:function(a,b,c,d){}},ba={};w.prototype.isReactComponent={};w.prototype.setState=function(a,b){if("object"!==typeof a&&"function"!==typeof a&&null!=a)throw Error(r(85));this.updater.enqueueSetState(this,a,b,"setState")};w.prototype.forceUpdate=
function(a){this.updater.enqueueForceUpdate(this,a,"forceUpdate")};da.prototype=w.prototype;f=L.prototype=new da;f.constructor=L;I(f,w.prototype);f.isPureReactComponent=!0;var M={current:null},ha=Object.prototype.hasOwnProperty,ia={key:!0,ref:!0,__self:!0,__source:!0},ma=/\/+/g,C=[],na={current:null},X;if("undefined"===typeof window||"function"!==typeof MessageChannel){var A=null,qa=null,ra=function(){if(null!==A)try{var a=q();A(!0,a);A=null}catch(b){throw setTimeout(ra,0),b;}},La=Date.now();var q=
function(){return Date.now()-La};var z=function(a){null!==A?setTimeout(z,0,a):(A=a,setTimeout(ra,0))};var G=function(a,b){qa=setTimeout(a,b)};var V=function(){clearTimeout(qa)};var W=function(){return!1};f=X=function(){}}else{var Y=window.performance,sa=window.Date,Ma=window.setTimeout,Na=window.clearTimeout;"undefined"!==typeof console&&(f=window.cancelAnimationFrame,"function"!==typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),
"function"!==typeof f&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"));if("object"===typeof Y&&"function"===typeof Y.now)q=function(){return Y.now()};else{var Oa=sa.now();q=function(){return sa.now()-Oa}}var J=!1,K=null,Z=-1,ta=5,ua=0;W=function(){return q()>=ua};f=function(){};X=function(a){0>a||125<a?console.error("forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported"):
ta=0<a?Math.floor(1E3/a):5};var B=new MessageChannel,aa=B.port2;B.port1.onmessage=function(){if(null!==K){var a=q();ua=a+ta;try{K(!0,a)?aa.postMessage(null):(J=!1,K=null)}catch(b){throw aa.postMessage(null),b;}}else J=!1};z=function(a){K=a;J||(J=!0,aa.postMessage(null))};G=function(a,b){Z=Ma(function(){a(q())},b)};V=function(){Na(Z);Z=-1}}var p=[],u=[],Pa=1,l=null,m=3,H=!1,v=!1,y=!1,Qa=0;B={ReactCurrentDispatcher:na,ReactCurrentOwner:M,IsSomeRendererActing:{current:!1},assign:I};I(B,{Scheduler:{__proto__:null,
unstable_ImmediatePriority:1,unstable_UserBlockingPriority:2,unstable_NormalPriority:3,unstable_IdlePriority:5,unstable_LowPriority:4,unstable_runWithPriority:function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=m;m=a;try{return b()}finally{m=c}},unstable_next:function(a){switch(m){case 1:case 2:case 3:var b=3;break;default:b=m}var c=m;m=b;try{return a()}finally{m=c}},unstable_scheduleCallback:function(a,b,c){var d=q();if("object"===typeof c&&null!==c){var e=c.delay;
e="number"===typeof e&&0<e?d+e:d;c="number"===typeof c.timeout?c.timeout:oa(a)}else c=oa(a),e=d;c=e+c;a={id:Pa++,callback:b,priorityLevel:a,startTime:e,expirationTime:c,sortIndex:-1};e>d?(a.sortIndex=e,S(u,a),null===n(p)&&a===n(u)&&(y?V():y=!0,G(T,e-d))):(a.sortIndex=c,S(p,a),v||H||(v=!0,z(U)));return a},unstable_cancelCallback:function(a){a.callback=null},unstable_wrapCallback:function(a){var b=m;return function(){var c=m;m=b;try{return a.apply(this,arguments)}finally{m=c}}},unstable_getCurrentPriorityLevel:function(){return m},
unstable_shouldYield:function(){var a=q();F(a);var b=n(p);return b!==l&&null!==l&&null!==b&&null!==b.callback&&b.startTime<=a&&b.expirationTime<l.expirationTime||W()},unstable_requestPaint:f,unstable_continueExecution:function(){v||H||(v=!0,z(U))},unstable_pauseExecution:function(){},unstable_getFirstCallbackNode:function(){return n(p)},get unstable_now(){return q},get unstable_forceFrameRate(){return X},unstable_Profiling:null},SchedulerTracing:{__proto__:null,__interactionsRef:null,__subscriberRef:null,
unstable_clear:function(a){return a()},unstable_getCurrent:function(){return null},unstable_getThreadID:function(){return++Qa},unstable_trace:function(a,b,c){return c()},unstable_wrap:function(a){return a},unstable_subscribe:function(a){},unstable_unsubscribe:function(a){}}});d.Children={map:function(a,b,c){if(null==a)return a;var d=[];R(a,d,null,b,c);return d},forEach:function(a,b,c){if(null==a)return a;b=ja(null,null,b,c);Q(a,ya,b);ka(b)},count:function(a){return Q(a,function(){return null},null)},
toArray:function(a){var b=[];R(a,b,null,function(a){return a});return b},only:function(a){if(!N(a))throw Error(r(143));return a}};d.Component=w;d.Fragment=Aa;d.Profiler=Ca;d.PureComponent=L;d.StrictMode=Ba;d.Suspense=Ga;d.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=B;d.cloneElement=function(a,b,c){if(null===a||void 0===a)throw Error(r(267,a));var d=I({},a.props),e=a.key,f=a.ref,m=a._owner;if(null!=b){void 0!==b.ref&&(f=b.ref,m=M.current);void 0!==b.key&&(e=""+b.key);if(a.type&&a.type.defaultProps)var h=
a.type.defaultProps;for(k in b)ha.call(b,k)&&!ia.hasOwnProperty(k)&&(d[k]=void 0===b[k]&&void 0!==h?h[k]:b[k])}var k=arguments.length-2;if(1===k)d.children=c;else if(1<k){h=Array(k);for(var l=0;l<k;l++)h[l]=arguments[l+2];d.children=h}return{$$typeof:x,type:a.type,key:e,ref:f,props:d,_owner:m}};d.createContext=function(a,b){void 0===b&&(b=null);a={$$typeof:Ea,_calculateChangedBits:b,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null};a.Provider={$$typeof:Da,_context:a};return a.Consumer=
a};d.createElement=ea;d.createFactory=function(a){var b=ea.bind(null,a);b.type=a;return b};d.createRef=function(){return{current:null}};d.forwardRef=function(a){return{$$typeof:Fa,render:a}};d.isValidElement=N;d.lazy=function(a){return{$$typeof:Ia,_ctor:a,_status:-1,_result:null}};d.memo=function(a,b){return{$$typeof:Ha,type:a,compare:void 0===b?null:b}};d.useCallback=function(a,b){return t().useCallback(a,b)};d.useContext=function(a,b){return t().useContext(a,b)};d.useDebugValue=function(a,b){};
d.useEffect=function(a,b){return t().useEffect(a,b)};d.useImperativeHandle=function(a,b,c){return t().useImperativeHandle(a,b,c)};d.useLayoutEffect=function(a,b){return t().useLayoutEffect(a,b)};d.useMemo=function(a,b){return t().useMemo(a,b)};d.useReducer=function(a,b,c){return t().useReducer(a,b,c)};d.useRef=function(a){return t().useRef(a)};d.useState=function(a){return t().useState(a)};d.version="16.13.1"});
</script>
    <script crossorigin>/** @license React v16.13.1
 * react-dom.production.min.js
 *
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */
/*
 Modernizr 3.0.0pre (Custom Build) | MIT
*/
'use strict';(function(I,ea){"object"===typeof exports&&"undefined"!==typeof module?ea(exports,require("react")):"function"===typeof define&&define.amd?define(["exports","react"],ea):(I=I||self,ea(I.ReactDOM={},I.React))})(this,function(I,ea){function k(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c<arguments.length;c++)b+="&args[]="+encodeURIComponent(arguments[c]);return"Minified React error #"+a+"; visit "+b+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}
function ji(a,b,c,d,e,f,g,h,m){yb=!1;gc=null;ki.apply(li,arguments)}function mi(a,b,c,d,e,f,g,h,m){ji.apply(this,arguments);if(yb){if(yb){var n=gc;yb=!1;gc=null}else throw Error(k(198));hc||(hc=!0,pd=n)}}function lf(a,b,c){var d=a.type||"unknown-event";a.currentTarget=mf(c);mi(d,b,void 0,a);a.currentTarget=null}function nf(){if(ic)for(var a in cb){var b=cb[a],c=ic.indexOf(a);if(!(-1<c))throw Error(k(96,a));if(!jc[c]){if(!b.extractEvents)throw Error(k(97,a));jc[c]=b;c=b.eventTypes;for(var d in c){var e=
void 0;var f=c[d],g=b,h=d;if(qd.hasOwnProperty(h))throw Error(k(99,h));qd[h]=f;var m=f.phasedRegistrationNames;if(m){for(e in m)m.hasOwnProperty(e)&&of(m[e],g,h);e=!0}else f.registrationName?(of(f.registrationName,g,h),e=!0):e=!1;if(!e)throw Error(k(98,d,a));}}}}function of(a,b,c){if(db[a])throw Error(k(100,a));db[a]=b;rd[a]=b.eventTypes[c].dependencies}function pf(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];if(!cb.hasOwnProperty(c)||cb[c]!==d){if(cb[c])throw Error(k(102,c));cb[c]=
d;b=!0}}b&&nf()}function qf(a){if(a=rf(a)){if("function"!==typeof sd)throw Error(k(280));var b=a.stateNode;b&&(b=td(b),sd(a.stateNode,a.type,b))}}function sf(a){eb?fb?fb.push(a):fb=[a]:eb=a}function tf(){if(eb){var a=eb,b=fb;fb=eb=null;qf(a);if(b)for(a=0;a<b.length;a++)qf(b[a])}}function ud(){if(null!==eb||null!==fb)vd(),tf()}function uf(a,b,c){if(wd)return a(b,c);wd=!0;try{return vf(a,b,c)}finally{wd=!1,ud()}}function ni(a){if(wf.call(xf,a))return!0;if(wf.call(yf,a))return!1;if(oi.test(a))return xf[a]=
!0;yf[a]=!0;return!1}function pi(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case "function":case "symbol":return!0;case "boolean":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return"data-"!==a&&"aria-"!==a;default:return!1}}function qi(a,b,c,d){if(null===b||"undefined"===typeof b||pi(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function L(a,
b,c,d,e,f){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f}function xd(a,b,c,d){var e=E.hasOwnProperty(b)?E[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||"o"!==b[0]&&"O"!==b[0]||"n"!==b[1]&&"N"!==b[1]?!1:!0;f||(qi(b,c,e,d)&&(c=null),d||null===e?ni(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,""+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:"":c:(b=e.attributeName,
d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?"":""+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}function zb(a){if(null===a||"object"!==typeof a)return null;a=zf&&a[zf]||a["@@iterator"];return"function"===typeof a?a:null}function ri(a){if(-1===a._status){a._status=0;var b=a._ctor;b=b();a._result=b;b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=2,a._result=b)})}}function na(a){if(null==a)return null;
if("function"===typeof a)return a.displayName||a.name||null;if("string"===typeof a)return a;switch(a){case Ma:return"Fragment";case gb:return"Portal";case kc:return"Profiler";case Af:return"StrictMode";case lc:return"Suspense";case yd:return"SuspenseList"}if("object"===typeof a)switch(a.$$typeof){case Bf:return"Context.Consumer";case Cf:return"Context.Provider";case zd:var b=a.render;b=b.displayName||b.name||"";return a.displayName||(""!==b?"ForwardRef("+b+")":"ForwardRef");case Ad:return na(a.type);
case Df:return na(a.render);case Ef:if(a=1===a._status?a._result:null)return na(a)}return null}function Bd(a){var b="";do{a:switch(a.tag){case 3:case 4:case 6:case 7:case 10:case 9:var c="";break a;default:var d=a._debugOwner,e=a._debugSource,f=na(a.type);c=null;d&&(c=na(d.type));d=f;f="";e?f=" (at "+e.fileName.replace(si,"")+":"+e.lineNumber+")":c&&(f=" (created by "+c+")");c="\n    in "+(d||"Unknown")+f}b+=c;a=a.return}while(a);return b}function va(a){switch(typeof a){case "boolean":case "number":case "object":case "string":case "undefined":return a;
default:return""}}function Ff(a){var b=a.type;return(a=a.nodeName)&&"input"===a.toLowerCase()&&("checkbox"===b||"radio"===b)}function ti(a){var b=Ff(a)?"checked":"value",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=""+a[b];if(!a.hasOwnProperty(b)&&"undefined"!==typeof c&&"function"===typeof c.get&&"function"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=""+a;f.call(this,a)}});Object.defineProperty(a,
b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=""+a},stopTracking:function(){a._valueTracker=null;delete a[b]}}}}function mc(a){a._valueTracker||(a._valueTracker=ti(a))}function Gf(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d="";a&&(d=Ff(a)?a.checked?"true":"false":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Cd(a,b){var c=b.checked;return M({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=
c?c:a._wrapperState.initialChecked})}function Hf(a,b){var c=null==b.defaultValue?"":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=va(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:"checkbox"===b.type||"radio"===b.type?null!=b.checked:null!=b.value}}function If(a,b){b=b.checked;null!=b&&xd(a,"checked",b,!1)}function Dd(a,b){If(a,b);var c=va(b.value),d=b.type;if(null!=c)if("number"===d){if(0===c&&""===a.value||a.value!=c)a.value=""+c}else a.value!==
""+c&&(a.value=""+c);else if("submit"===d||"reset"===d){a.removeAttribute("value");return}b.hasOwnProperty("value")?Ed(a,b.type,c):b.hasOwnProperty("defaultValue")&&Ed(a,b.type,va(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}function Jf(a,b,c){if(b.hasOwnProperty("value")||b.hasOwnProperty("defaultValue")){var d=b.type;if(!("submit"!==d&&"reset"!==d||void 0!==b.value&&null!==b.value))return;b=""+a._wrapperState.initialValue;c||b===a.value||(a.value=
b);a.defaultValue=b}c=a.name;""!==c&&(a.name="");a.defaultChecked=!!a._wrapperState.initialChecked;""!==c&&(a.name=c)}function Ed(a,b,c){if("number"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=""+a._wrapperState.initialValue:a.defaultValue!==""+c&&(a.defaultValue=""+c)}function ui(a){var b="";ea.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}function Fd(a,b){a=M({children:void 0},b);if(b=ui(b.children))a.children=b;return a}function hb(a,b,c,d){a=a.options;if(b){b={};
for(var e=0;e<c.length;e++)b["$"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty("$"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=""+va(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}function Gd(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(k(91));return M({},b,{value:void 0,defaultValue:void 0,children:""+a._wrapperState.initialValue})}
function Kf(a,b){var c=b.value;if(null==c){c=b.children;b=b.defaultValue;if(null!=c){if(null!=b)throw Error(k(92));if(Array.isArray(c)){if(!(1>=c.length))throw Error(k(93));c=c[0]}b=c}null==b&&(b="");c=b}a._wrapperState={initialValue:va(c)}}function Lf(a,b){var c=va(b.value),d=va(b.defaultValue);null!=c&&(c=""+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=""+d)}function Mf(a,b){b=a.textContent;b===a._wrapperState.initialValue&&""!==
b&&null!==b&&(a.value=b)}function Nf(a){switch(a){case "svg":return"http://www.w3.org/2000/svg";case "math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function Hd(a,b){return null==a||"http://www.w3.org/1999/xhtml"===a?Nf(b):"http://www.w3.org/2000/svg"===a&&"foreignObject"===b?"http://www.w3.org/1999/xhtml":a}function nc(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c["Webkit"+a]="webkit"+b;c["Moz"+a]="moz"+b;return c}function oc(a){if(Id[a])return Id[a];
if(!ib[a])return a;var b=ib[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Of)return Id[a]=b[c];return a}function Jd(a){var b=Pf.get(a);void 0===b&&(b=new Map,Pf.set(a,b));return b}function Na(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.effectTag&1026)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function Qf(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function Rf(a){if(Na(a)!==
a)throw Error(k(188));}function vi(a){var b=a.alternate;if(!b){b=Na(a);if(null===b)throw Error(k(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return Rf(e),a;if(f===d)return Rf(e),b;f=f.sibling}throw Error(k(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=
f.child;h;){if(h===c){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(k(189));}}if(c.alternate!==d)throw Error(k(190));}if(3!==c.tag)throw Error(k(188));return c.stateNode.current===c?a:b}function Sf(a){a=vi(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}}return null}function jb(a,b){if(null==
b)throw Error(k(30));if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]}function Kd(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}function pc(a){null!==a&&(Ab=jb(Ab,a));a=Ab;Ab=null;if(a){Kd(a,wi);if(Ab)throw Error(k(95));if(hc)throw a=pd,hc=!1,pd=null,a;}}function Ld(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:
a}function Tf(a){if(!wa)return!1;a="on"+a;var b=a in document;b||(b=document.createElement("div"),b.setAttribute(a,"return;"),b="function"===typeof b[a]);return b}function Uf(a){a.topLevelType=null;a.nativeEvent=null;a.targetInst=null;a.ancestors.length=0;10>qc.length&&qc.push(a)}function Vf(a,b,c,d){if(qc.length){var e=qc.pop();e.topLevelType=a;e.eventSystemFlags=d;e.nativeEvent=b;e.targetInst=c;return e}return{topLevelType:a,eventSystemFlags:d,nativeEvent:b,targetInst:c,ancestors:[]}}function Wf(a){var b=
a.targetInst,c=b;do{if(!c){a.ancestors.push(c);break}var d=c;if(3===d.tag)d=d.stateNode.containerInfo;else{for(;d.return;)d=d.return;d=3!==d.tag?null:d.stateNode.containerInfo}if(!d)break;b=c.tag;5!==b&&6!==b||a.ancestors.push(c);c=Bb(d)}while(c);for(c=0;c<a.ancestors.length;c++){b=a.ancestors[c];var e=Ld(a.nativeEvent);d=a.topLevelType;var f=a.nativeEvent,g=a.eventSystemFlags;0===c&&(g|=64);for(var h=null,m=0;m<jc.length;m++){var n=jc[m];n&&(n=n.extractEvents(d,b,f,e,g))&&(h=jb(h,n))}pc(h)}}function Md(a,
b,c){if(!c.has(a)){switch(a){case "scroll":Cb(b,"scroll",!0);break;case "focus":case "blur":Cb(b,"focus",!0);Cb(b,"blur",!0);c.set("blur",null);c.set("focus",null);break;case "cancel":case "close":Tf(a)&&Cb(b,a,!0);break;case "invalid":case "submit":case "reset":break;default:-1===Db.indexOf(a)&&w(a,b)}c.set(a,null)}}function xi(a,b){var c=Jd(b);Nd.forEach(function(a){Md(a,b,c)});yi.forEach(function(a){Md(a,b,c)})}function Od(a,b,c,d,e){return{blockedOn:a,topLevelType:b,eventSystemFlags:c|32,nativeEvent:e,
container:d}}function Xf(a,b){switch(a){case "focus":case "blur":xa=null;break;case "dragenter":case "dragleave":ya=null;break;case "mouseover":case "mouseout":za=null;break;case "pointerover":case "pointerout":Eb.delete(b.pointerId);break;case "gotpointercapture":case "lostpointercapture":Fb.delete(b.pointerId)}}function Gb(a,b,c,d,e,f){if(null===a||a.nativeEvent!==f)return a=Od(b,c,d,e,f),null!==b&&(b=Hb(b),null!==b&&Yf(b)),a;a.eventSystemFlags|=d;return a}function zi(a,b,c,d,e){switch(b){case "focus":return xa=
Gb(xa,a,b,c,d,e),!0;case "dragenter":return ya=Gb(ya,a,b,c,d,e),!0;case "mouseover":return za=Gb(za,a,b,c,d,e),!0;case "pointerover":var f=e.pointerId;Eb.set(f,Gb(Eb.get(f)||null,a,b,c,d,e));return!0;case "gotpointercapture":return f=e.pointerId,Fb.set(f,Gb(Fb.get(f)||null,a,b,c,d,e)),!0}return!1}function Ai(a){var b=Bb(a.target);if(null!==b){var c=Na(b);if(null!==c)if(b=c.tag,13===b){if(b=Qf(c),null!==b){a.blockedOn=b;Pd(a.priority,function(){Bi(c)});return}}else if(3===b&&c.stateNode.hydrate){a.blockedOn=
3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}function rc(a){if(null!==a.blockedOn)return!1;var b=Qd(a.topLevelType,a.eventSystemFlags,a.container,a.nativeEvent);if(null!==b){var c=Hb(b);null!==c&&Yf(c);a.blockedOn=b;return!1}return!0}function Zf(a,b,c){rc(a)&&c.delete(b)}function Ci(){for(Rd=!1;0<fa.length;){var a=fa[0];if(null!==a.blockedOn){a=Hb(a.blockedOn);null!==a&&Di(a);break}var b=Qd(a.topLevelType,a.eventSystemFlags,a.container,a.nativeEvent);null!==b?a.blockedOn=b:fa.shift()}null!==
xa&&rc(xa)&&(xa=null);null!==ya&&rc(ya)&&(ya=null);null!==za&&rc(za)&&(za=null);Eb.forEach(Zf);Fb.forEach(Zf)}function Ib(a,b){a.blockedOn===b&&(a.blockedOn=null,Rd||(Rd=!0,$f(ag,Ci)))}function bg(a){if(0<fa.length){Ib(fa[0],a);for(var b=1;b<fa.length;b++){var c=fa[b];c.blockedOn===a&&(c.blockedOn=null)}}null!==xa&&Ib(xa,a);null!==ya&&Ib(ya,a);null!==za&&Ib(za,a);b=function(b){return Ib(b,a)};Eb.forEach(b);Fb.forEach(b);for(b=0;b<Jb.length;b++)c=Jb[b],c.blockedOn===a&&(c.blockedOn=null);for(;0<Jb.length&&
(b=Jb[0],null===b.blockedOn);)Ai(b),null===b.blockedOn&&Jb.shift()}function Sd(a,b){for(var c=0;c<a.length;c+=2){var d=a[c],e=a[c+1],f="on"+(e[0].toUpperCase()+e.slice(1));f={phasedRegistrationNames:{bubbled:f,captured:f+"Capture"},dependencies:[d],eventPriority:b};Td.set(d,b);cg.set(d,f);dg[e]=f}}function w(a,b){Cb(b,a,!1)}function Cb(a,b,c){var d=Td.get(b);switch(void 0===d?2:d){case 0:d=Ei.bind(null,b,1,a);break;case 1:d=Fi.bind(null,b,1,a);break;default:d=sc.bind(null,b,1,a)}c?a.addEventListener(b,
d,!0):a.addEventListener(b,d,!1)}function Ei(a,b,c,d){Oa||vd();var e=sc,f=Oa;Oa=!0;try{eg(e,a,b,c,d)}finally{(Oa=f)||ud()}}function Fi(a,b,c,d){Gi(Hi,sc.bind(null,a,b,c,d))}function sc(a,b,c,d){if(tc)if(0<fa.length&&-1<Nd.indexOf(a))a=Od(null,a,b,c,d),fa.push(a);else{var e=Qd(a,b,c,d);if(null===e)Xf(a,d);else if(-1<Nd.indexOf(a))a=Od(e,a,b,c,d),fa.push(a);else if(!zi(e,a,b,c,d)){Xf(a,d);a=Vf(a,d,null,b);try{uf(Wf,a)}finally{Uf(a)}}}}function Qd(a,b,c,d){c=Ld(d);c=Bb(c);if(null!==c){var e=Na(c);if(null===
e)c=null;else{var f=e.tag;if(13===f){c=Qf(e);if(null!==c)return c;c=null}else if(3===f){if(e.stateNode.hydrate)return 3===e.tag?e.stateNode.containerInfo:null;c=null}else e!==c&&(c=null)}}a=Vf(a,d,c,b);try{uf(Wf,a)}finally{Uf(a)}return null}function fg(a,b,c){return null==b||"boolean"===typeof b||""===b?"":c||"number"!==typeof b||0===b||Kb.hasOwnProperty(a)&&Kb[a]?(""+b).trim():b+"px"}function gg(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf("--"),e=fg(c,b[c],d);"float"===
c&&(c="cssFloat");d?a.setProperty(c,e):a[c]=e}}function Ud(a,b){if(b){if(Ii[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(k(137,a,""));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(k(60));if(!("object"===typeof b.dangerouslySetInnerHTML&&"__html"in b.dangerouslySetInnerHTML))throw Error(k(61));}if(null!=b.style&&"object"!==typeof b.style)throw Error(k(62,""));}}function Vd(a,b){if(-1===a.indexOf("-"))return"string"===typeof b.is;switch(a){case "annotation-xml":case "color-profile":case "font-face":case "font-face-src":case "font-face-uri":case "font-face-format":case "font-face-name":case "missing-glyph":return!1;
default:return!0}}function oa(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=Jd(a);b=rd[b];for(var d=0;d<b.length;d++)Md(b[d],a,c)}function uc(){}function Wd(a){a=a||("undefined"!==typeof document?document:void 0);if("undefined"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function hg(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function ig(a,b){var c=hg(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,
offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=hg(c)}}function jg(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?jg(a,b.parentNode):"contains"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}function kg(){for(var a=window,b=Wd();b instanceof a.HTMLIFrameElement;){try{var c="string"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Wd(a.document)}return b}
function Xd(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&("input"===b&&("text"===a.type||"search"===a.type||"tel"===a.type||"url"===a.type||"password"===a.type)||"textarea"===b||"true"===a.contentEditable)}function lg(a,b){switch(a){case "button":case "input":case "select":case "textarea":return!!b.autoFocus}return!1}function Yd(a,b){return"textarea"===a||"option"===a||"noscript"===a||"string"===typeof b.children||"number"===typeof b.children||"object"===typeof b.dangerouslySetInnerHTML&&
null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}function kb(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break}return a}function mg(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(c===ng||c===Zd||c===$d){if(0===b)return a;b--}else c===og&&b++}a=a.previousSibling}return null}function Bb(a){var b=a[Aa];if(b)return b;for(var c=a.parentNode;c;){if(b=c[Lb]||c[Aa]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=mg(a);null!==
a;){if(c=a[Aa])return c;a=mg(a)}return b}a=c;c=a.parentNode}return null}function Hb(a){a=a[Aa]||a[Lb];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function Pa(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(k(33));}function ae(a){return a[vc]||null}function pa(a){do a=a.return;while(a&&5!==a.tag);return a?a:null}function pg(a,b){var c=a.stateNode;if(!c)return null;var d=td(c);if(!d)return null;c=d[b];a:switch(b){case "onClick":case "onClickCapture":case "onDoubleClick":case "onDoubleClickCapture":case "onMouseDown":case "onMouseDownCapture":case "onMouseMove":case "onMouseMoveCapture":case "onMouseUp":case "onMouseUpCapture":case "onMouseEnter":(d=
!d.disabled)||(a=a.type,d=!("button"===a||"input"===a||"select"===a||"textarea"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&"function"!==typeof c)throw Error(k(231,b,typeof c));return c}function qg(a,b,c){if(b=pg(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=jb(c._dispatchListeners,b),c._dispatchInstances=jb(c._dispatchInstances,a)}function Ji(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=pa(b);for(b=c.length;0<b--;)qg(c[b],
"captured",a);for(b=0;b<c.length;b++)qg(c[b],"bubbled",a)}}function be(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=pg(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=jb(c._dispatchListeners,b),c._dispatchInstances=jb(c._dispatchInstances,a))}function Ki(a){a&&a.dispatchConfig.registrationName&&be(a._targetInst,null,a)}function lb(a){Kd(a,Ji)}function rg(){if(wc)return wc;var a,b=ce,c=b.length,d,e="value"in Ba?Ba.value:Ba.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=
c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return wc=e.slice(a,1<d?1-d:void 0)}function xc(){return!0}function yc(){return!1}function R(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):"target"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?xc:yc;this.isPropagationStopped=yc;return this}function Li(a,b,c,d){if(this.eventPool.length){var e=
this.eventPool.pop();this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}function Mi(a){if(!(a instanceof this))throw Error(k(279));a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}function sg(a){a.eventPool=[];a.getPooled=Li;a.release=Mi}function tg(a,b){switch(a){case "keyup":return-1!==Ni.indexOf(b.keyCode);case "keydown":return 229!==b.keyCode;case "keypress":case "mousedown":case "blur":return!0;default:return!1}}function ug(a){a=a.detail;return"object"===typeof a&&"data"in
a?a.data:null}function Oi(a,b){switch(a){case "compositionend":return ug(b);case "keypress":if(32!==b.which)return null;vg=!0;return wg;case "textInput":return a=b.data,a===wg&&vg?null:a;default:return null}}function Pi(a,b){if(mb)return"compositionend"===a||!de&&tg(a,b)?(a=rg(),wc=ce=Ba=null,mb=!1,a):null;switch(a){case "paste":return null;case "keypress":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;
case "compositionend":return xg&&"ko"!==b.locale?null:b.data;default:return null}}function yg(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return"input"===b?!!Qi[a.type]:"textarea"===b?!0:!1}function zg(a,b,c){a=R.getPooled(Ag.change,a,b,c);a.type="change";sf(c);lb(a);return a}function Ri(a){pc(a)}function zc(a){var b=Pa(a);if(Gf(b))return a}function Si(a,b){if("change"===a)return b}function Bg(){Mb&&(Mb.detachEvent("onpropertychange",Cg),Nb=Mb=null)}function Cg(a){if("value"===a.propertyName&&
zc(Nb))if(a=zg(Nb,a,Ld(a)),Oa)pc(a);else{Oa=!0;try{ee(Ri,a)}finally{Oa=!1,ud()}}}function Ti(a,b,c){"focus"===a?(Bg(),Mb=b,Nb=c,Mb.attachEvent("onpropertychange",Cg)):"blur"===a&&Bg()}function Ui(a,b){if("selectionchange"===a||"keyup"===a||"keydown"===a)return zc(Nb)}function Vi(a,b){if("click"===a)return zc(b)}function Wi(a,b){if("input"===a||"change"===a)return zc(b)}function Xi(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Yi[a])?!!b[a]:!1}function fe(a){return Xi}
function Zi(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}function Ob(a,b){if(Qa(a,b))return!0;if("object"!==typeof a||null===a||"object"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!$i.call(b,c[d])||!Qa(a[c[d]],b[c[d]]))return!1;return!0}function Dg(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;if(ge||null==nb||nb!==Wd(c))return null;c=nb;"selectionStart"in c&&Xd(c)?c={start:c.selectionStart,
end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return Pb&&Ob(Pb,c)?null:(Pb=c,a=R.getPooled(Eg.select,he,a,b),a.type="select",a.target=nb,lb(a),a)}function Ac(a){var b=a.keyCode;"charCode"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}function q(a,b){0>ob||(a.current=ie[ob],ie[ob]=null,ob--)}function y(a,b,c){ob++;
ie[ob]=a.current;a.current=b}function pb(a,b){var c=a.type.contextTypes;if(!c)return Ca;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function N(a){a=a.childContextTypes;return null!==a&&void 0!==a}function Fg(a,b,c){if(B.current!==Ca)throw Error(k(168));y(B,b);y(G,c)}
function Gg(a,b,c){var d=a.stateNode;a=b.childContextTypes;if("function"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw Error(k(108,na(b)||"Unknown",e));return M({},c,{},d)}function Bc(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Ca;Ra=B.current;y(B,a);y(G,G.current);return!0}function Hg(a,b,c){var d=a.stateNode;if(!d)throw Error(k(169));c?(a=Gg(a,b,Ra),d.__reactInternalMemoizedMergedChildContext=a,q(G),q(B),y(B,a)):q(G);y(G,c)}function Cc(){switch(aj()){case Dc:return 99;
case Ig:return 98;case Jg:return 97;case Kg:return 96;case Lg:return 95;default:throw Error(k(332));}}function Mg(a){switch(a){case 99:return Dc;case 98:return Ig;case 97:return Jg;case 96:return Kg;case 95:return Lg;default:throw Error(k(332));}}function Da(a,b){a=Mg(a);return bj(a,b)}function Ng(a,b,c){a=Mg(a);return je(a,b,c)}function Og(a){null===qa?(qa=[a],Ec=je(Dc,Pg)):qa.push(a);return Qg}function ha(){if(null!==Ec){var a=Ec;Ec=null;Rg(a)}Pg()}function Pg(){if(!ke&&null!==qa){ke=!0;var a=0;
try{var b=qa;Da(99,function(){for(;a<b.length;a++){var c=b[a];do c=c(!0);while(null!==c)}});qa=null}catch(c){throw null!==qa&&(qa=qa.slice(a+1)),je(Dc,ha),c;}finally{ke=!1}}}function Fc(a,b,c){c/=10;return 1073741821-(((1073741821-a+b/10)/c|0)+1)*c}function aa(a,b){if(a&&a.defaultProps){b=M({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}function le(){Gc=qb=Hc=null}function me(a){var b=Ic.current;q(Ic);a.type._context._currentValue=b}function Sg(a,b){for(;null!==a;){var c=
a.alternate;if(a.childExpirationTime<b)a.childExpirationTime=b,null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);else if(null!==c&&c.childExpirationTime<b)c.childExpirationTime=b;else break;a=a.return}}function rb(a,b){Hc=a;Gc=qb=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(a.expirationTime>=b&&(ia=!0),a.firstContext=null)}function W(a,b){if(Gc!==a&&!1!==b&&0!==b){if("number"!==typeof b||1073741823===b)Gc=a,b=1073741823;b={context:a,observedBits:b,next:null};if(null===qb){if(null===
Hc)throw Error(k(308));qb=b;Hc.dependencies={expirationTime:0,firstContext:b,responders:null}}else qb=qb.next=b}return a._currentValue}function ne(a){a.updateQueue={baseState:a.memoizedState,baseQueue:null,shared:{pending:null},effects:null}}function oe(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,baseQueue:a.baseQueue,shared:a.shared,effects:a.effects})}function Ea(a,b){a={expirationTime:a,suspenseConfig:b,tag:Tg,payload:null,callback:null,next:null};return a.next=
a}function Fa(a,b){a=a.updateQueue;if(null!==a){a=a.shared;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}}function Ug(a,b){var c=a.alternate;null!==c&&oe(c,a);a=a.updateQueue;c=a.baseQueue;null===c?(a.baseQueue=b.next=b,b.next=b):(b.next=c.next,c.next=b)}function Qb(a,b,c,d){var e=a.updateQueue;Ga=!1;var f=e.baseQueue,g=e.shared.pending;if(null!==g){if(null!==f){var h=f.next;f.next=g.next;g.next=h}f=g;e.shared.pending=null;h=a.alternate;null!==h&&(h=h.updateQueue,null!==h&&
(h.baseQueue=g))}if(null!==f){h=f.next;var m=e.baseState,n=0,k=null,ba=null,l=null;if(null!==h){var p=h;do{g=p.expirationTime;if(g<d){var t={expirationTime:p.expirationTime,suspenseConfig:p.suspenseConfig,tag:p.tag,payload:p.payload,callback:p.callback,next:null};null===l?(ba=l=t,k=m):l=l.next=t;g>n&&(n=g)}else{null!==l&&(l=l.next={expirationTime:1073741823,suspenseConfig:p.suspenseConfig,tag:p.tag,payload:p.payload,callback:p.callback,next:null});Vg(g,p.suspenseConfig);a:{var q=a,r=p;g=b;t=c;switch(r.tag){case 1:q=
r.payload;if("function"===typeof q){m=q.call(t,m,g);break a}m=q;break a;case 3:q.effectTag=q.effectTag&-4097|64;case Tg:q=r.payload;g="function"===typeof q?q.call(t,m,g):q;if(null===g||void 0===g)break a;m=M({},m,g);break a;case Jc:Ga=!0}}null!==p.callback&&(a.effectTag|=32,g=e.effects,null===g?e.effects=[p]:g.push(p))}p=p.next;if(null===p||p===h)if(g=e.shared.pending,null===g)break;else p=f.next=g.next,g.next=h,e.baseQueue=f=g,e.shared.pending=null}while(1)}null===l?k=m:l.next=ba;e.baseState=k;e.baseQueue=
l;Kc(n);a.expirationTime=n;a.memoizedState=m}}function Wg(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;b<a.length;b++){var d=a[b],e=d.callback;if(null!==e){d.callback=null;d=e;e=c;if("function"!==typeof d)throw Error(k(191,d));d.call(e)}}}function Lc(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:M({},b,c);a.memoizedState=c;0===a.expirationTime&&(a.updateQueue.baseState=c)}function Xg(a,b,c,d,e,f,g){a=a.stateNode;return"function"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,
f,g):b.prototype&&b.prototype.isPureReactComponent?!Ob(c,d)||!Ob(e,f):!0}function Yg(a,b,c){var d=!1,e=Ca;var f=b.contextType;"object"===typeof f&&null!==f?f=W(f):(e=N(b)?Ra:B.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?pb(a,e):Ca);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Mc;a.stateNode=b;b._reactInternalFiber=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}function Zg(a,
b,c,d){a=b.state;"function"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);"function"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Mc.enqueueReplaceState(b,b.state,null)}function pe(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=$g;ne(a);var f=b.contextType;"object"===typeof f&&null!==f?e.context=W(f):(f=N(b)?Ra:B.current,e.context=pb(a,f));Qb(a,c,e,d);e.state=a.memoizedState;f=b.getDerivedStateFromProps;
"function"===typeof f&&(Lc(a,b,f,c),e.state=a.memoizedState);"function"===typeof b.getDerivedStateFromProps||"function"===typeof e.getSnapshotBeforeUpdate||"function"!==typeof e.UNSAFE_componentWillMount&&"function"!==typeof e.componentWillMount||(b=e.state,"function"===typeof e.componentWillMount&&e.componentWillMount(),"function"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Mc.enqueueReplaceState(e,e.state,null),Qb(a,c,e,d),e.state=a.memoizedState);"function"===
typeof e.componentDidMount&&(a.effectTag|=4)}function Rb(a,b,c){a=c.ref;if(null!==a&&"function"!==typeof a&&"object"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(k(309));var d=c.stateNode}if(!d)throw Error(k(147,a));var e=""+a;if(null!==b&&null!==b.ref&&"function"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===$g&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}if("string"!==typeof a)throw Error(k(284));if(!c._owner)throw Error(k(290,
a));}return a}function Nc(a,b){if("textarea"!==a.type)throw Error(k(31,"[object Object]"===Object.prototype.toString.call(b)?"object with keys {"+Object.keys(b).join(", ")+"}":b,""));}function ah(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,
b),b=b.sibling;return a}function e(a,b){a=Sa(a,b);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=2,c):d;b.effectTag=2;return c}function g(b){a&&null===b.alternate&&(b.effectTag=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=qe(c,a.mode,d),b.return=a,b;b=e(b,c);b.return=a;return b}function m(a,b,c,d){if(null!==b&&b.elementType===c.type)return d=e(b,c.props),d.ref=Rb(a,b,c),d.return=a,d;d=Oc(c.type,
c.key,c.props,null,a.mode,d);d.ref=Rb(a,b,c);d.return=a;return d}function n(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=re(c,a.mode,d),b.return=a,b;b=e(b,c.children||[]);b.return=a;return b}function l(a,b,c,d,f){if(null===b||7!==b.tag)return b=Ha(c,a.mode,d,f),b.return=a,b;b=e(b,c);b.return=a;return b}function ba(a,b,c){if("string"===typeof b||"number"===typeof b)return b=qe(""+b,a.mode,c),b.return=a,b;if("object"===
typeof b&&null!==b){switch(b.$$typeof){case Pc:return c=Oc(b.type,b.key,b.props,null,a.mode,c),c.ref=Rb(a,null,b),c.return=a,c;case gb:return b=re(b,a.mode,c),b.return=a,b}if(Qc(b)||zb(b))return b=Ha(b,a.mode,c,null),b.return=a,b;Nc(a,b)}return null}function p(a,b,c,d){var e=null!==b?b.key:null;if("string"===typeof c||"number"===typeof c)return null!==e?null:h(a,b,""+c,d);if("object"===typeof c&&null!==c){switch(c.$$typeof){case Pc:return c.key===e?c.type===Ma?l(a,b,c.props.children,d,e):m(a,b,c,
d):null;case gb:return c.key===e?n(a,b,c,d):null}if(Qc(c)||zb(c))return null!==e?null:l(a,b,c,d,null);Nc(a,c)}return null}function t(a,b,c,d,e){if("string"===typeof d||"number"===typeof d)return a=a.get(c)||null,h(b,a,""+d,e);if("object"===typeof d&&null!==d){switch(d.$$typeof){case Pc:return a=a.get(null===d.key?c:d.key)||null,d.type===Ma?l(b,a,d.props.children,e,d.key):m(b,a,d,e);case gb:return a=a.get(null===d.key?c:d.key)||null,n(b,a,d,e)}if(Qc(d)||zb(d))return a=a.get(c)||null,l(b,a,d,e,null);
Nc(b,d)}return null}function q(e,g,h,m){for(var n=null,k=null,l=g,r=g=0,C=null;null!==l&&r<h.length;r++){l.index>r?(C=l,l=null):C=l.sibling;var O=p(e,l,h[r],m);if(null===O){null===l&&(l=C);break}a&&l&&null===O.alternate&&b(e,l);g=f(O,g,r);null===k?n=O:k.sibling=O;k=O;l=C}if(r===h.length)return c(e,l),n;if(null===l){for(;r<h.length;r++)l=ba(e,h[r],m),null!==l&&(g=f(l,g,r),null===k?n=l:k.sibling=l,k=l);return n}for(l=d(e,l);r<h.length;r++)C=t(l,e,r,h[r],m),null!==C&&(a&&null!==C.alternate&&l.delete(null===
C.key?r:C.key),g=f(C,g,r),null===k?n=C:k.sibling=C,k=C);a&&l.forEach(function(a){return b(e,a)});return n}function w(e,g,h,n){var m=zb(h);if("function"!==typeof m)throw Error(k(150));h=m.call(h);if(null==h)throw Error(k(151));for(var l=m=null,r=g,C=g=0,O=null,v=h.next();null!==r&&!v.done;C++,v=h.next()){r.index>C?(O=r,r=null):O=r.sibling;var q=p(e,r,v.value,n);if(null===q){null===r&&(r=O);break}a&&r&&null===q.alternate&&b(e,r);g=f(q,g,C);null===l?m=q:l.sibling=q;l=q;r=O}if(v.done)return c(e,r),m;
if(null===r){for(;!v.done;C++,v=h.next())v=ba(e,v.value,n),null!==v&&(g=f(v,g,C),null===l?m=v:l.sibling=v,l=v);return m}for(r=d(e,r);!v.done;C++,v=h.next())v=t(r,e,C,v.value,n),null!==v&&(a&&null!==v.alternate&&r.delete(null===v.key?C:v.key),g=f(v,g,C),null===l?m=v:l.sibling=v,l=v);a&&r.forEach(function(a){return b(e,a)});return m}return function(a,d,f,h){var m="object"===typeof f&&null!==f&&f.type===Ma&&null===f.key;m&&(f=f.props.children);var n="object"===typeof f&&null!==f;if(n)switch(f.$$typeof){case Pc:a:{n=
f.key;for(m=d;null!==m;){if(m.key===n){switch(m.tag){case 7:if(f.type===Ma){c(a,m.sibling);d=e(m,f.props.children);d.return=a;a=d;break a}break;default:if(m.elementType===f.type){c(a,m.sibling);d=e(m,f.props);d.ref=Rb(a,m,f);d.return=a;a=d;break a}}c(a,m);break}else b(a,m);m=m.sibling}f.type===Ma?(d=Ha(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Oc(f.type,f.key,f.props,null,a.mode,h),h.ref=Rb(a,d,f),h.return=a,a=h)}return g(a);case gb:a:{for(m=f.key;null!==d;){if(d.key===m)if(4===d.tag&&d.stateNode.containerInfo===
f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=re(f,a.mode,h);d.return=a;a=d}return g(a)}if("string"===typeof f||"number"===typeof f)return f=""+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):(c(a,d),d=qe(f,a.mode,h),d.return=a,a=d),g(a);if(Qc(f))return q(a,d,f,h);if(zb(f))return w(a,d,f,h);n&&Nc(a,f);if("undefined"===typeof f&&!m)switch(a.tag){case 1:case 0:throw a=
a.type,Error(k(152,a.displayName||a.name||"Component"));}return c(a,d)}}function Ta(a){if(a===Sb)throw Error(k(174));return a}function se(a,b){y(Tb,b);y(Ub,a);y(ja,Sb);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:Hd(null,"");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=Hd(b,a)}q(ja);y(ja,b)}function tb(a){q(ja);q(Ub);q(Tb)}function bh(a){Ta(Tb.current);var b=Ta(ja.current);var c=Hd(b,a.type);b!==c&&(y(Ub,a),y(ja,c))}function te(a){Ub.current===
a&&(q(ja),q(Ub))}function Rc(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||c.data===$d||c.data===Zd))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.effectTag&64))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}function ue(a,b){return{responder:a,props:b}}
function S(){throw Error(k(321));}function ve(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!Qa(a[c],b[c]))return!1;return!0}function we(a,b,c,d,e,f){Ia=f;z=b;b.memoizedState=null;b.updateQueue=null;b.expirationTime=0;Sc.current=null===a||null===a.memoizedState?dj:ej;a=c(d,e);if(b.expirationTime===Ia){f=0;do{b.expirationTime=0;if(!(25>f))throw Error(k(301));f+=1;J=K=null;b.updateQueue=null;Sc.current=fj;a=c(d,e)}while(b.expirationTime===Ia)}Sc.current=Tc;b=null!==K&&null!==K.next;
Ia=0;J=K=z=null;Uc=!1;if(b)throw Error(k(300));return a}function ub(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===J?z.memoizedState=J=a:J=J.next=a;return J}function vb(){if(null===K){var a=z.alternate;a=null!==a?a.memoizedState:null}else a=K.next;var b=null===J?z.memoizedState:J.next;if(null!==b)J=b,K=a;else{if(null===a)throw Error(k(310));K=a;a={memoizedState:K.memoizedState,baseState:K.baseState,baseQueue:K.baseQueue,queue:K.queue,next:null};null===J?z.memoizedState=
J=a:J=J.next=a}return J}function Ua(a,b){return"function"===typeof b?b(a):b}function Vc(a,b,c){b=vb();c=b.queue;if(null===c)throw Error(k(311));c.lastRenderedReducer=a;var d=K,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){e=e.next;d=d.baseState;var h=g=f=null,m=e;do{var n=m.expirationTime;if(n<Ia){var l={expirationTime:m.expirationTime,suspenseConfig:m.suspenseConfig,action:m.action,eagerReducer:m.eagerReducer,eagerState:m.eagerState,
next:null};null===h?(g=h=l,f=d):h=h.next=l;n>z.expirationTime&&(z.expirationTime=n,Kc(n))}else null!==h&&(h=h.next={expirationTime:1073741823,suspenseConfig:m.suspenseConfig,action:m.action,eagerReducer:m.eagerReducer,eagerState:m.eagerState,next:null}),Vg(n,m.suspenseConfig),d=m.eagerReducer===a?m.eagerState:a(d,m.action);m=m.next}while(null!==m&&m!==e);null===h?f=d:h.next=g;Qa(d,b.memoizedState)||(ia=!0);b.memoizedState=d;b.baseState=f;b.baseQueue=h;c.lastRenderedState=d}return[b.memoizedState,
c.dispatch]}function Wc(a,b,c){b=vb();c=b.queue;if(null===c)throw Error(k(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);Qa(f,b.memoizedState)||(ia=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}function xe(a){var b=ub();"function"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={pending:null,dispatch:null,lastRenderedReducer:Ua,
lastRenderedState:a};a=a.dispatch=ch.bind(null,z,a);return[b.memoizedState,a]}function ye(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};b=z.updateQueue;null===b?(b={lastEffect:null},z.updateQueue=b,b.lastEffect=a.next=a):(c=b.lastEffect,null===c?b.lastEffect=a.next=a:(d=c.next,c.next=a,a.next=d,b.lastEffect=a));return a}function dh(a){return vb().memoizedState}function ze(a,b,c,d){var e=ub();z.effectTag|=a;e.memoizedState=ye(1|b,c,void 0,void 0===d?null:d)}function Ae(a,b,c,d){var e=vb();
d=void 0===d?null:d;var f=void 0;if(null!==K){var g=K.memoizedState;f=g.destroy;if(null!==d&&ve(d,g.deps)){ye(b,c,f,d);return}}z.effectTag|=a;e.memoizedState=ye(1|b,c,f,d)}function eh(a,b){return ze(516,4,a,b)}function Xc(a,b){return Ae(516,4,a,b)}function fh(a,b){return Ae(4,2,a,b)}function gh(a,b){if("function"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function hh(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;
return Ae(4,2,gh.bind(null,b,a),c)}function Be(a,b){}function ih(a,b){ub().memoizedState=[a,void 0===b?null:b];return a}function Yc(a,b){var c=vb();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&ve(b,d[1]))return d[0];c.memoizedState=[a,b];return a}function jh(a,b){var c=vb();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&ve(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a}function Ce(a,b,c){var d=Cc();Da(98>d?98:d,function(){a(!0)});Da(97<d?97:d,function(){var d=
X.suspense;X.suspense=void 0===b?null:b;try{a(!1),c()}finally{X.suspense=d}})}function ch(a,b,c){var d=ka(),e=Vb.suspense;d=Va(d,a,e);e={expirationTime:d,suspenseConfig:e,action:c,eagerReducer:null,eagerState:null,next:null};var f=b.pending;null===f?e.next=e:(e.next=f.next,f.next=e);b.pending=e;f=a.alternate;if(a===z||null!==f&&f===z)Uc=!0,e.expirationTime=Ia,z.expirationTime=Ia;else{if(0===a.expirationTime&&(null===f||0===f.expirationTime)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,
h=f(g,c);e.eagerReducer=f;e.eagerState=h;if(Qa(h,g))return}catch(m){}finally{}Ja(a,d)}}function kh(a,b){var c=la(5,null,null,0);c.elementType="DELETED";c.type="DELETED";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function lh(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=""===a.pendingProps||3!==b.nodeType?
null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}function De(a){if(Wa){var b=Ka;if(b){var c=b;if(!lh(a,b)){b=kb(c.nextSibling);if(!b||!lh(a,b)){a.effectTag=a.effectTag&-1025|2;Wa=!1;ra=a;return}kh(ra,c)}ra=a;Ka=kb(b.firstChild)}else a.effectTag=a.effectTag&-1025|2,Wa=!1,ra=a}}function mh(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;ra=a}function Zc(a){if(a!==ra)return!1;if(!Wa)return mh(a),Wa=!0,!1;var b=a.type;if(5!==a.tag||"head"!==b&&"body"!==
b&&!Yd(b,a.memoizedProps))for(b=Ka;b;)kh(a,b),b=kb(b.nextSibling);mh(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(k(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(c===og){if(0===b){Ka=kb(a.nextSibling);break a}b--}else c!==ng&&c!==Zd&&c!==$d||b++}a=a.nextSibling}Ka=null}}else Ka=ra?kb(a.stateNode.nextSibling):null;return!0}function Ee(){Ka=ra=null;Wa=!1}function T(a,b,c,d){b.child=null===a?Fe(b,null,c,d):wb(b,a.child,c,d)}function nh(a,
b,c,d,e){c=c.render;var f=b.ref;rb(b,e);d=we(a,b,c,d,f,e);if(null!==a&&!ia)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),sa(a,b,e);b.effectTag|=1;T(a,b,d,e);return b.child}function oh(a,b,c,d,e,f){if(null===a){var g=c.type;if("function"===typeof g&&!Ge(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,ph(a,b,g,d,e,f);a=Oc(c.type,null,d,null,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(e<
f&&(e=g.memoizedProps,c=c.compare,c=null!==c?c:Ob,c(e,d)&&a.ref===b.ref))return sa(a,b,f);b.effectTag|=1;a=Sa(g,d);a.ref=b.ref;a.return=b;return b.child=a}function ph(a,b,c,d,e,f){return null!==a&&Ob(a.memoizedProps,d)&&a.ref===b.ref&&(ia=!1,e<f)?(b.expirationTime=a.expirationTime,sa(a,b,f)):He(a,b,c,d,f)}function qh(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function He(a,b,c,d,e){var f=N(c)?Ra:B.current;f=pb(b,f);rb(b,e);c=we(a,b,c,d,f,e);if(null!==a&&!ia)return b.updateQueue=
a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),sa(a,b,e);b.effectTag|=1;T(a,b,c,e);return b.child}function rh(a,b,c,d,e){if(N(c)){var f=!0;Bc(b)}else f=!1;rb(b,e);if(null===b.stateNode)null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),Yg(b,c,d),pe(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var m=g.context,n=c.contextType;"object"===typeof n&&null!==n?n=W(n):(n=N(c)?Ra:B.current,n=pb(b,n));var l=c.getDerivedStateFromProps,k="function"===
typeof l||"function"===typeof g.getSnapshotBeforeUpdate;k||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==typeof g.componentWillReceiveProps||(h!==d||m!==n)&&Zg(b,g,d,n);Ga=!1;var p=b.memoizedState;g.state=p;Qb(b,d,g,e);m=b.memoizedState;h!==d||p!==m||G.current||Ga?("function"===typeof l&&(Lc(b,c,l,d),m=b.memoizedState),(h=Ga||Xg(b,c,h,d,p,m,n))?(k||"function"!==typeof g.UNSAFE_componentWillMount&&"function"!==typeof g.componentWillMount||("function"===typeof g.componentWillMount&&
g.componentWillMount(),"function"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),"function"===typeof g.componentDidMount&&(b.effectTag|=4)):("function"===typeof g.componentDidMount&&(b.effectTag|=4),b.memoizedProps=d,b.memoizedState=m),g.props=d,g.state=m,g.context=n,d=h):("function"===typeof g.componentDidMount&&(b.effectTag|=4),d=!1)}else g=b.stateNode,oe(a,b),h=b.memoizedProps,g.props=b.type===b.elementType?h:aa(b.type,h),m=g.context,n=c.contextType,"object"===typeof n&&null!==
n?n=W(n):(n=N(c)?Ra:B.current,n=pb(b,n)),l=c.getDerivedStateFromProps,(k="function"===typeof l||"function"===typeof g.getSnapshotBeforeUpdate)||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==typeof g.componentWillReceiveProps||(h!==d||m!==n)&&Zg(b,g,d,n),Ga=!1,m=b.memoizedState,g.state=m,Qb(b,d,g,e),p=b.memoizedState,h!==d||m!==p||G.current||Ga?("function"===typeof l&&(Lc(b,c,l,d),p=b.memoizedState),(l=Ga||Xg(b,c,h,d,m,p,n))?(k||"function"!==typeof g.UNSAFE_componentWillUpdate&&
"function"!==typeof g.componentWillUpdate||("function"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,p,n),"function"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,p,n)),"function"===typeof g.componentDidUpdate&&(b.effectTag|=4),"function"===typeof g.getSnapshotBeforeUpdate&&(b.effectTag|=256)):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&m===
a.memoizedState||(b.effectTag|=256),b.memoizedProps=d,b.memoizedState=p),g.props=d,g.state=p,g.context=n,d=l):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=256),d=!1);return Ie(a,b,c,d,f,e)}function Ie(a,b,c,d,e,f){qh(a,b);var g=0!==(b.effectTag&64);if(!d&&!g)return e&&Hg(b,c,!1),sa(a,b,f);d=b.stateNode;gj.current=b;var h=g&&"function"!==typeof c.getDerivedStateFromError?
null:d.render();b.effectTag|=1;null!==a&&g?(b.child=wb(b,a.child,null,f),b.child=wb(b,null,h,f)):T(a,b,h,f);b.memoizedState=d.state;e&&Hg(b,c,!0);return b.child}function sh(a){var b=a.stateNode;b.pendingContext?Fg(a,b.pendingContext,b.pendingContext!==b.context):b.context&&Fg(a,b.context,!1);se(a,b.containerInfo)}function th(a,b,c){var d=b.mode,e=b.pendingProps,f=D.current,g=!1,h;(h=0!==(b.effectTag&64))||(h=0!==(f&2)&&(null===a||null!==a.memoizedState));h?(g=!0,b.effectTag&=-65):null!==a&&null===
a.memoizedState||void 0===e.fallback||!0===e.unstable_avoidThisFallback||(f|=1);y(D,f&1);if(null===a){void 0!==e.fallback&&De(b);if(g){g=e.fallback;e=Ha(null,d,0,null);e.return=b;if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Ha(g,d,c,null);c.return=b;e.sibling=c;b.memoizedState=Je;b.child=e;return c}d=e.children;b.memoizedState=null;return b.child=Fe(b,null,d,c)}if(null!==a.memoizedState){a=a.child;d=a.sibling;if(g){e=e.fallback;
c=Sa(a,a.pendingProps);c.return=b;if(0===(b.mode&2)&&(g=null!==b.memoizedState?b.child.child:b.child,g!==a.child))for(c.child=g;null!==g;)g.return=c,g=g.sibling;d=Sa(d,e);d.return=b;c.sibling=d;c.childExpirationTime=0;b.memoizedState=Je;b.child=c;return d}c=wb(b,a.child,e.children,c);b.memoizedState=null;return b.child=c}a=a.child;if(g){g=e.fallback;e=Ha(null,d,0,null);e.return=b;e.child=a;null!==a&&(a.return=e);if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==
a;)a.return=e,a=a.sibling;c=Ha(g,d,c,null);c.return=b;e.sibling=c;c.effectTag|=2;e.childExpirationTime=0;b.memoizedState=Je;b.child=e;return c}b.memoizedState=null;return b.child=wb(b,a,e.children,c)}function uh(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);Sg(a.return,b)}function Ke(a,b,c,d,e,f){var g=a.memoizedState;null===g?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailExpiration:0,tailMode:e,
lastEffect:f}:(g.isBackwards=b,g.rendering=null,g.renderingStartTime=0,g.last=d,g.tail=c,g.tailExpiration=0,g.tailMode=e,g.lastEffect=f)}function vh(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;T(a,b,d.children,c);d=D.current;if(0!==(d&2))d=d&1|2,b.effectTag|=64;else{if(null!==a&&0!==(a.effectTag&64))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&uh(a,c);else if(19===a.tag)uh(a,c);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===
a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}y(D,d);if(0===(b.mode&2))b.memoizedState=null;else switch(e){case "forwards":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===Rc(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);Ke(b,!1,e,c,f,b.lastEffect);break;case "backwards":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===Rc(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}Ke(b,
!0,c,null,f,b.lastEffect);break;case "together":Ke(b,!1,null,null,void 0,b.lastEffect);break;default:b.memoizedState=null}return b.child}function sa(a,b,c){null!==a&&(b.dependencies=a.dependencies);var d=b.expirationTime;0!==d&&Kc(d);if(b.childExpirationTime<c)return null;if(null!==a&&b.child!==a.child)throw Error(k(153));if(null!==b.child){a=b.child;c=Sa(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Sa(a,a.pendingProps),c.return=b;c.sibling=null}return b.child}
function $c(a,b){switch(a.tailMode){case "hidden":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case "collapsed":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}function hj(a,b,c){var d=b.pendingProps;switch(b.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:return N(b.type)&&(q(G),q(B)),
null;case 3:return tb(),q(G),q(B),c=b.stateNode,c.pendingContext&&(c.context=c.pendingContext,c.pendingContext=null),null!==a&&null!==a.child||!Zc(b)||(b.effectTag|=4),wh(b),null;case 5:te(b);c=Ta(Tb.current);var e=b.type;if(null!==a&&null!=b.stateNode)ij(a,b,e,d,c),a.ref!==b.ref&&(b.effectTag|=128);else{if(!d){if(null===b.stateNode)throw Error(k(166));return null}a=Ta(ja.current);if(Zc(b)){d=b.stateNode;e=b.type;var f=b.memoizedProps;d[Aa]=b;d[vc]=f;switch(e){case "iframe":case "object":case "embed":w("load",
d);break;case "video":case "audio":for(a=0;a<Db.length;a++)w(Db[a],d);break;case "source":w("error",d);break;case "img":case "image":case "link":w("error",d);w("load",d);break;case "form":w("reset",d);w("submit",d);break;case "details":w("toggle",d);break;case "input":Hf(d,f);w("invalid",d);oa(c,"onChange");break;case "select":d._wrapperState={wasMultiple:!!f.multiple};w("invalid",d);oa(c,"onChange");break;case "textarea":Kf(d,f),w("invalid",d),oa(c,"onChange")}Ud(e,f);a=null;for(var g in f)if(f.hasOwnProperty(g)){var h=
f[g];"children"===g?"string"===typeof h?d.textContent!==h&&(a=["children",h]):"number"===typeof h&&d.textContent!==""+h&&(a=["children",""+h]):db.hasOwnProperty(g)&&null!=h&&oa(c,g)}switch(e){case "input":mc(d);Jf(d,f,!0);break;case "textarea":mc(d);Mf(d);break;case "select":case "option":break;default:"function"===typeof f.onClick&&(d.onclick=uc)}c=a;b.updateQueue=c;null!==c&&(b.effectTag|=4)}else{g=9===c.nodeType?c:c.ownerDocument;"http://www.w3.org/1999/xhtml"===a&&(a=Nf(e));"http://www.w3.org/1999/xhtml"===
a?"script"===e?(a=g.createElement("div"),a.innerHTML="<script>\x3c/script>",a=a.removeChild(a.firstChild)):"string"===typeof d.is?a=g.createElement(e,{is:d.is}):(a=g.createElement(e),"select"===e&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,e);a[Aa]=b;a[vc]=d;jj(a,b,!1,!1);b.stateNode=a;g=Vd(e,d);switch(e){case "iframe":case "object":case "embed":w("load",a);h=d;break;case "video":case "audio":for(h=0;h<Db.length;h++)w(Db[h],a);h=d;break;case "source":w("error",a);
h=d;break;case "img":case "image":case "link":w("error",a);w("load",a);h=d;break;case "form":w("reset",a);w("submit",a);h=d;break;case "details":w("toggle",a);h=d;break;case "input":Hf(a,d);h=Cd(a,d);w("invalid",a);oa(c,"onChange");break;case "option":h=Fd(a,d);break;case "select":a._wrapperState={wasMultiple:!!d.multiple};h=M({},d,{value:void 0});w("invalid",a);oa(c,"onChange");break;case "textarea":Kf(a,d);h=Gd(a,d);w("invalid",a);oa(c,"onChange");break;default:h=d}Ud(e,h);var m=h;for(f in m)if(m.hasOwnProperty(f)){var n=
m[f];"style"===f?gg(a,n):"dangerouslySetInnerHTML"===f?(n=n?n.__html:void 0,null!=n&&xh(a,n)):"children"===f?"string"===typeof n?("textarea"!==e||""!==n)&&Wb(a,n):"number"===typeof n&&Wb(a,""+n):"suppressContentEditableWarning"!==f&&"suppressHydrationWarning"!==f&&"autoFocus"!==f&&(db.hasOwnProperty(f)?null!=n&&oa(c,f):null!=n&&xd(a,f,n,g))}switch(e){case "input":mc(a);Jf(a,d,!1);break;case "textarea":mc(a);Mf(a);break;case "option":null!=d.value&&a.setAttribute("value",""+va(d.value));break;case "select":a.multiple=
!!d.multiple;c=d.value;null!=c?hb(a,!!d.multiple,c,!1):null!=d.defaultValue&&hb(a,!!d.multiple,d.defaultValue,!0);break;default:"function"===typeof h.onClick&&(a.onclick=uc)}lg(e,d)&&(b.effectTag|=4)}null!==b.ref&&(b.effectTag|=128)}return null;case 6:if(a&&null!=b.stateNode)kj(a,b,a.memoizedProps,d);else{if("string"!==typeof d&&null===b.stateNode)throw Error(k(166));c=Ta(Tb.current);Ta(ja.current);Zc(b)?(c=b.stateNode,d=b.memoizedProps,c[Aa]=b,c.nodeValue!==d&&(b.effectTag|=4)):(c=(9===c.nodeType?
c:c.ownerDocument).createTextNode(d),c[Aa]=b,b.stateNode=c)}return null;case 13:q(D);d=b.memoizedState;if(0!==(b.effectTag&64))return b.expirationTime=c,b;c=null!==d;d=!1;null===a?void 0!==b.memoizedProps.fallback&&Zc(b):(e=a.memoizedState,d=null!==e,c||null===e||(e=a.child.sibling,null!==e&&(f=b.firstEffect,null!==f?(b.firstEffect=e,e.nextEffect=f):(b.firstEffect=b.lastEffect=e,e.nextEffect=null),e.effectTag=8)));if(c&&!d&&0!==(b.mode&2))if(null===a&&!0!==b.memoizedProps.unstable_avoidThisFallback||
0!==(D.current&1))F===Xa&&(F=ad);else{if(F===Xa||F===ad)F=bd;0!==Xb&&null!==U&&(Ya(U,P),yh(U,Xb))}if(c||d)b.effectTag|=4;return null;case 4:return tb(),wh(b),null;case 10:return me(b),null;case 17:return N(b.type)&&(q(G),q(B)),null;case 19:q(D);d=b.memoizedState;if(null===d)return null;e=0!==(b.effectTag&64);f=d.rendering;if(null===f)if(e)$c(d,!1);else{if(F!==Xa||null!==a&&0!==(a.effectTag&64))for(f=b.child;null!==f;){a=Rc(f);if(null!==a){b.effectTag|=64;$c(d,!1);e=a.updateQueue;null!==e&&(b.updateQueue=
e,b.effectTag|=4);null===d.lastEffect&&(b.firstEffect=null);b.lastEffect=d.lastEffect;for(d=b.child;null!==d;)e=d,f=c,e.effectTag&=2,e.nextEffect=null,e.firstEffect=null,e.lastEffect=null,a=e.alternate,null===a?(e.childExpirationTime=0,e.expirationTime=f,e.child=null,e.memoizedProps=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null):(e.childExpirationTime=a.childExpirationTime,e.expirationTime=a.expirationTime,e.child=a.child,e.memoizedProps=a.memoizedProps,e.memoizedState=a.memoizedState,
e.updateQueue=a.updateQueue,f=a.dependencies,e.dependencies=null===f?null:{expirationTime:f.expirationTime,firstContext:f.firstContext,responders:f.responders}),d=d.sibling;y(D,D.current&1|2);return b.child}f=f.sibling}}else{if(!e)if(a=Rc(f),null!==a){if(b.effectTag|=64,e=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.effectTag|=4),$c(d,!0),null===d.tail&&"hidden"===d.tailMode&&!f.alternate)return b=b.lastEffect=d.lastEffect,null!==b&&(b.nextEffect=null),null}else 2*Y()-d.renderingStartTime>d.tailExpiration&&
1<c&&(b.effectTag|=64,e=!0,$c(d,!1),b.expirationTime=b.childExpirationTime=c-1);d.isBackwards?(f.sibling=b.child,b.child=f):(c=d.last,null!==c?c.sibling=f:b.child=f,d.last=f)}return null!==d.tail?(0===d.tailExpiration&&(d.tailExpiration=Y()+500),c=d.tail,d.rendering=c,d.tail=c.sibling,d.lastEffect=b.lastEffect,d.renderingStartTime=Y(),c.sibling=null,b=D.current,y(D,e?b&1|2:b&1),c):null}throw Error(k(156,b.tag));}function lj(a,b){switch(a.tag){case 1:return N(a.type)&&(q(G),q(B)),b=a.effectTag,b&4096?
(a.effectTag=b&-4097|64,a):null;case 3:tb();q(G);q(B);b=a.effectTag;if(0!==(b&64))throw Error(k(285));a.effectTag=b&-4097|64;return a;case 5:return te(a),null;case 13:return q(D),b=a.effectTag,b&4096?(a.effectTag=b&-4097|64,a):null;case 19:return q(D),null;case 4:return tb(),null;case 10:return me(a),null;default:return null}}function Le(a,b){return{value:a,source:b,stack:Bd(b)}}function Me(a,b){var c=b.source,d=b.stack;null===d&&null!==c&&(d=Bd(c));null!==c&&na(c.type);b=b.value;null!==a&&1===a.tag&&
na(a.type);try{console.error(b)}catch(e){setTimeout(function(){throw e;})}}function mj(a,b){try{b.props=a.memoizedProps,b.state=a.memoizedState,b.componentWillUnmount()}catch(c){Za(a,c)}}function zh(a){var b=a.ref;if(null!==b)if("function"===typeof b)try{b(null)}catch(c){Za(a,c)}else b.current=null}function nj(a,b){switch(b.tag){case 0:case 11:case 15:case 22:return;case 1:if(b.effectTag&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType===
b.type?c:aa(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}return;case 3:case 5:case 6:case 4:case 17:return}throw Error(k(163));}function Ah(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.destroy;c.destroy=void 0;void 0!==d&&d()}c=c.next}while(c!==b)}}function Bh(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function oj(a,b,c,d){switch(c.tag){case 0:case 11:case 15:case 22:Bh(3,
c);return;case 1:a=c.stateNode;c.effectTag&4&&(null===b?a.componentDidMount():(d=c.elementType===c.type?b.memoizedProps:aa(c.type,b.memoizedProps),a.componentDidUpdate(d,b.memoizedState,a.__reactInternalSnapshotBeforeUpdate)));b=c.updateQueue;null!==b&&Wg(c,b,a);return;case 3:b=c.updateQueue;if(null!==b){a=null;if(null!==c.child)switch(c.child.tag){case 5:a=c.child.stateNode;break;case 1:a=c.child.stateNode}Wg(c,b,a)}return;case 5:a=c.stateNode;null===b&&c.effectTag&4&&lg(c.type,c.memoizedProps)&&
a.focus();return;case 6:return;case 4:return;case 12:return;case 13:null===c.memoizedState&&(c=c.alternate,null!==c&&(c=c.memoizedState,null!==c&&(c=c.dehydrated,null!==c&&bg(c))));return;case 19:case 17:case 20:case 21:return}throw Error(k(163));}function Ch(a,b,c){"function"===typeof Ne&&Ne(b);switch(b.tag){case 0:case 11:case 14:case 15:case 22:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var d=a.next;Da(97<c?97:c,function(){var a=d;do{var c=a.destroy;if(void 0!==c){var g=b;try{c()}catch(h){Za(g,
h)}}a=a.next}while(a!==d)})}break;case 1:zh(b);c=b.stateNode;"function"===typeof c.componentWillUnmount&&mj(b,c);break;case 5:zh(b);break;case 4:Dh(a,b,c)}}function Eh(a){var b=a.alternate;a.return=null;a.child=null;a.memoizedState=null;a.updateQueue=null;a.dependencies=null;a.alternate=null;a.firstEffect=null;a.lastEffect=null;a.pendingProps=null;a.memoizedProps=null;a.stateNode=null;null!==b&&Eh(b)}function Fh(a){return 5===a.tag||3===a.tag||4===a.tag}function Gh(a){a:{for(var b=a.return;null!==
b;){if(Fh(b)){var c=b;break a}b=b.return}throw Error(k(160));}b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw Error(k(161));}c.effectTag&16&&(Wb(b,""),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||Fh(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.effectTag&2)continue b;if(null===c.child||4===c.tag)continue b;
else c.child.return=c,c=c.child}if(!(c.effectTag&2)){c=c.stateNode;break a}}d?Oe(a,c,b):Pe(a,c,b)}function Oe(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=uc));else if(4!==d&&(a=a.child,null!==a))for(Oe(a,b,c),a=a.sibling;null!==a;)Oe(a,b,c),a=a.sibling}
function Pe(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Pe(a,b,c),a=a.sibling;null!==a;)Pe(a,b,c),a=a.sibling}function Dh(a,b,c){for(var d=b,e=!1,f,g;;){if(!e){e=d.return;a:for(;;){if(null===e)throw Error(k(160));f=e.stateNode;switch(e.tag){case 5:g=!1;break a;case 3:f=f.containerInfo;g=!0;break a;case 4:f=f.containerInfo;g=!0;break a}e=e.return}e=!0}if(5===d.tag||6===d.tag){a:for(var h=
a,m=d,n=c,l=m;;)if(Ch(h,l,n),null!==l.child&&4!==l.tag)l.child.return=l,l=l.child;else{if(l===m)break a;for(;null===l.sibling;){if(null===l.return||l.return===m)break a;l=l.return}l.sibling.return=l.return;l=l.sibling}g?(h=f,m=d.stateNode,8===h.nodeType?h.parentNode.removeChild(m):h.removeChild(m)):f.removeChild(d.stateNode)}else if(4===d.tag){if(null!==d.child){f=d.stateNode.containerInfo;g=!0;d.child.return=d;d=d.child;continue}}else if(Ch(a,d,c),null!==d.child){d.child.return=d;d=d.child;continue}if(d===
b)break;for(;null===d.sibling;){if(null===d.return||d.return===b)return;d=d.return;4===d.tag&&(e=!1)}d.sibling.return=d.return;d=d.sibling}}function Qe(a,b){switch(b.tag){case 0:case 11:case 14:case 15:case 22:Ah(3,b);return;case 1:return;case 5:var c=b.stateNode;if(null!=c){var d=b.memoizedProps,e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[vc]=d;"input"===a&&"radio"===d.type&&null!=d.name&&If(c,d);Vd(a,e);b=Vd(a,d);for(e=0;e<f.length;e+=2){var g=f[e],
h=f[e+1];"style"===g?gg(c,h):"dangerouslySetInnerHTML"===g?xh(c,h):"children"===g?Wb(c,h):xd(c,g,h,b)}switch(a){case "input":Dd(c,d);break;case "textarea":Lf(c,d);break;case "select":b=c._wrapperState.wasMultiple,c._wrapperState.wasMultiple=!!d.multiple,a=d.value,null!=a?hb(c,!!d.multiple,a,!1):b!==!!d.multiple&&(null!=d.defaultValue?hb(c,!!d.multiple,d.defaultValue,!0):hb(c,!!d.multiple,d.multiple?[]:"",!1))}}}return;case 6:if(null===b.stateNode)throw Error(k(162));b.stateNode.nodeValue=b.memoizedProps;
return;case 3:b=b.stateNode;b.hydrate&&(b.hydrate=!1,bg(b.containerInfo));return;case 12:return;case 13:c=b;null===b.memoizedState?d=!1:(d=!0,c=b.child,Re=Y());if(null!==c)a:for(a=c;;){if(5===a.tag)f=a.stateNode,d?(f=f.style,"function"===typeof f.setProperty?f.setProperty("display","none","important"):f.display="none"):(f=a.stateNode,e=a.memoizedProps.style,e=void 0!==e&&null!==e&&e.hasOwnProperty("display")?e.display:null,f.style.display=fg("display",e));else if(6===a.tag)a.stateNode.nodeValue=d?
"":a.memoizedProps;else if(13===a.tag&&null!==a.memoizedState&&null===a.memoizedState.dehydrated){f=a.child.sibling;f.return=a;a=f;continue}else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===c)break;for(;null===a.sibling;){if(null===a.return||a.return===c)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}Hh(b);return;case 19:Hh(b);return;case 17:return}throw Error(k(163));}function Hh(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=
new pj);b.forEach(function(b){var d=qj.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}function Ih(a,b,c){c=Ea(c,null);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){cd||(cd=!0,Se=d);Me(a,b)};return c}function Jh(a,b,c){c=Ea(c,null);c.tag=3;var d=a.type.getDerivedStateFromError;if("function"===typeof d){var e=b.value;c.payload=function(){Me(a,b);return d(e)}}var f=a.stateNode;null!==f&&"function"===typeof f.componentDidCatch&&(c.callback=function(){"function"!==typeof d&&
(null===La?La=new Set([this]):La.add(this),Me(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:""})});return c}function ka(){return(p&(ca|ma))!==H?1073741821-(Y()/10|0):0!==dd?dd:dd=1073741821-(Y()/10|0)}function Va(a,b,c){b=b.mode;if(0===(b&2))return 1073741823;var d=Cc();if(0===(b&4))return 99===d?1073741823:1073741822;if((p&ca)!==H)return P;if(null!==c)a=Fc(a,c.timeoutMs|0||5E3,250);else switch(d){case 99:a=1073741823;break;case 98:a=Fc(a,150,100);break;case 97:case 96:a=
Fc(a,5E3,250);break;case 95:a=2;break;default:throw Error(k(326));}null!==U&&a===P&&--a;return a}function ed(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);var d=a.return,e=null;if(null===d&&3===a.tag)e=a.stateNode;else for(;null!==d;){c=d.alternate;d.childExpirationTime<b&&(d.childExpirationTime=b);null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);if(null===d.return&&3===d.tag){e=d.stateNode;break}d=d.return}null!==e&&
(U===e&&(Kc(b),F===bd&&Ya(e,P)),yh(e,b));return e}function fd(a){var b=a.lastExpiredTime;if(0!==b)return b;b=a.firstPendingTime;if(!Kh(a,b))return b;var c=a.lastPingedTime;a=a.nextKnownPendingLevel;a=c>a?c:a;return 2>=a&&b!==a?0:a}function V(a){if(0!==a.lastExpiredTime)a.callbackExpirationTime=1073741823,a.callbackPriority=99,a.callbackNode=Og(Te.bind(null,a));else{var b=fd(a),c=a.callbackNode;if(0===b)null!==c&&(a.callbackNode=null,a.callbackExpirationTime=0,a.callbackPriority=90);else{var d=ka();
1073741823===b?d=99:1===b||2===b?d=95:(d=10*(1073741821-b)-10*(1073741821-d),d=0>=d?99:250>=d?98:5250>=d?97:95);if(null!==c){var e=a.callbackPriority;if(a.callbackExpirationTime===b&&e>=d)return;c!==Qg&&Rg(c)}a.callbackExpirationTime=b;a.callbackPriority=d;b=1073741823===b?Og(Te.bind(null,a)):Ng(d,Lh.bind(null,a),{timeout:10*(1073741821-b)-Y()});a.callbackNode=b}}}function Lh(a,b){dd=0;if(b)return b=ka(),Ue(a,b),V(a),null;var c=fd(a);if(0!==c){b=a.callbackNode;if((p&(ca|ma))!==H)throw Error(k(327));
xb();a===U&&c===P||$a(a,c);if(null!==t){var d=p;p|=ca;var e=Mh();do try{rj();break}catch(h){Nh(a,h)}while(1);le();p=d;gd.current=e;if(F===hd)throw b=id,$a(a,c),Ya(a,c),V(a),b;if(null===t)switch(e=a.finishedWork=a.current.alternate,a.finishedExpirationTime=c,d=F,U=null,d){case Xa:case hd:throw Error(k(345));case Oh:Ue(a,2<c?2:c);break;case ad:Ya(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Ve(e));if(1073741823===ta&&(e=Re+Ph-Y(),10<e)){if(jd){var f=a.lastPingedTime;if(0===f||f>=c){a.lastPingedTime=
c;$a(a,c);break}}f=fd(a);if(0!==f&&f!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}a.timeoutHandle=We(ab.bind(null,a),e);break}ab(a);break;case bd:Ya(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Ve(e));if(jd&&(e=a.lastPingedTime,0===e||e>=c)){a.lastPingedTime=c;$a(a,c);break}e=fd(a);if(0!==e&&e!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}1073741823!==Yb?d=10*(1073741821-Yb)-Y():1073741823===ta?d=0:(d=10*(1073741821-ta)-5E3,e=Y(),c=10*(1073741821-c)-e,d=e-d,0>d&&(d=0),d=
(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*sj(d/1960))-d,c<d&&(d=c));if(10<d){a.timeoutHandle=We(ab.bind(null,a),d);break}ab(a);break;case Xe:if(1073741823!==ta&&null!==kd){f=ta;var g=kd;d=g.busyMinDurationMs|0;0>=d?d=0:(e=g.busyDelayMs|0,f=Y()-(10*(1073741821-f)-(g.timeoutMs|0||5E3)),d=f<=e?0:e+d-f);if(10<d){Ya(a,c);a.timeoutHandle=We(ab.bind(null,a),d);break}}ab(a);break;default:throw Error(k(329));}V(a);if(a.callbackNode===b)return Lh.bind(null,a)}}return null}function Te(a){var b=
a.lastExpiredTime;b=0!==b?b:1073741823;if((p&(ca|ma))!==H)throw Error(k(327));xb();a===U&&b===P||$a(a,b);if(null!==t){var c=p;p|=ca;var d=Mh();do try{tj();break}catch(e){Nh(a,e)}while(1);le();p=c;gd.current=d;if(F===hd)throw c=id,$a(a,b),Ya(a,b),V(a),c;if(null!==t)throw Error(k(261));a.finishedWork=a.current.alternate;a.finishedExpirationTime=b;U=null;ab(a);V(a)}return null}function uj(){if(null!==bb){var a=bb;bb=null;a.forEach(function(a,c){Ue(c,a);V(c)});ha()}}function Qh(a,b){var c=p;p|=1;try{return a(b)}finally{p=
c,p===H&&ha()}}function Rh(a,b){var c=p;p&=-2;p|=Ye;try{return a(b)}finally{p=c,p===H&&ha()}}function $a(a,b){a.finishedWork=null;a.finishedExpirationTime=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,vj(c));if(null!==t)for(c=t.return;null!==c;){var d=c;switch(d.tag){case 1:d=d.type.childContextTypes;null!==d&&void 0!==d&&(q(G),q(B));break;case 3:tb();q(G);q(B);break;case 5:te(d);break;case 4:tb();break;case 13:q(D);break;case 19:q(D);break;case 10:me(d)}c=c.return}U=a;t=Sa(a.current,null);
P=b;F=Xa;id=null;Yb=ta=1073741823;kd=null;Xb=0;jd=!1}function Nh(a,b){do{try{le();Sc.current=Tc;if(Uc)for(var c=z.memoizedState;null!==c;){var d=c.queue;null!==d&&(d.pending=null);c=c.next}Ia=0;J=K=z=null;Uc=!1;if(null===t||null===t.return)return F=hd,id=b,t=null;a:{var e=a,f=t.return,g=t,h=b;b=P;g.effectTag|=2048;g.firstEffect=g.lastEffect=null;if(null!==h&&"object"===typeof h&&"function"===typeof h.then){var m=h;if(0===(g.mode&2)){var n=g.alternate;n?(g.updateQueue=n.updateQueue,g.memoizedState=
n.memoizedState,g.expirationTime=n.expirationTime):(g.updateQueue=null,g.memoizedState=null)}var l=0!==(D.current&1),k=f;do{var p;if(p=13===k.tag){var q=k.memoizedState;if(null!==q)p=null!==q.dehydrated?!0:!1;else{var w=k.memoizedProps;p=void 0===w.fallback?!1:!0!==w.unstable_avoidThisFallback?!0:l?!1:!0}}if(p){var y=k.updateQueue;if(null===y){var r=new Set;r.add(m);k.updateQueue=r}else y.add(m);if(0===(k.mode&2)){k.effectTag|=64;g.effectTag&=-2981;if(1===g.tag)if(null===g.alternate)g.tag=17;else{var O=
Ea(1073741823,null);O.tag=Jc;Fa(g,O)}g.expirationTime=1073741823;break a}h=void 0;g=b;var v=e.pingCache;null===v?(v=e.pingCache=new wj,h=new Set,v.set(m,h)):(h=v.get(m),void 0===h&&(h=new Set,v.set(m,h)));if(!h.has(g)){h.add(g);var x=xj.bind(null,e,m,g);m.then(x,x)}k.effectTag|=4096;k.expirationTime=b;break a}k=k.return}while(null!==k);h=Error((na(g.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display."+
Bd(g))}F!==Xe&&(F=Oh);h=Le(h,g);k=f;do{switch(k.tag){case 3:m=h;k.effectTag|=4096;k.expirationTime=b;var A=Ih(k,m,b);Ug(k,A);break a;case 1:m=h;var u=k.type,B=k.stateNode;if(0===(k.effectTag&64)&&("function"===typeof u.getDerivedStateFromError||null!==B&&"function"===typeof B.componentDidCatch&&(null===La||!La.has(B)))){k.effectTag|=4096;k.expirationTime=b;var H=Jh(k,m,b);Ug(k,H);break a}}k=k.return}while(null!==k)}t=Sh(t)}catch(cj){b=cj;continue}break}while(1)}function Mh(a){a=gd.current;gd.current=
Tc;return null===a?Tc:a}function Vg(a,b){a<ta&&2<a&&(ta=a);null!==b&&a<Yb&&2<a&&(Yb=a,kd=b)}function Kc(a){a>Xb&&(Xb=a)}function tj(){for(;null!==t;)t=Th(t)}function rj(){for(;null!==t&&!yj();)t=Th(t)}function Th(a){var b=zj(a.alternate,a,P);a.memoizedProps=a.pendingProps;null===b&&(b=Sh(a));Uh.current=null;return b}function Sh(a){t=a;do{var b=t.alternate;a=t.return;if(0===(t.effectTag&2048)){b=hj(b,t,P);if(1===P||1!==t.childExpirationTime){for(var c=0,d=t.child;null!==d;){var e=d.expirationTime,
f=d.childExpirationTime;e>c&&(c=e);f>c&&(c=f);d=d.sibling}t.childExpirationTime=c}if(null!==b)return b;null!==a&&0===(a.effectTag&2048)&&(null===a.firstEffect&&(a.firstEffect=t.firstEffect),null!==t.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=t.firstEffect),a.lastEffect=t.lastEffect),1<t.effectTag&&(null!==a.lastEffect?a.lastEffect.nextEffect=t:a.firstEffect=t,a.lastEffect=t))}else{b=lj(t);if(null!==b)return b.effectTag&=2047,b;null!==a&&(a.firstEffect=a.lastEffect=null,a.effectTag|=
2048)}b=t.sibling;if(null!==b)return b;t=a}while(null!==t);F===Xa&&(F=Xe);return null}function Ve(a){var b=a.expirationTime;a=a.childExpirationTime;return b>a?b:a}function ab(a){var b=Cc();Da(99,Aj.bind(null,a,b));return null}function Aj(a,b){do xb();while(null!==Zb);if((p&(ca|ma))!==H)throw Error(k(327));var c=a.finishedWork,d=a.finishedExpirationTime;if(null===c)return null;a.finishedWork=null;a.finishedExpirationTime=0;if(c===a.current)throw Error(k(177));a.callbackNode=null;a.callbackExpirationTime=
0;a.callbackPriority=90;a.nextKnownPendingLevel=0;var e=Ve(c);a.firstPendingTime=e;d<=a.lastSuspendedTime?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:d<=a.firstSuspendedTime&&(a.firstSuspendedTime=d-1);d<=a.lastPingedTime&&(a.lastPingedTime=0);d<=a.lastExpiredTime&&(a.lastExpiredTime=0);a===U&&(t=U=null,P=0);1<c.effectTag?null!==c.lastEffect?(c.lastEffect.nextEffect=c,e=c.firstEffect):e=c:e=c.firstEffect;if(null!==e){var f=p;p|=ma;Uh.current=null;Ze=tc;var g=kg();if(Xd(g)){if("selectionStart"in
g)var h={start:g.selectionStart,end:g.selectionEnd};else a:{h=(h=g.ownerDocument)&&h.defaultView||window;var m=h.getSelection&&h.getSelection();if(m&&0!==m.rangeCount){h=m.anchorNode;var n=m.anchorOffset,q=m.focusNode;m=m.focusOffset;try{h.nodeType,q.nodeType}catch(sb){h=null;break a}var ba=0,w=-1,y=-1,B=0,D=0,r=g,z=null;b:for(;;){for(var v;;){r!==h||0!==n&&3!==r.nodeType||(w=ba+n);r!==q||0!==m&&3!==r.nodeType||(y=ba+m);3===r.nodeType&&(ba+=r.nodeValue.length);if(null===(v=r.firstChild))break;z=r;
r=v}for(;;){if(r===g)break b;z===h&&++B===n&&(w=ba);z===q&&++D===m&&(y=ba);if(null!==(v=r.nextSibling))break;r=z;z=r.parentNode}r=v}h=-1===w||-1===y?null:{start:w,end:y}}else h=null}h=h||{start:0,end:0}}else h=null;$e={activeElementDetached:null,focusedElem:g,selectionRange:h};tc=!1;l=e;do try{Bj()}catch(sb){if(null===l)throw Error(k(330));Za(l,sb);l=l.nextEffect}while(null!==l);l=e;do try{for(g=a,h=b;null!==l;){var x=l.effectTag;x&16&&Wb(l.stateNode,"");if(x&128){var A=l.alternate;if(null!==A){var u=
A.ref;null!==u&&("function"===typeof u?u(null):u.current=null)}}switch(x&1038){case 2:Gh(l);l.effectTag&=-3;break;case 6:Gh(l);l.effectTag&=-3;Qe(l.alternate,l);break;case 1024:l.effectTag&=-1025;break;case 1028:l.effectTag&=-1025;Qe(l.alternate,l);break;case 4:Qe(l.alternate,l);break;case 8:n=l,Dh(g,n,h),Eh(n)}l=l.nextEffect}}catch(sb){if(null===l)throw Error(k(330));Za(l,sb);l=l.nextEffect}while(null!==l);u=$e;A=kg();x=u.focusedElem;h=u.selectionRange;if(A!==x&&x&&x.ownerDocument&&jg(x.ownerDocument.documentElement,
x)){null!==h&&Xd(x)&&(A=h.start,u=h.end,void 0===u&&(u=A),"selectionStart"in x?(x.selectionStart=A,x.selectionEnd=Math.min(u,x.value.length)):(u=(A=x.ownerDocument||document)&&A.defaultView||window,u.getSelection&&(u=u.getSelection(),n=x.textContent.length,g=Math.min(h.start,n),h=void 0===h.end?g:Math.min(h.end,n),!u.extend&&g>h&&(n=h,h=g,g=n),n=ig(x,g),q=ig(x,h),n&&q&&(1!==u.rangeCount||u.anchorNode!==n.node||u.anchorOffset!==n.offset||u.focusNode!==q.node||u.focusOffset!==q.offset)&&(A=A.createRange(),
A.setStart(n.node,n.offset),u.removeAllRanges(),g>h?(u.addRange(A),u.extend(q.node,q.offset)):(A.setEnd(q.node,q.offset),u.addRange(A))))));A=[];for(u=x;u=u.parentNode;)1===u.nodeType&&A.push({element:u,left:u.scrollLeft,top:u.scrollTop});"function"===typeof x.focus&&x.focus();for(x=0;x<A.length;x++)u=A[x],u.element.scrollLeft=u.left,u.element.scrollTop=u.top}tc=!!Ze;$e=Ze=null;a.current=c;l=e;do try{for(x=a;null!==l;){var F=l.effectTag;F&36&&oj(x,l.alternate,l);if(F&128){A=void 0;var E=l.ref;if(null!==
E){var G=l.stateNode;switch(l.tag){case 5:A=G;break;default:A=G}"function"===typeof E?E(A):E.current=A}}l=l.nextEffect}}catch(sb){if(null===l)throw Error(k(330));Za(l,sb);l=l.nextEffect}while(null!==l);l=null;Cj();p=f}else a.current=c;if(ld)ld=!1,Zb=a,$b=b;else for(l=e;null!==l;)b=l.nextEffect,l.nextEffect=null,l=b;b=a.firstPendingTime;0===b&&(La=null);1073741823===b?a===af?ac++:(ac=0,af=a):ac=0;"function"===typeof bf&&bf(c.stateNode,d);V(a);if(cd)throw cd=!1,a=Se,Se=null,a;if((p&Ye)!==H)return null;
ha();return null}function Bj(){for(;null!==l;){var a=l.effectTag;0!==(a&256)&&nj(l.alternate,l);0===(a&512)||ld||(ld=!0,Ng(97,function(){xb();return null}));l=l.nextEffect}}function xb(){if(90!==$b){var a=97<$b?97:$b;$b=90;return Da(a,Dj)}}function Dj(){if(null===Zb)return!1;var a=Zb;Zb=null;if((p&(ca|ma))!==H)throw Error(k(331));var b=p;p|=ma;for(a=a.current.firstEffect;null!==a;){try{var c=a;if(0!==(c.effectTag&512))switch(c.tag){case 0:case 11:case 15:case 22:Ah(5,c),Bh(5,c)}}catch(d){if(null===
a)throw Error(k(330));Za(a,d)}c=a.nextEffect;a.nextEffect=null;a=c}p=b;ha();return!0}function Vh(a,b,c){b=Le(c,b);b=Ih(a,b,1073741823);Fa(a,b);a=ed(a,1073741823);null!==a&&V(a)}function Za(a,b){if(3===a.tag)Vh(a,a,b);else for(var c=a.return;null!==c;){if(3===c.tag){Vh(c,a,b);break}else if(1===c.tag){var d=c.stateNode;if("function"===typeof c.type.getDerivedStateFromError||"function"===typeof d.componentDidCatch&&(null===La||!La.has(d))){a=Le(b,a);a=Jh(c,a,1073741823);Fa(c,a);c=ed(c,1073741823);null!==
c&&V(c);break}}c=c.return}}function xj(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);U===a&&P===c?F===bd||F===ad&&1073741823===ta&&Y()-Re<Ph?$a(a,P):jd=!0:Kh(a,c)&&(b=a.lastPingedTime,0!==b&&b<c||(a.lastPingedTime=c,V(a)))}function qj(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=0;0===b&&(b=ka(),b=Va(b,a,null));a=ed(a,b);null!==a&&V(a)}function Ej(a){if("undefined"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=
b.inject(a);bf=function(a,e){try{b.onCommitFiberRoot(c,a,void 0,64===(a.current.effectTag&64))}catch(f){}};Ne=function(a){try{b.onCommitFiberUnmount(c,a)}catch(e){}}}catch(d){}return!0}function Fj(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=
null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function Ge(a){a=a.prototype;return!(!a||!a.isReactComponent)}function Gj(a){if("function"===typeof a)return Ge(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===zd)return 11;if(a===Ad)return 14}return 2}function Sa(a,b){var c=a.alternate;null===c?(c=la(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.effectTag=0,c.nextEffect=null,c.firstEffect=
null,c.lastEffect=null);c.childExpirationTime=a.childExpirationTime;c.expirationTime=a.expirationTime;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{expirationTime:b.expirationTime,firstContext:b.firstContext,responders:b.responders};c.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}function Oc(a,b,c,d,e,f){var g=2;d=a;if("function"===typeof a)Ge(a)&&(g=1);else if("string"===typeof a)g=
5;else a:switch(a){case Ma:return Ha(c.children,e,f,b);case Hj:g=8;e|=7;break;case Af:g=8;e|=1;break;case kc:return a=la(12,c,b,e|8),a.elementType=kc,a.type=kc,a.expirationTime=f,a;case lc:return a=la(13,c,b,e),a.type=lc,a.elementType=lc,a.expirationTime=f,a;case yd:return a=la(19,c,b,e),a.elementType=yd,a.expirationTime=f,a;default:if("object"===typeof a&&null!==a)switch(a.$$typeof){case Cf:g=10;break a;case Bf:g=9;break a;case zd:g=11;break a;case Ad:g=14;break a;case Ef:g=16;d=null;break a;case Df:g=
22;break a}throw Error(k(130,null==a?a:typeof a,""));}b=la(g,c,b,e);b.elementType=a;b.type=d;b.expirationTime=f;return b}function Ha(a,b,c,d){a=la(7,a,d,b);a.expirationTime=c;return a}function qe(a,b,c){a=la(6,a,null,b);a.expirationTime=c;return a}function re(a,b,c){b=la(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}function Ij(a,b,c){this.tag=b;this.current=null;this.containerInfo=
a;this.pingCache=this.pendingChildren=null;this.finishedExpirationTime=0;this.finishedWork=null;this.timeoutHandle=-1;this.pendingContext=this.context=null;this.hydrate=c;this.callbackNode=null;this.callbackPriority=90;this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}function Kh(a,b){var c=a.firstSuspendedTime;a=a.lastSuspendedTime;return 0!==c&&c>=b&&a<=b}function Ya(a,b){var c=a.firstSuspendedTime,d=a.lastSuspendedTime;
c<b&&(a.firstSuspendedTime=b);if(d>b||0===c)a.lastSuspendedTime=b;b<=a.lastPingedTime&&(a.lastPingedTime=0);b<=a.lastExpiredTime&&(a.lastExpiredTime=0)}function yh(a,b){b>a.firstPendingTime&&(a.firstPendingTime=b);var c=a.firstSuspendedTime;0!==c&&(b>=c?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:b>=a.lastSuspendedTime&&(a.lastSuspendedTime=b+1),b>a.nextKnownPendingLevel&&(a.nextKnownPendingLevel=b))}function Ue(a,b){var c=a.lastExpiredTime;if(0===c||c>b)a.lastExpiredTime=b}
function md(a,b,c,d){var e=b.current,f=ka(),g=Vb.suspense;f=Va(f,e,g);a:if(c){c=c._reactInternalFiber;b:{if(Na(c)!==c||1!==c.tag)throw Error(k(170));var h=c;do{switch(h.tag){case 3:h=h.stateNode.context;break b;case 1:if(N(h.type)){h=h.stateNode.__reactInternalMemoizedMergedChildContext;break b}}h=h.return}while(null!==h);throw Error(k(171));}if(1===c.tag){var m=c.type;if(N(m)){c=Gg(c,m,h);break a}}c=h}else c=Ca;null===b.context?b.context=c:b.pendingContext=c;b=Ea(f,g);b.payload={element:a};d=void 0===
d?null:d;null!==d&&(b.callback=d);Fa(e,b);Ja(e,f);return f}function cf(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function Wh(a,b){a=a.memoizedState;null!==a&&null!==a.dehydrated&&a.retryTime<b&&(a.retryTime=b)}function df(a,b){Wh(a,b);(a=a.alternate)&&Wh(a,b)}function ef(a,b,c){c=null!=c&&!0===c.hydrate;var d=new Ij(a,b,c),e=la(3,null,null,2===b?7:1===b?3:0);d.current=e;e.stateNode=d;ne(e);a[Lb]=d.current;c&&0!==b&&
xi(a,9===a.nodeType?a:a.ownerDocument);this._internalRoot=d}function bc(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||" react-mount-point-unstable "!==a.nodeValue))}function Jj(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute("data-reactroot")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new ef(a,0,b?{hydrate:!0}:void 0)}function nd(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f._internalRoot;
if("function"===typeof e){var h=e;e=function(){var a=cf(g);h.call(a)}}md(b,g,a,e)}else{f=c._reactRootContainer=Jj(c,d);g=f._internalRoot;if("function"===typeof e){var m=e;e=function(){var a=cf(g);m.call(a)}}Rh(function(){md(b,g,a,e)})}return cf(g)}function Kj(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:gb,key:null==d?null:""+d,children:a,containerInfo:b,implementation:c}}function Xh(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;
if(!bc(b))throw Error(k(200));return Kj(a,b,null,c)}if(!ea)throw Error(k(227));var ki=function(a,b,c,d,e,f,g,h,m){var n=Array.prototype.slice.call(arguments,3);try{b.apply(c,n)}catch(C){this.onError(C)}},yb=!1,gc=null,hc=!1,pd=null,li={onError:function(a){yb=!0;gc=a}},td=null,rf=null,mf=null,ic=null,cb={},jc=[],qd={},db={},rd={},wa=!("undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement),M=ea.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.assign,
sd=null,eb=null,fb=null,ee=function(a,b){return a(b)},eg=function(a,b,c,d,e){return a(b,c,d,e)},vd=function(){},vf=ee,Oa=!1,wd=!1,Z=ea.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.Scheduler,Lj=Z.unstable_cancelCallback,ff=Z.unstable_now,$f=Z.unstable_scheduleCallback,Mj=Z.unstable_shouldYield,Yh=Z.unstable_requestPaint,Pd=Z.unstable_runWithPriority,Nj=Z.unstable_getCurrentPriorityLevel,Oj=Z.unstable_ImmediatePriority,Zh=Z.unstable_UserBlockingPriority,ag=Z.unstable_NormalPriority,Pj=Z.unstable_LowPriority,
Qj=Z.unstable_IdlePriority,oi=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,wf=Object.prototype.hasOwnProperty,yf={},xf={},E={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a){E[a]=
new L(a,0,!1,a,null,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(a){var b=a[0];E[b]=new L(b,1,!1,a[1],null,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(a){E[a]=new L(a,2,!1,a.toLowerCase(),null,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(a){E[a]=new L(a,2,!1,a,null,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a){E[a]=
new L(a,3,!1,a.toLowerCase(),null,!1)});["checked","multiple","muted","selected"].forEach(function(a){E[a]=new L(a,3,!0,a,null,!1)});["capture","download"].forEach(function(a){E[a]=new L(a,4,!1,a,null,!1)});["cols","rows","size","span"].forEach(function(a){E[a]=new L(a,6,!1,a,null,!1)});["rowSpan","start"].forEach(function(a){E[a]=new L(a,5,!1,a.toLowerCase(),null,!1)});var gf=/[\-:]([a-z])/g,hf=function(a){return a[1].toUpperCase()};"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a){var b=
a.replace(gf,hf);E[b]=new L(b,1,!1,a,null,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a){var b=a.replace(gf,hf);E[b]=new L(b,1,!1,a,"http://www.w3.org/1999/xlink",!1)});["xml:base","xml:lang","xml:space"].forEach(function(a){var b=a.replace(gf,hf);E[b]=new L(b,1,!1,a,"http://www.w3.org/XML/1998/namespace",!1)});["tabIndex","crossOrigin"].forEach(function(a){E[a]=new L(a,1,!1,a.toLowerCase(),null,!1)});E.xlinkHref=new L("xlinkHref",1,
!1,"xlink:href","http://www.w3.org/1999/xlink",!0);["src","href","action","formAction"].forEach(function(a){E[a]=new L(a,1,!1,a.toLowerCase(),null,!0)});var da=ea.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;da.hasOwnProperty("ReactCurrentDispatcher")||(da.ReactCurrentDispatcher={current:null});da.hasOwnProperty("ReactCurrentBatchConfig")||(da.ReactCurrentBatchConfig={suspense:null});var si=/^(.*)[\\\/]/,Q="function"===typeof Symbol&&Symbol.for,Pc=Q?Symbol.for("react.element"):60103,gb=Q?Symbol.for("react.portal"):
60106,Ma=Q?Symbol.for("react.fragment"):60107,Af=Q?Symbol.for("react.strict_mode"):60108,kc=Q?Symbol.for("react.profiler"):60114,Cf=Q?Symbol.for("react.provider"):60109,Bf=Q?Symbol.for("react.context"):60110,Hj=Q?Symbol.for("react.concurrent_mode"):60111,zd=Q?Symbol.for("react.forward_ref"):60112,lc=Q?Symbol.for("react.suspense"):60113,yd=Q?Symbol.for("react.suspense_list"):60120,Ad=Q?Symbol.for("react.memo"):60115,Ef=Q?Symbol.for("react.lazy"):60116,Df=Q?Symbol.for("react.block"):60121,zf="function"===
typeof Symbol&&Symbol.iterator,od,xh=function(a){return"undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if("http://www.w3.org/2000/svg"!==a.namespaceURI||"innerHTML"in a)a.innerHTML=b;else{od=od||document.createElement("div");od.innerHTML="<svg>"+b.valueOf().toString()+"</svg>";for(b=od.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}}),Wb=function(a,
b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b},ib={animationend:nc("Animation","AnimationEnd"),animationiteration:nc("Animation","AnimationIteration"),animationstart:nc("Animation","AnimationStart"),transitionend:nc("Transition","TransitionEnd")},Id={},Of={};wa&&(Of=document.createElement("div").style,"AnimationEvent"in window||(delete ib.animationend.animation,delete ib.animationiteration.animation,delete ib.animationstart.animation),"TransitionEvent"in
window||delete ib.transitionend.transition);var $h=oc("animationend"),ai=oc("animationiteration"),bi=oc("animationstart"),ci=oc("transitionend"),Db="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Pf=new ("function"===typeof WeakMap?WeakMap:Map),Ab=null,wi=function(a){if(a){var b=a._dispatchListeners,c=a._dispatchInstances;
if(Array.isArray(b))for(var d=0;d<b.length&&!a.isPropagationStopped();d++)lf(a,b[d],c[d]);else b&&lf(a,b,c);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}},qc=[],Rd=!1,fa=[],xa=null,ya=null,za=null,Eb=new Map,Fb=new Map,Jb=[],Nd="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput close cancel copy cut paste click change contextmenu reset submit".split(" "),
yi="focus blur dragenter dragleave mouseover mouseout pointerover pointerout gotpointercapture lostpointercapture".split(" "),dg={},cg=new Map,Td=new Map,Rj=["abort","abort",$h,"animationEnd",ai,"animationIteration",bi,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata",
"loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",ci,"transitionEnd","waiting","waiting"];Sd("blur blur cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focus focus input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),
0);Sd("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1);Sd(Rj,2);(function(a,b){for(var c=0;c<a.length;c++)Td.set(a[c],b)})("change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),0);var Hi=Zh,Gi=Pd,tc=!0,Kb={animationIterationCount:!0,
borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,
strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Sj=["Webkit","ms","Moz","O"];Object.keys(Kb).forEach(function(a){Sj.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);Kb[b]=Kb[a]})});var Ii=M({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}),ng="$",og="/$",$d="$?",Zd="$!",Ze=null,$e=null,We="function"===typeof setTimeout?setTimeout:void 0,vj="function"===
typeof clearTimeout?clearTimeout:void 0,jf=Math.random().toString(36).slice(2),Aa="__reactInternalInstance$"+jf,vc="__reactEventHandlers$"+jf,Lb="__reactContainere$"+jf,Ba=null,ce=null,wc=null;M(R.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():"unknown"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=xc)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():"unknown"!==
typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=xc)},persist:function(){this.isPersistent=xc},isPersistent:yc,destructor:function(){var a=this.constructor.Interface,b;for(b in a)this[b]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null;this.isPropagationStopped=this.isDefaultPrevented=yc;this._dispatchInstances=this._dispatchListeners=null}});R.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp||
Date.now()},defaultPrevented:null,isTrusted:null};R.extend=function(a){function b(){return c.apply(this,arguments)}var c=this,d=function(){};d.prototype=c.prototype;d=new d;M(d,b.prototype);b.prototype=d;b.prototype.constructor=b;b.Interface=M({},c.Interface,a);b.extend=c.extend;sg(b);return b};sg(R);var Tj=R.extend({data:null}),Uj=R.extend({data:null}),Ni=[9,13,27,32],de=wa&&"CompositionEvent"in window,cc=null;wa&&"documentMode"in document&&(cc=document.documentMode);var Vj=wa&&"TextEvent"in window&&
!cc,xg=wa&&(!de||cc&&8<cc&&11>=cc),wg=String.fromCharCode(32),ua={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},
dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},vg=!1,mb=!1,Wj={eventTypes:ua,extractEvents:function(a,b,c,d,e){var f;if(de)b:{switch(a){case "compositionstart":var g=ua.compositionStart;break b;case "compositionend":g=ua.compositionEnd;break b;case "compositionupdate":g=
ua.compositionUpdate;break b}g=void 0}else mb?tg(a,c)&&(g=ua.compositionEnd):"keydown"===a&&229===c.keyCode&&(g=ua.compositionStart);g?(xg&&"ko"!==c.locale&&(mb||g!==ua.compositionStart?g===ua.compositionEnd&&mb&&(f=rg()):(Ba=d,ce="value"in Ba?Ba.value:Ba.textContent,mb=!0)),e=Tj.getPooled(g,b,c,d),f?e.data=f:(f=ug(c),null!==f&&(e.data=f)),lb(e),f=e):f=null;(a=Vj?Oi(a,c):Pi(a,c))?(b=Uj.getPooled(ua.beforeInput,b,c,d),b.data=a,lb(b)):b=null;return null===f?b:null===b?f:[f,b]}},Qi={color:!0,date:!0,
datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0},Ag={change:{phasedRegistrationNames:{bubbled:"onChange",captured:"onChangeCapture"},dependencies:"blur change click focus input keydown keyup selectionchange".split(" ")}},Mb=null,Nb=null,kf=!1;wa&&(kf=Tf("input")&&(!document.documentMode||9<document.documentMode));var Xj={eventTypes:Ag,_isInputEventSupported:kf,extractEvents:function(a,b,c,d,e){e=b?Pa(b):window;var f=
e.nodeName&&e.nodeName.toLowerCase();if("select"===f||"input"===f&&"file"===e.type)var g=Si;else if(yg(e))if(kf)g=Wi;else{g=Ui;var h=Ti}else(f=e.nodeName)&&"input"===f.toLowerCase()&&("checkbox"===e.type||"radio"===e.type)&&(g=Vi);if(g&&(g=g(a,b)))return zg(g,c,d);h&&h(a,e,b);"blur"===a&&(a=e._wrapperState)&&a.controlled&&"number"===e.type&&Ed(e,"number",e.value)}},dc=R.extend({view:null,detail:null}),Yi={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"},di=0,ei=0,fi=!1,gi=!1,ec=dc.extend({screenX:null,
screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:fe,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)},movementX:function(a){if("movementX"in a)return a.movementX;var b=di;di=a.screenX;return fi?"mousemove"===a.type?a.screenX-b:0:(fi=!0,0)},movementY:function(a){if("movementY"in a)return a.movementY;var b=ei;ei=a.screenY;return gi?"mousemove"===
a.type?a.screenY-b:0:(gi=!0,0)}}),hi=ec.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),fc={mouseEnter:{registrationName:"onMouseEnter",dependencies:["mouseout","mouseover"]},mouseLeave:{registrationName:"onMouseLeave",dependencies:["mouseout","mouseover"]},pointerEnter:{registrationName:"onPointerEnter",dependencies:["pointerout","pointerover"]},pointerLeave:{registrationName:"onPointerLeave",dependencies:["pointerout",
"pointerover"]}},Yj={eventTypes:fc,extractEvents:function(a,b,c,d,e){var f="mouseover"===a||"pointerover"===a,g="mouseout"===a||"pointerout"===a;if(f&&0===(e&32)&&(c.relatedTarget||c.fromElement)||!g&&!f)return null;f=d.window===d?d:(f=d.ownerDocument)?f.defaultView||f.parentWindow:window;if(g){if(g=b,b=(b=c.relatedTarget||c.toElement)?Bb(b):null,null!==b){var h=Na(b);if(b!==h||5!==b.tag&&6!==b.tag)b=null}}else g=null;if(g===b)return null;if("mouseout"===a||"mouseover"===a){var m=ec;var n=fc.mouseLeave;
var l=fc.mouseEnter;var k="mouse"}else if("pointerout"===a||"pointerover"===a)m=hi,n=fc.pointerLeave,l=fc.pointerEnter,k="pointer";a=null==g?f:Pa(g);f=null==b?f:Pa(b);n=m.getPooled(n,g,c,d);n.type=k+"leave";n.target=a;n.relatedTarget=f;c=m.getPooled(l,b,c,d);c.type=k+"enter";c.target=f;c.relatedTarget=a;d=g;k=b;if(d&&k)a:{m=d;l=k;g=0;for(a=m;a;a=pa(a))g++;a=0;for(b=l;b;b=pa(b))a++;for(;0<g-a;)m=pa(m),g--;for(;0<a-g;)l=pa(l),a--;for(;g--;){if(m===l||m===l.alternate)break a;m=pa(m);l=pa(l)}m=null}else m=
null;l=m;for(m=[];d&&d!==l;){g=d.alternate;if(null!==g&&g===l)break;m.push(d);d=pa(d)}for(d=[];k&&k!==l;){g=k.alternate;if(null!==g&&g===l)break;d.push(k);k=pa(k)}for(k=0;k<m.length;k++)be(m[k],"bubbled",n);for(k=d.length;0<k--;)be(d[k],"captured",c);return 0===(e&64)?[n]:[n,c]}},Qa="function"===typeof Object.is?Object.is:Zi,$i=Object.prototype.hasOwnProperty,Zj=wa&&"documentMode"in document&&11>=document.documentMode,Eg={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"},
dependencies:"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange".split(" ")}},nb=null,he=null,Pb=null,ge=!1,ak={eventTypes:Eg,extractEvents:function(a,b,c,d,e,f){e=f||(d.window===d?d.document:9===d.nodeType?d:d.ownerDocument);if(!(f=!e)){a:{e=Jd(e);f=rd.onSelect;for(var g=0;g<f.length;g++)if(!e.has(f[g])){e=!1;break a}e=!0}f=!e}if(f)return null;e=b?Pa(b):window;switch(a){case "focus":if(yg(e)||"true"===e.contentEditable)nb=e,he=b,Pb=null;break;case "blur":Pb=he=nb=null;
break;case "mousedown":ge=!0;break;case "contextmenu":case "mouseup":case "dragend":return ge=!1,Dg(c,d);case "selectionchange":if(Zj)break;case "keydown":case "keyup":return Dg(c,d)}return null}},bk=R.extend({animationName:null,elapsedTime:null,pseudoElement:null}),ck=R.extend({clipboardData:function(a){return"clipboardData"in a?a.clipboardData:window.clipboardData}}),dk=dc.extend({relatedTarget:null}),ek={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",
Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},fk={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",
224:"Meta"},gk=dc.extend({key:function(a){if(a.key){var b=ek[a.key]||a.key;if("Unidentified"!==b)return b}return"keypress"===a.type?(a=Ac(a),13===a?"Enter":String.fromCharCode(a)):"keydown"===a.type||"keyup"===a.type?fk[a.keyCode]||"Unidentified":""},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:fe,charCode:function(a){return"keypress"===a.type?Ac(a):0},keyCode:function(a){return"keydown"===a.type||"keyup"===a.type?a.keyCode:0},which:function(a){return"keypress"===
a.type?Ac(a):"keydown"===a.type||"keyup"===a.type?a.keyCode:0}}),hk=ec.extend({dataTransfer:null}),ik=dc.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:fe}),jk=R.extend({propertyName:null,elapsedTime:null,pseudoElement:null}),kk=ec.extend({deltaX:function(a){return"deltaX"in a?a.deltaX:"wheelDeltaX"in a?-a.wheelDeltaX:0},deltaY:function(a){return"deltaY"in a?a.deltaY:"wheelDeltaY"in a?-a.wheelDeltaY:"wheelDelta"in a?
-a.wheelDelta:0},deltaZ:null,deltaMode:null}),lk={eventTypes:dg,extractEvents:function(a,b,c,d,e){e=cg.get(a);if(!e)return null;switch(a){case "keypress":if(0===Ac(c))return null;case "keydown":case "keyup":a=gk;break;case "blur":case "focus":a=dk;break;case "click":if(2===c.button)return null;case "auxclick":case "dblclick":case "mousedown":case "mousemove":case "mouseup":case "mouseout":case "mouseover":case "contextmenu":a=ec;break;case "drag":case "dragend":case "dragenter":case "dragexit":case "dragleave":case "dragover":case "dragstart":case "drop":a=
hk;break;case "touchcancel":case "touchend":case "touchmove":case "touchstart":a=ik;break;case $h:case ai:case bi:a=bk;break;case ci:a=jk;break;case "scroll":a=dc;break;case "wheel":a=kk;break;case "copy":case "cut":case "paste":a=ck;break;case "gotpointercapture":case "lostpointercapture":case "pointercancel":case "pointerdown":case "pointermove":case "pointerout":case "pointerover":case "pointerup":a=hi;break;default:a=R}b=a.getPooled(e,b,c,d);lb(b);return b}};(function(a){if(ic)throw Error(k(101));
ic=Array.prototype.slice.call(a);nf()})("ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin".split(" "));(function(a,b,c){td=a;rf=b;mf=c})(ae,Hb,Pa);pf({SimpleEventPlugin:lk,EnterLeaveEventPlugin:Yj,ChangeEventPlugin:Xj,SelectEventPlugin:ak,BeforeInputEventPlugin:Wj});var ie=[],ob=-1,Ca={},B={current:Ca},G={current:!1},Ra=Ca,bj=Pd,je=$f,Rg=Lj,aj=Nj,Dc=Oj,Ig=Zh,Jg=ag,Kg=Pj,Lg=Qj,Qg={},yj=Mj,Cj=void 0!==Yh?Yh:function(){},qa=null,
Ec=null,ke=!1,ii=ff(),Y=1E4>ii?ff:function(){return ff()-ii},Ic={current:null},Hc=null,qb=null,Gc=null,Tg=0,Jc=2,Ga=!1,Vb=da.ReactCurrentBatchConfig,$g=(new ea.Component).refs,Mc={isMounted:function(a){return(a=a._reactInternalFiber)?Na(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=ka(),e=Vb.suspense;d=Va(d,a,e);e=Ea(d,e);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);Fa(a,e);Ja(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=ka(),e=Vb.suspense;
d=Va(d,a,e);e=Ea(d,e);e.tag=1;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);Fa(a,e);Ja(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=ka(),d=Vb.suspense;c=Va(c,a,d);d=Ea(c,d);d.tag=Jc;void 0!==b&&null!==b&&(d.callback=b);Fa(a,d);Ja(a,c)}},Qc=Array.isArray,wb=ah(!0),Fe=ah(!1),Sb={},ja={current:Sb},Ub={current:Sb},Tb={current:Sb},D={current:0},Sc=da.ReactCurrentDispatcher,X=da.ReactCurrentBatchConfig,Ia=0,z=null,K=null,J=null,Uc=!1,Tc={readContext:W,useCallback:S,useContext:S,
useEffect:S,useImperativeHandle:S,useLayoutEffect:S,useMemo:S,useReducer:S,useRef:S,useState:S,useDebugValue:S,useResponder:S,useDeferredValue:S,useTransition:S},dj={readContext:W,useCallback:ih,useContext:W,useEffect:eh,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ze(4,2,gh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ze(4,2,a,b)},useMemo:function(a,b){var c=ub();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=
ub();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={pending:null,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};a=a.dispatch=ch.bind(null,z,a);return[d.memoizedState,a]},useRef:function(a){var b=ub();a={current:a};return b.memoizedState=a},useState:xe,useDebugValue:Be,useResponder:ue,useDeferredValue:function(a,b){var c=xe(a),d=c[0],e=c[1];eh(function(){var c=X.suspense;X.suspense=void 0===b?null:b;try{e(a)}finally{X.suspense=c}},[a,b]);return d},useTransition:function(a){var b=
xe(!1),c=b[0];b=b[1];return[ih(Ce.bind(null,b,a),[b,a]),c]}},ej={readContext:W,useCallback:Yc,useContext:W,useEffect:Xc,useImperativeHandle:hh,useLayoutEffect:fh,useMemo:jh,useReducer:Vc,useRef:dh,useState:function(a){return Vc(Ua)},useDebugValue:Be,useResponder:ue,useDeferredValue:function(a,b){var c=Vc(Ua),d=c[0],e=c[1];Xc(function(){var c=X.suspense;X.suspense=void 0===b?null:b;try{e(a)}finally{X.suspense=c}},[a,b]);return d},useTransition:function(a){var b=Vc(Ua),c=b[0];b=b[1];return[Yc(Ce.bind(null,
b,a),[b,a]),c]}},fj={readContext:W,useCallback:Yc,useContext:W,useEffect:Xc,useImperativeHandle:hh,useLayoutEffect:fh,useMemo:jh,useReducer:Wc,useRef:dh,useState:function(a){return Wc(Ua)},useDebugValue:Be,useResponder:ue,useDeferredValue:function(a,b){var c=Wc(Ua),d=c[0],e=c[1];Xc(function(){var c=X.suspense;X.suspense=void 0===b?null:b;try{e(a)}finally{X.suspense=c}},[a,b]);return d},useTransition:function(a){var b=Wc(Ua),c=b[0];b=b[1];return[Yc(Ce.bind(null,b,a),[b,a]),c]}},ra=null,Ka=null,Wa=
!1,gj=da.ReactCurrentOwner,ia=!1,Je={dehydrated:null,retryTime:0};var jj=function(a,b,c,d){for(c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};var wh=function(a){};var ij=function(a,b,c,d,e){var f=a.memoizedProps;if(f!==d){var g=b.stateNode;Ta(ja.current);a=null;switch(c){case "input":f=
Cd(g,f);d=Cd(g,d);a=[];break;case "option":f=Fd(g,f);d=Fd(g,d);a=[];break;case "select":f=M({},f,{value:void 0});d=M({},d,{value:void 0});a=[];break;case "textarea":f=Gd(g,f);d=Gd(g,d);a=[];break;default:"function"!==typeof f.onClick&&"function"===typeof d.onClick&&(g.onclick=uc)}Ud(c,d);var h,m;c=null;for(h in f)if(!d.hasOwnProperty(h)&&f.hasOwnProperty(h)&&null!=f[h])if("style"===h)for(m in g=f[h],g)g.hasOwnProperty(m)&&(c||(c={}),c[m]="");else"dangerouslySetInnerHTML"!==h&&"children"!==h&&"suppressContentEditableWarning"!==
h&&"suppressHydrationWarning"!==h&&"autoFocus"!==h&&(db.hasOwnProperty(h)?a||(a=[]):(a=a||[]).push(h,null));for(h in d){var k=d[h];g=null!=f?f[h]:void 0;if(d.hasOwnProperty(h)&&k!==g&&(null!=k||null!=g))if("style"===h)if(g){for(m in g)!g.hasOwnProperty(m)||k&&k.hasOwnProperty(m)||(c||(c={}),c[m]="");for(m in k)k.hasOwnProperty(m)&&g[m]!==k[m]&&(c||(c={}),c[m]=k[m])}else c||(a||(a=[]),a.push(h,c)),c=k;else"dangerouslySetInnerHTML"===h?(k=k?k.__html:void 0,g=g?g.__html:void 0,null!=k&&g!==k&&(a=a||
[]).push(h,k)):"children"===h?g===k||"string"!==typeof k&&"number"!==typeof k||(a=a||[]).push(h,""+k):"suppressContentEditableWarning"!==h&&"suppressHydrationWarning"!==h&&(db.hasOwnProperty(h)?(null!=k&&oa(e,h),a||g===k||(a=[])):(a=a||[]).push(h,k))}c&&(a=a||[]).push("style",c);e=a;if(b.updateQueue=e)b.effectTag|=4}};var kj=function(a,b,c,d){c!==d&&(b.effectTag|=4)};var pj="function"===typeof WeakSet?WeakSet:Set,wj="function"===typeof WeakMap?WeakMap:Map,sj=Math.ceil,gd=da.ReactCurrentDispatcher,
Uh=da.ReactCurrentOwner,H=0,Ye=8,ca=16,ma=32,Xa=0,hd=1,Oh=2,ad=3,bd=4,Xe=5,p=H,U=null,t=null,P=0,F=Xa,id=null,ta=1073741823,Yb=1073741823,kd=null,Xb=0,jd=!1,Re=0,Ph=500,l=null,cd=!1,Se=null,La=null,ld=!1,Zb=null,$b=90,bb=null,ac=0,af=null,dd=0,Ja=function(a,b){if(50<ac)throw ac=0,af=null,Error(k(185));a=ed(a,b);if(null!==a){var c=Cc();1073741823===b?(p&Ye)!==H&&(p&(ca|ma))===H?Te(a):(V(a),p===H&&ha()):V(a);(p&4)===H||98!==c&&99!==c||(null===bb?bb=new Map([[a,b]]):(c=bb.get(a),(void 0===c||c>b)&&bb.set(a,
b)))}};var zj=function(a,b,c){var d=b.expirationTime;if(null!==a){var e=b.pendingProps;if(a.memoizedProps!==e||G.current)ia=!0;else{if(d<c){ia=!1;switch(b.tag){case 3:sh(b);Ee();break;case 5:bh(b);if(b.mode&4&&1!==c&&e.hidden)return b.expirationTime=b.childExpirationTime=1,null;break;case 1:N(b.type)&&Bc(b);break;case 4:se(b,b.stateNode.containerInfo);break;case 10:d=b.memoizedProps.value;e=b.type._context;y(Ic,e._currentValue);e._currentValue=d;break;case 13:if(null!==b.memoizedState){d=b.child.childExpirationTime;
if(0!==d&&d>=c)return th(a,b,c);y(D,D.current&1);b=sa(a,b,c);return null!==b?b.sibling:null}y(D,D.current&1);break;case 19:d=b.childExpirationTime>=c;if(0!==(a.effectTag&64)){if(d)return vh(a,b,c);b.effectTag|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null);y(D,D.current);if(!d)return null}return sa(a,b,c)}ia=!1}}else ia=!1;b.expirationTime=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;e=pb(b,B.current);rb(b,c);e=we(null,
b,d,a,e,c);b.effectTag|=1;if("object"===typeof e&&null!==e&&"function"===typeof e.render&&void 0===e.$$typeof){b.tag=1;b.memoizedState=null;b.updateQueue=null;if(N(d)){var f=!0;Bc(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;ne(b);var g=d.getDerivedStateFromProps;"function"===typeof g&&Lc(b,d,g,a);e.updater=Mc;b.stateNode=e;e._reactInternalFiber=b;pe(b,d,a,c);b=Ie(null,b,d,!0,f,c)}else b.tag=0,T(null,b,e,c),b=b.child;return b;case 16:a:{e=b.elementType;null!==a&&(a.alternate=
null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;ri(e);if(1!==e._status)throw e._result;e=e._result;b.type=e;f=b.tag=Gj(e);a=aa(e,a);switch(f){case 0:b=He(null,b,e,a,c);break a;case 1:b=rh(null,b,e,a,c);break a;case 11:b=nh(null,b,e,a,c);break a;case 14:b=oh(null,b,e,aa(e.type,a),d,c);break a}throw Error(k(306,e,""));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:aa(d,e),He(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:aa(d,e),rh(a,b,d,e,c);
case 3:sh(b);d=b.updateQueue;if(null===a||null===d)throw Error(k(282));d=b.pendingProps;e=b.memoizedState;e=null!==e?e.element:null;oe(a,b);Qb(b,d,null,c);d=b.memoizedState.element;if(d===e)Ee(),b=sa(a,b,c);else{if(e=b.stateNode.hydrate)Ka=kb(b.stateNode.containerInfo.firstChild),ra=b,e=Wa=!0;if(e)for(c=Fe(b,null,d,c),b.child=c;c;)c.effectTag=c.effectTag&-3|1024,c=c.sibling;else T(a,b,d,c),Ee();b=b.child}return b;case 5:return bh(b),null===a&&De(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:
null,g=e.children,Yd(d,e)?g=null:null!==f&&Yd(d,f)&&(b.effectTag|=16),qh(a,b),b.mode&4&&1!==c&&e.hidden?(b.expirationTime=b.childExpirationTime=1,b=null):(T(a,b,g,c),b=b.child),b;case 6:return null===a&&De(b),null;case 13:return th(a,b,c);case 4:return se(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=wb(b,null,d,c):T(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:aa(d,e),nh(a,b,d,e,c);case 7:return T(a,b,b.pendingProps,c),b.child;case 8:return T(a,
b,b.pendingProps.children,c),b.child;case 12:return T(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;g=b.memoizedProps;f=e.value;var h=b.type._context;y(Ic,h._currentValue);h._currentValue=f;if(null!==g)if(h=g.value,f=Qa(h,f)?0:("function"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0,0===f){if(g.children===e.children&&!G.current){b=sa(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var m=h.dependencies;if(null!==
m){g=h.child;for(var l=m.firstContext;null!==l;){if(l.context===d&&0!==(l.observedBits&f)){1===h.tag&&(l=Ea(c,null),l.tag=Jc,Fa(h,l));h.expirationTime<c&&(h.expirationTime=c);l=h.alternate;null!==l&&l.expirationTime<c&&(l.expirationTime=c);Sg(h.return,c);m.expirationTime<c&&(m.expirationTime=c);break}l=l.next}}else g=10===h.tag?h.type===b.type?null:h.child:h.child;if(null!==g)g.return=h;else for(g=h;null!==g;){if(g===b){g=null;break}h=g.sibling;if(null!==h){h.return=g.return;g=h;break}g=g.return}h=
g}T(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,f=b.pendingProps,d=f.children,rb(b,c),e=W(e,f.unstable_observedBits),d=d(e),b.effectTag|=1,T(a,b,d,c),b.child;case 14:return e=b.type,f=aa(e,b.pendingProps),f=aa(e.type,f),oh(a,b,e,f,d,c);case 15:return ph(a,b,b.type,b.pendingProps,d,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:aa(d,e),null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),b.tag=1,N(d)?(a=!0,Bc(b)):a=!1,rb(b,c),Yg(b,d,e),pe(b,d,e,c),Ie(null,
b,d,!0,a,c);case 19:return vh(a,b,c)}throw Error(k(156,b.tag));};var bf=null,Ne=null,la=function(a,b,c,d){return new Fj(a,b,c,d)};ef.prototype.render=function(a){md(a,this._internalRoot,null,null)};ef.prototype.unmount=function(){var a=this._internalRoot,b=a.containerInfo;md(null,a,null,function(){b[Lb]=null})};var Di=function(a){if(13===a.tag){var b=Fc(ka(),150,100);Ja(a,b);df(a,b)}};var Yf=function(a){13===a.tag&&(Ja(a,3),df(a,3))};var Bi=function(a){if(13===a.tag){var b=ka();b=Va(b,a,null);Ja(a,
b);df(a,b)}};sd=function(a,b,c){switch(b){case "input":Dd(a,c);b=c.name;if("radio"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll("input[name="+JSON.stringify(""+b)+'][type="radio"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=ae(d);if(!e)throw Error(k(90));Gf(d);Dd(d,e)}}}break;case "textarea":Lf(a,c);break;case "select":b=c.value,null!=b&&hb(a,!!c.multiple,b,!1)}};(function(a,b,c,d){ee=a;eg=b;vd=c;vf=d})(Qh,function(a,b,c,d,e){var f=p;p|=4;
try{return Da(98,a.bind(null,b,c,d,e))}finally{p=f,p===H&&ha()}},function(){(p&(1|ca|ma))===H&&(uj(),xb())},function(a,b){var c=p;p|=2;try{return a(b)}finally{p=c,p===H&&ha()}});var mk={Events:[Hb,Pa,ae,pf,qd,lb,function(a){Kd(a,Ki)},sf,tf,sc,pc,xb,{current:!1}]};(function(a){var b=a.findFiberByHostInstance;return Ej(M({},a,{overrideHookState:null,overrideProps:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:da.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=Sf(a);
return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null}))})({findFiberByHostInstance:Bb,bundleType:0,version:"16.13.1",rendererPackageName:"react-dom"});I.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=mk;I.createPortal=Xh;I.findDOMNode=function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternalFiber;if(void 0===
b){if("function"===typeof a.render)throw Error(k(188));throw Error(k(268,Object.keys(a)));}a=Sf(b);a=null===a?null:a.stateNode;return a};I.flushSync=function(a,b){if((p&(ca|ma))!==H)throw Error(k(187));var c=p;p|=1;try{return Da(99,a.bind(null,b))}finally{p=c,ha()}};I.hydrate=function(a,b,c){if(!bc(b))throw Error(k(200));return nd(null,a,b,!0,c)};I.render=function(a,b,c){if(!bc(b))throw Error(k(200));return nd(null,a,b,!1,c)};I.unmountComponentAtNode=function(a){if(!bc(a))throw Error(k(40));return a._reactRootContainer?
(Rh(function(){nd(null,null,a,!1,function(){a._reactRootContainer=null;a[Lb]=null})}),!0):!1};I.unstable_batchedUpdates=Qh;I.unstable_createPortal=function(a,b){return Xh(a,b,2<arguments.length&&void 0!==arguments[2]?arguments[2]:null)};I.unstable_renderSubtreeIntoContainer=function(a,b,c,d){if(!bc(c))throw Error(k(200));if(null==a||void 0===a._reactInternalFiber)throw Error(k(38));return nd(a,b,c,!1,d)};I.version="16.13.1"});
</script>
    <script>const e = React.createElement;

function pathToString(path) {
  if (path[0] === '/') {
    return '/' + path.slice(1).join('/');
  } else {
    return path.join('/');
  }
}

function findCommonPath(files) {
  if (!files || !files.length) {
    return [];
  }

  function isPrefix(arr, prefix) {
    if (arr.length < prefix.length) {
      return false;
    }
    for (let i = prefix.length - 1; i >= 0; --i) {
      if (arr[i] !== prefix[i]) {
        return false;
      }
    }
    return true;
  }

  let commonPath = files[0].path.slice(0, -1);
  while (commonPath.length) {
    if (files.every(file => isPrefix(file.path, commonPath))) {
      break;
    }
    commonPath.pop();
  }
  return commonPath;
}

function findFolders(files) {
  if (!files || !files.length) {
    return [];
  }

  let folders = files.filter(file => file.path.length > 1).map(file => file.path[0]);
  folders = [...new Set(folders)]; // unique
  folders.sort();

  folders = folders.map(folder => {
    let filesInFolder = files
      .filter(file => file.path[0] === folder)
      .map(file => ({
        ...file,
        path: file.path.slice(1),
        parent: [...file.parent, file.path[0]],
      }));

    const children = findFolders(filesInFolder); // recursion

    return {
      is_folder: true,
      path: [folder],
      parent: files[0].parent,
      children,
      covered: children.reduce((sum, file) => sum + file.covered, 0),
      coverable: children.reduce((sum, file) => sum + file.coverable, 0),
      prevRun: {
        covered: children.reduce((sum, file) => sum + file.prevRun.covered, 0),
        coverable: children.reduce((sum, file) => sum + file.prevRun.coverable, 0),
      },
    };
  });

  return [...folders, ...files.filter(file => file.path.length === 1)];
}

class App extends React.Component {
  constructor(...args) {
    super(...args);

    this.state = {
      current: [],
    };
  }

  componentDidMount() {
    this.updateStateFromLocation();
    window.addEventListener('hashchange', () => this.updateStateFromLocation(), false);
  }

  updateStateFromLocation() {
    if (window.location.hash.length > 1) {
      const current = window.location.hash.slice(1).split('/');
      this.setState({current});
    } else {
      this.setState({current: []});
    }
  }

  getCurrentPath() {
    let file = this.props.root;
    let path = [file];
    for (let p of this.state.current) {
      file = file.children.find(file => file.path[0] === p);
      if (!file) {
        return path;
      }
      path.push(file);
    }
    return path;
  }

  render() {
    const path = this.getCurrentPath();
    const file = path[path.length - 1];

    let w = null;
    if (file.is_folder) {
      w = e(FilesList, {
        folder: file,
        onSelectFile: this.selectFile.bind(this),
        onBack: path.length > 1 ? this.back.bind(this) : null,
      });
    } else {
      w = e(DisplayFile, {
        file,
        onBack: this.back.bind(this),
      });
    }

    return e('div', {className: 'app'}, w);
  }

  selectFile(file) {
    this.setState(
      ({current}) => {
        return {current: [...current, file.path[0]]};
      },
      () => this.updateHash(),
    );
  }

  back(file) {
    this.setState(
      ({current}) => {
        return {current: current.slice(0, current.length - 1)};
      },
      () => this.updateHash(),
    );
  }

  updateHash() {
    if (!this.state.current || !this.state.current.length) {
      window.location = '#';
    } else {
      window.location = '#' + this.state.current.join('/');
    }
  }
}

function FilesList({folder, onSelectFile, onBack}) {
  let files = folder.children;
  return e(
    'div',
    {className: 'display-folder'},
    e(FileHeader, {file: folder, onBack}),
    e(
      'table',
      {className: 'files-list'},
      e('thead', {className: 'files-list__head'}, e('tr', null, e('th', null, 'Path'), e('th', null, 'Coverage'))),
      e(
        'tbody',
        {className: 'files-list__body'},
        files.map(file => e(File, {file, onClick: onSelectFile})),
      ),
    ),
  );
}

function File({file, onClick}) {
  const coverage = file.coverable ? (file.covered / file.coverable) * 100 : -1;
  const coverageDelta =
    file.prevRun && (file.covered / file.coverable) * 100 - (file.prevRun.covered / file.prevRun.coverable) * 100;

  return e(
    'tr',
    {
      className:
        'files-list__file' +
        (coverage >= 0 && coverage < 50 ? ' files-list__file_low' : '') +
        (coverage >= 50 && coverage < 80 ? ' files-list__file_medium' : '') +
        (coverage >= 80 ? ' files-list__file_high' : '') +
        (file.is_folder ? ' files-list__file_folder' : ''),
      onClick: () => onClick(file),
    },
    e('td', null, e('a', null, pathToString(file.path))),
    e(
      'td',
      null,
      file.covered + ' / ' + file.coverable + (coverage >= 0 ? ' (' + coverage.toFixed(2) + '%)' : ''),
      e(
        'span',
        {title: 'Change from the previous run'},
        coverageDelta ? ` (${coverageDelta > 0 ? '+' : ''}${coverageDelta.toFixed(2)}%)` : '',
      ),
    ),
  );
}

function DisplayFile({file, onBack}) {
  return e('div', {className: 'display-file'}, e(FileHeader, {file, onBack}), e(FileContent, {file}));
}

function FileHeader({file, onBack}) {
  const coverage = (file.covered / file.coverable) * 100;
  const coverageDelta = file.prevRun && coverage - (file.prevRun.covered / file.prevRun.coverable) * 100;

  return e(
    'div',
    {className: 'file-header'},
    onBack ? e('a', {className: 'file-header__back', onClick: onBack}, 'Back') : null,
    e('div', {className: 'file-header__name'}, pathToString([...file.parent, ...file.path])),
    e(
      'div',
      {className: 'file-header__stat'},
      'Covered: ' + file.covered + ' of ' + file.coverable + (file.coverable ? ' (' + coverage.toFixed(2) + '%)' : ''),
      e(
        'span',
        {title: 'Change from the previous run'},
        coverageDelta ? ` (${coverageDelta > 0 ? '+' : ''}${coverageDelta.toFixed(2)}%)` : '',
      ),
      e('input', {id: 'theme-toggle', type: 'checkbox', hidden: true}),
      e('label', {for: 'theme-toggle', id: 'theme-toggle-label'}, '🌙'),
    ),
  );
}

function FileContent({file}) {
  return e(
    'pre',
    {className: 'file-content'},
    file.content.split(/\r?\n/).map((line, index) => {
      const trace = file.traces.find(trace => trace.line === index + 1);
      const covered = trace && trace.stats.Line;
      const uncovered = trace && !trace.stats.Line;
      const nbHit = covered? trace.stats.Line: 0;
      return e(
        'div',
        { className: 'code-text-container' },
        e(
          'code',
          {
            className: 'code-line' + (covered ? ' code-line_covered' : '') + (uncovered ? ' code-line_uncovered' : ''),
          },
          line
        ),
        e(
          'div',
          { className: 'cover-indicator' + (covered? ' check-cover': '') + (uncovered? ' no-cover': '')},
          e(
            'div',
            { className: (covered? 'stat-line-hit': '')},
            covered? nbHit: ""
          )
        )
      );
    }),
  );
}

(function () {
  const commonPath = findCommonPath(data.files);
  const prevFilesMap = new Map();

  previousData &&
    previousData.files.forEach(file => {
      const path = file.path.slice(commonPath.length).join('/');
      prevFilesMap.set(path, file);
    });

  const files = data.files.map(file => {
    const path = file.path.slice(commonPath.length);
    const {covered = 0, coverable = 0} = prevFilesMap.get(path.join('/')) || {};
    return {
      ...file,
      path,
      parent: commonPath,
      prevRun: {covered, coverable},
    };
  });

  const children = findFolders(files);

  const root = {
    is_folder: true,
    children,
    path: commonPath,
    parent: [],
    covered: children.reduce((sum, file) => sum + file.covered, 0),
    coverable: children.reduce((sum, file) => sum + file.coverable, 0),
    prevRun: {
      covered: children.reduce((sum, file) => sum + file.prevRun.covered, 0),
      coverable: children.reduce((sum, file) => sum + file.prevRun.coverable, 0),
    },
  };

  ReactDOM.render(e(App, {root, prevFilesMap}), document.getElementById('root'));

  const toggle = document.getElementById('theme-toggle');
  const label = document.getElementById('theme-toggle-label');
  label.textContent = '🌙';

  toggle.addEventListener('change', () => {
    if (toggle.checked) {
      document.documentElement.setAttribute('data-theme', 'dark');
      label.textContent = '☀️';
    } else {
      document.documentElement.removeAttribute('data-theme');
      label.textContent = '🌙';
    }
  });
})();
</script>
</body>
</html>