@beaconlabs-io/evidence 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +256 -0
- package/deployments/00.json +34 -0
- package/deployments/01.json +28 -0
- package/deployments/02.json +34 -0
- package/deployments/03.json +40 -0
- package/deployments/04.json +40 -0
- package/deployments/05.json +28 -0
- package/deployments/06.json +28 -0
- package/deployments/07.json +28 -0
- package/deployments/08.json +28 -0
- package/deployments/09.json +28 -0
- package/deployments/10.json +40 -0
- package/deployments/11.json +28 -0
- package/deployments/12.json +22 -0
- package/deployments/13.json +22 -0
- package/deployments/14.json +34 -0
- package/deployments/15.json +22 -0
- package/deployments/16.json +34 -0
- package/deployments/17.json +22 -0
- package/deployments/18.json +40 -0
- package/deployments/19.json +40 -0
- package/deployments/20.json +40 -0
- package/dist/content/deployments.d.ts +5 -0
- package/dist/content/deployments.d.ts.map +1 -0
- package/dist/content/deployments.js +664 -0
- package/dist/content/deployments.js.map +1 -0
- package/dist/content/evidence.d.ts +5 -0
- package/dist/content/evidence.d.ts.map +1 -0
- package/dist/content/evidence.js +678 -0
- package/dist/content/evidence.js.map +1 -0
- package/dist/content/index.d.ts +31 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/index.js +72 -0
- package/dist/content/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +130 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +75 -0
- package/dist/types.js.map +1 -0
- package/evidence/00.mdx +78 -0
- package/evidence/01.mdx +115 -0
- package/evidence/02.mdx +72 -0
- package/evidence/03.mdx +74 -0
- package/evidence/04.mdx +81 -0
- package/evidence/05.mdx +83 -0
- package/evidence/06.mdx +61 -0
- package/evidence/07.mdx +61 -0
- package/evidence/08.mdx +57 -0
- package/evidence/09.mdx +63 -0
- package/evidence/10.mdx +60 -0
- package/evidence/11.mdx +58 -0
- package/evidence/12.mdx +62 -0
- package/evidence/13.mdx +53 -0
- package/evidence/14.mdx +52 -0
- package/evidence/15.mdx +53 -0
- package/evidence/16.mdx +52 -0
- package/evidence/17.mdx +53 -0
- package/evidence/18.mdx +52 -0
- package/evidence/19.mdx +54 -0
- package/evidence/20.mdx +53 -0
- package/package.json +75 -0
package/README.md
ADDED
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# @beaconlabs-io/evidence
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@beaconlabs-io/evidence)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
|
|
6
|
+
A collection of structured research evidence with Zod schemas and TypeScript types for the Beacon Labs MUSE platform.
|
|
7
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install @beaconlabs-io/evidence
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
**Peer Dependencies:** This package requires `zod` v4.
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
### Import Paths
|
|
19
|
+
|
|
20
|
+
The package provides three entry points:
|
|
21
|
+
|
|
22
|
+
| Entry Point | Description |
|
|
23
|
+
| --------------------------------- | ---------------------------- |
|
|
24
|
+
| `@beaconlabs-io/evidence` | Everything (types + content) |
|
|
25
|
+
| `@beaconlabs-io/evidence/types` | Types and Zod schemas only |
|
|
26
|
+
| `@beaconlabs-io/evidence/content` | Content accessors only |
|
|
27
|
+
|
|
28
|
+
### Types and Schemas
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
import type {
|
|
32
|
+
Evidence,
|
|
33
|
+
EvidenceFrontmatter,
|
|
34
|
+
EvidenceResult,
|
|
35
|
+
EvidenceDeployment,
|
|
36
|
+
StrengthLevel,
|
|
37
|
+
OutcomeEffect,
|
|
38
|
+
} from "@beaconlabs-io/evidence/types";
|
|
39
|
+
|
|
40
|
+
import {
|
|
41
|
+
EvidenceFrontmatterSchema,
|
|
42
|
+
EvidenceResultSchema,
|
|
43
|
+
EvidenceDeploymentSchema,
|
|
44
|
+
STRENGTH_LEVELS,
|
|
45
|
+
OUTCOME_EFFECTS,
|
|
46
|
+
} from "@beaconlabs-io/evidence/types";
|
|
47
|
+
|
|
48
|
+
// Validate evidence data
|
|
49
|
+
const result = EvidenceFrontmatterSchema.safeParse(data);
|
|
50
|
+
if (result.success) {
|
|
51
|
+
console.log(result.data.title);
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Content Accessors
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
import {
|
|
59
|
+
getEvidence,
|
|
60
|
+
getAllEvidence,
|
|
61
|
+
getAllEvidenceMeta,
|
|
62
|
+
getDeployment,
|
|
63
|
+
getEvidenceWithDeployment,
|
|
64
|
+
getAllEvidenceSlugs,
|
|
65
|
+
} from "@beaconlabs-io/evidence/content";
|
|
66
|
+
|
|
67
|
+
// Get single evidence by slug
|
|
68
|
+
const evidence = getEvidence("00");
|
|
69
|
+
// Returns: { frontmatter, content, raw }
|
|
70
|
+
|
|
71
|
+
// Get all evidence metadata (for lists)
|
|
72
|
+
const allMeta = getAllEvidenceMeta();
|
|
73
|
+
// Returns: EvidenceFrontmatter[]
|
|
74
|
+
|
|
75
|
+
// Get evidence with deployment info (attestation, IPFS hash)
|
|
76
|
+
const full = getEvidenceWithDeployment("00");
|
|
77
|
+
// Returns: Evidence (frontmatter + deployment merged)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Using with MDX Compilers
|
|
81
|
+
|
|
82
|
+
The `raw` field contains the complete MDX file content, which can be passed directly to MDX compilers like `next-mdx-remote`:
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
import { getEvidence } from "@beaconlabs-io/evidence/content";
|
|
86
|
+
import { compileMDX } from "next-mdx-remote/rsc";
|
|
87
|
+
|
|
88
|
+
const evidence = getEvidence("00");
|
|
89
|
+
if (evidence) {
|
|
90
|
+
const { content } = await compileMDX({
|
|
91
|
+
source: evidence.raw,
|
|
92
|
+
options: {
|
|
93
|
+
parseFrontmatter: true,
|
|
94
|
+
mdxOptions: {
|
|
95
|
+
remarkPlugins: [remarkGfm, remarkMath],
|
|
96
|
+
rehypePlugins: [rehypeSlug, rehypeKatex],
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## API Reference
|
|
104
|
+
|
|
105
|
+
### Types
|
|
106
|
+
|
|
107
|
+
| Type | Description |
|
|
108
|
+
| --------------------- | -------------------------------------------------------------------- |
|
|
109
|
+
| `Evidence` | Complete evidence type (frontmatter + deployment metadata) |
|
|
110
|
+
| `EvidenceFrontmatter` | MDX frontmatter fields |
|
|
111
|
+
| `EvidenceResult` | Intervention outcome (`{ intervention, outcome_variable, outcome }`) |
|
|
112
|
+
| `EvidenceCitation` | Citation reference (`{ name, type?, src? }`) |
|
|
113
|
+
| `EvidenceDeployment` | Deployment metadata (`{ attestationUID, ipfsHash, timestamp, ... }`) |
|
|
114
|
+
| `BundledEvidence` | Bundled content (`{ frontmatter, content, raw }`) |
|
|
115
|
+
| `StrengthLevel` | `"0" \| "1" \| "2" \| "3" \| "4" \| "5"` (SMS scale) |
|
|
116
|
+
| `OutcomeEffect` | `"N/A" \| "+" \| "-" \| "+-" \| "!"` |
|
|
117
|
+
|
|
118
|
+
### Zod Schemas
|
|
119
|
+
|
|
120
|
+
| Schema | Description |
|
|
121
|
+
| --------------------------- | ---------------------------------------- |
|
|
122
|
+
| `EvidenceFrontmatterSchema` | Validates MDX frontmatter |
|
|
123
|
+
| `EvidenceResultSchema` | Validates result objects |
|
|
124
|
+
| `EvidenceCitationSchema` | Validates citation objects |
|
|
125
|
+
| `EvidenceDeploymentSchema` | Validates deployment metadata |
|
|
126
|
+
| `EvidenceSchema` | Full evidence (frontmatter + deployment) |
|
|
127
|
+
|
|
128
|
+
### Content Functions
|
|
129
|
+
|
|
130
|
+
| Function | Returns | Description |
|
|
131
|
+
| --------------------------------- | --------------------------------- | -------------------------------- |
|
|
132
|
+
| `getEvidence(slug)` | `BundledEvidence \| undefined` | Get evidence by slug |
|
|
133
|
+
| `getDeployment(slug)` | `EvidenceDeployment \| undefined` | Get deployment metadata |
|
|
134
|
+
| `getEvidenceWithDeployment(slug)` | `Evidence \| undefined` | Get merged evidence + deployment |
|
|
135
|
+
| `getAllEvidenceMeta()` | `EvidenceFrontmatter[]` | Get all frontmatter (sorted) |
|
|
136
|
+
| `getAllEvidence()` | `Evidence[]` | Get all evidence with deployment |
|
|
137
|
+
| `getAllEvidenceSlugs()` | `readonly string[]` | Get all available slugs |
|
|
138
|
+
|
|
139
|
+
### Constants
|
|
140
|
+
|
|
141
|
+
| Constant | Value |
|
|
142
|
+
| ----------------- | -------------------------------- |
|
|
143
|
+
| `STRENGTH_LEVELS` | `["0", "1", "2", "3", "4", "5"]` |
|
|
144
|
+
| `OUTCOME_EFFECTS` | `["N/A", "+", "-", "+-", "!"]` |
|
|
145
|
+
|
|
146
|
+
## Evidence File Format
|
|
147
|
+
|
|
148
|
+
Evidence files are MDX with YAML frontmatter located in `evidence/*.mdx`:
|
|
149
|
+
|
|
150
|
+
```yaml
|
|
151
|
+
---
|
|
152
|
+
evidence_id: "00"
|
|
153
|
+
title: "Effect of X on Y"
|
|
154
|
+
author: "BeaconLabs"
|
|
155
|
+
date: "2024-01-01"
|
|
156
|
+
results:
|
|
157
|
+
- intervention: "Description of intervention"
|
|
158
|
+
outcome_variable: "What was measured"
|
|
159
|
+
outcome: "+" # N/A, +, -, +-, !
|
|
160
|
+
strength: "3" # 0-5 (Maryland SMS scale)
|
|
161
|
+
methodologies:
|
|
162
|
+
- "RCT"
|
|
163
|
+
version: "1.0.0"
|
|
164
|
+
citation:
|
|
165
|
+
- name: "Paper Title"
|
|
166
|
+
type: "link"
|
|
167
|
+
src: "https://example.com/paper"
|
|
168
|
+
tags:
|
|
169
|
+
- "education"
|
|
170
|
+
- "health"
|
|
171
|
+
datasets:
|
|
172
|
+
- "Dataset name"
|
|
173
|
+
---
|
|
174
|
+
## Key Points
|
|
175
|
+
|
|
176
|
+
- Finding 1
|
|
177
|
+
- Finding 2
|
|
178
|
+
## Background
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Outcome Effects
|
|
182
|
+
|
|
183
|
+
| Value | Meaning |
|
|
184
|
+
| ----- | ------------------------------------------------------------ |
|
|
185
|
+
| `N/A` | Unclear - insufficient sample size or inadequate methods |
|
|
186
|
+
| `+` | Positive - expected effect found (statistically significant) |
|
|
187
|
+
| `-` | No effect - expected effect not observed |
|
|
188
|
+
| `+-` | Mixed - heterogeneous effects depending on conditions |
|
|
189
|
+
| `!` | Side effects - unintended effects observed |
|
|
190
|
+
|
|
191
|
+
### Strength Levels (Maryland SMS Scale)
|
|
192
|
+
|
|
193
|
+
| Level | Description |
|
|
194
|
+
| ----- | -------------------------------------- |
|
|
195
|
+
| 0 | Non-experimental (mathematical models) |
|
|
196
|
+
| 1 | Correlation without control |
|
|
197
|
+
| 2 | Before/after without control group |
|
|
198
|
+
| 3 | Before/after with control group |
|
|
199
|
+
| 4 | Quasi-experimental (matching, DiD) |
|
|
200
|
+
| 5 | Randomized Controlled Trial (RCT) |
|
|
201
|
+
|
|
202
|
+
## Development
|
|
203
|
+
|
|
204
|
+
### Build
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
npm install
|
|
208
|
+
npm run build
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Validate Evidence Files
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
npm run validate
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Project Structure
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
evidence/
|
|
221
|
+
├── src/
|
|
222
|
+
│ ├── index.ts # Main entry point
|
|
223
|
+
│ ├── types.ts # Zod schemas and TypeScript types (canonical)
|
|
224
|
+
│ └── content/
|
|
225
|
+
│ ├── index.ts # Content accessor API
|
|
226
|
+
│ ├── evidence.ts # Generated: bundled MDX content
|
|
227
|
+
│ └── deployments.ts # Generated: bundled deployment metadata
|
|
228
|
+
├── types/
|
|
229
|
+
│ └── index.ts # Re-exports from src/types.ts (CI/CD compatibility)
|
|
230
|
+
├── scripts/
|
|
231
|
+
│ └── bundle-content.ts # Build script (generates content/*.ts)
|
|
232
|
+
├── evidence/ # Source MDX files
|
|
233
|
+
├── deployments/ # Attestation metadata (JSON)
|
|
234
|
+
└── dist/ # Build output
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
> **Note:** `types/index.ts` re-exports all types from `src/types.ts` for backward compatibility with CI/CD scripts. The canonical type definitions live in `src/types.ts`.
|
|
238
|
+
|
|
239
|
+
## Contributing
|
|
240
|
+
|
|
241
|
+
### Adding New Evidence
|
|
242
|
+
|
|
243
|
+
1. Create a new MDX file in `evidence/` (e.g., `evidence/21.mdx`)
|
|
244
|
+
2. Follow the frontmatter schema (see Evidence File Format above)
|
|
245
|
+
3. Submit a Pull Request
|
|
246
|
+
4. After review, use `/attest` comment to create blockchain attestation
|
|
247
|
+
5. Add a changeset: `npx changeset`
|
|
248
|
+
6. Merge PR to trigger npm publish
|
|
249
|
+
|
|
250
|
+
### Versioning
|
|
251
|
+
|
|
252
|
+
This package uses [Changesets](https://github.com/changesets/changesets) for version management.
|
|
253
|
+
|
|
254
|
+
## License
|
|
255
|
+
|
|
256
|
+
MIT
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"evidenceId": "00",
|
|
3
|
+
"ipfsHash": "bafkreigbpi5c2e4zy2v5nt2q3agiiplsxdt4c3m3kxgs5lzb3xee5j2dai",
|
|
4
|
+
"attestationUID": "0x7c3152c17cac09c71774f923f65fe2756af383647840a4a8e73de8a4b225de2c",
|
|
5
|
+
"timestamp": "2025-10-20T05:22:06.071Z",
|
|
6
|
+
"size": 5607,
|
|
7
|
+
"updatedAt": "2025-10-20T05:23:33.382Z",
|
|
8
|
+
"history": [
|
|
9
|
+
{
|
|
10
|
+
"ipfsHash": "QmQepx8KrPTDDmZQwE9GTRhpZdGTEstjzu7kqg1j9ZUCcZ",
|
|
11
|
+
"attestationUID": "0xc752acb3a71527a11a65b9a40cc51b696674ab96cce8f419c95a7e52dbfcf7c9",
|
|
12
|
+
"timestamp": "2025-07-31T17:26:31.744Z",
|
|
13
|
+
"size": 6001
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"ipfsHash": "QmQepx8KrPTDDmZQwE9GTRhpZdGTEstjzu7kqg1j9ZUCcZ",
|
|
17
|
+
"attestationUID": "0xbc9c64758b1957406455a6ee14535bc04062b52cca187663ba977028815f18c8",
|
|
18
|
+
"timestamp": "2025-09-10T08:30:12.710Z",
|
|
19
|
+
"size": 6001
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"ipfsHash": "QmQepx8KrPTDDmZQwE9GTRhpZdGTEstjzu7kqg1j9ZUCcZ",
|
|
23
|
+
"attestationUID": "0xbfc4c43659f5c3e1f00394c55e8d7791cf094d0244a2467ad9e1be0b1f75a8e1",
|
|
24
|
+
"timestamp": "2025-09-12T04:36:23.489Z",
|
|
25
|
+
"size": 6001
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"ipfsHash": "QmNXBSzTZhhcquWCawASkyHriLHkVYTsCDNfHZJkp2cF3Q",
|
|
29
|
+
"attestationUID": "0xefa22307382cf4a1e51d637cf3bdfe4d9403b7fd2e3ee392c72ea33becf8c3f0",
|
|
30
|
+
"timestamp": "2025-09-12T04:56:02.580Z",
|
|
31
|
+
"size": 5622
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"evidenceId": "01",
|
|
3
|
+
"ipfsHash": "bafkreigknulsa3givqdohxstmft2qclyml2r762tp2bq6lpqq73jmchl2i",
|
|
4
|
+
"attestationUID": "0x841fa4f951b268a491426e69ad52e614306bbdb6b8a18a1555c34faf7c883c94",
|
|
5
|
+
"timestamp": "2025-10-20T05:22:13.310Z",
|
|
6
|
+
"size": 9188,
|
|
7
|
+
"updatedAt": "2025-10-20T05:23:33.383Z",
|
|
8
|
+
"history": [
|
|
9
|
+
{
|
|
10
|
+
"ipfsHash": "QmdXP2Vkgzxki4LyfFvGniYGB6SDdddq536a3TwZCf2fcm",
|
|
11
|
+
"attestationUID": "0x134509f13f5bce47deae650ffe8f352c0eedea950a98a1c899d7fa962e6cc85e",
|
|
12
|
+
"timestamp": "2025-07-31T17:26:37.028Z",
|
|
13
|
+
"size": 9464
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"ipfsHash": "QmdXP2Vkgzxki4LyfFvGniYGB6SDdddq536a3TwZCf2fcm",
|
|
17
|
+
"attestationUID": "0x729e6608b14ea5723c48b7d03a6b6c085c3eb3f29646358a8ce647025bd8baa5",
|
|
18
|
+
"timestamp": "2025-09-10T08:30:19.293Z",
|
|
19
|
+
"size": 9464
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"ipfsHash": "QmdXP2Vkgzxki4LyfFvGniYGB6SDdddq536a3TwZCf2fcm",
|
|
23
|
+
"attestationUID": "0x57392da3a6a2545d967255d3e73eb27027bc1946fd7f0bd252d5b52c36cc6c6a",
|
|
24
|
+
"timestamp": "2025-09-12T04:36:30.251Z",
|
|
25
|
+
"size": 9464
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"evidenceId": "02",
|
|
3
|
+
"ipfsHash": "bafkreigfjc5shpuagliglq6pfodbanyn26ryfom4ugyhgfyggwawo6wnny",
|
|
4
|
+
"attestationUID": "0xe73d0621a52732237d404577fb955d6b4593a94d14d27c3b3499b3a7c061cd44",
|
|
5
|
+
"timestamp": "2026-01-05T12:02:33.124Z",
|
|
6
|
+
"size": 4482,
|
|
7
|
+
"updatedAt": "2026-01-05T12:02:45.012Z",
|
|
8
|
+
"history": [
|
|
9
|
+
{
|
|
10
|
+
"ipfsHash": "QmYBHMrjEanPpJhn557zvJXYKoGt9fRKJkjRX4XpgmmTdZ",
|
|
11
|
+
"attestationUID": "0xe92d6fc1d270b4123cab706a9042fbfabd435d03a133346036da35141ec69d39",
|
|
12
|
+
"timestamp": "2025-07-31T17:26:42.108Z",
|
|
13
|
+
"size": 4626
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"ipfsHash": "QmYBHMrjEanPpJhn557zvJXYKoGt9fRKJkjRX4XpgmmTdZ",
|
|
17
|
+
"attestationUID": "0xb14e81fb0e1fb19cd8874a09292f6a07b08d67098bff64658eaad961bc701791",
|
|
18
|
+
"timestamp": "2025-09-10T08:30:25.858Z",
|
|
19
|
+
"size": 4626
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"ipfsHash": "QmV3R2wrcMPPpMLZad4LwabscLVzeBVBt6xQD5SGcMekDP",
|
|
23
|
+
"attestationUID": "0x300e20ee0edd082bde926aadacb20cb1ccd10b8bf45b71d556ed63a8a1f0673e",
|
|
24
|
+
"timestamp": "2025-09-12T04:36:37.059Z",
|
|
25
|
+
"size": 4494
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"ipfsHash": "bafkreigfjc5shpuagliglq6pfodbanyn26ryfom4ugyhgfyggwawo6wnny",
|
|
29
|
+
"attestationUID": "0xd45c8757e15af1a6240b4a4b81641b529066958243d40f025cb2212b838d0051",
|
|
30
|
+
"timestamp": "2025-10-20T05:22:16.131Z",
|
|
31
|
+
"size": 4482
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"evidenceId": "03",
|
|
3
|
+
"ipfsHash": "bafkreiaolpmn644l7xde7nfq7wsxfasg6mpx2wsvv6l24oxisgt47aumau",
|
|
4
|
+
"attestationUID": "0x011a20ff36a56deaa2516ff63abe108aeab9847f3803db76717d26ffb38b0d32",
|
|
5
|
+
"timestamp": "2026-01-19T09:57:51.165Z",
|
|
6
|
+
"size": 5791,
|
|
7
|
+
"updatedAt": "2026-01-19T09:58:25.357Z",
|
|
8
|
+
"history": [
|
|
9
|
+
{
|
|
10
|
+
"ipfsHash": "Qme9iPu6xCWrdN1S5s2sXEQbB4GUcEq6geu6Ra4ksZaT8R",
|
|
11
|
+
"attestationUID": "0xe5259c7f8f2bb58d9ff8f9d55198d1740e49932f946da888a4c1206c1c7ea6a0",
|
|
12
|
+
"timestamp": "2025-09-10T08:30:32.353Z",
|
|
13
|
+
"size": 5940
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"ipfsHash": "QmX2LxwKSfeUVwXHAQVUFJymfvCsegVAyaKD29gui3KDuq",
|
|
17
|
+
"attestationUID": "0x57200833a324d0650bf0f7f321ec7903aeac1ecd2b60e6083cefa1dff4648430",
|
|
18
|
+
"timestamp": "2025-09-12T04:36:43.736Z",
|
|
19
|
+
"size": 5802
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"ipfsHash": "bafkreieqoprkgjup4cxfq6yf7r5naembjjlzigjvtqshcnjas4mm4by7aq",
|
|
23
|
+
"attestationUID": "0xa3362a9b9af22e99d85060e335402e33bcd9829f6296e22be50aaad583862d1e",
|
|
24
|
+
"timestamp": "2025-10-20T05:22:18.960Z",
|
|
25
|
+
"size": 5792
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"ipfsHash": "bafkreieqoprkgjup4cxfq6yf7r5naembjjlzigjvtqshcnjas4mm4by7aq",
|
|
29
|
+
"attestationUID": "0x3e1c35c9f43ea08d2d82d9f739e1b1fa3bff72295417ef77d71cb55209f2dcb3",
|
|
30
|
+
"timestamp": "2026-01-05T12:17:10.822Z",
|
|
31
|
+
"size": 5792
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"ipfsHash": "bafkreiaolpmn644l7xde7nfq7wsxfasg6mpx2wsvv6l24oxisgt47aumau",
|
|
35
|
+
"attestationUID": "0x22133a9e188b840b2e76fd6b98eda2d191da5748ad9e664af27ea948622fd3f5",
|
|
36
|
+
"timestamp": "2026-01-19T09:50:11.752Z",
|
|
37
|
+
"size": 5791
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"evidenceId": "04",
|
|
3
|
+
"ipfsHash": "bafkreigdwx5eabsnfwbvt65x7b7dd2r4desmzpl3w7tst4smzc7pxzy2ru",
|
|
4
|
+
"attestationUID": "0x8f1a5d7d5d31d4cd265c997564bc74750f7420e5f1506a6b9a316034e8165ab8",
|
|
5
|
+
"timestamp": "2026-01-19T09:57:53.572Z",
|
|
6
|
+
"size": 5919,
|
|
7
|
+
"updatedAt": "2026-01-19T09:58:25.358Z",
|
|
8
|
+
"history": [
|
|
9
|
+
{
|
|
10
|
+
"ipfsHash": "QmZZNmHZdGiyNixzW2iAg5KmnZ8UTJV2p3hcctpH4R4TUy",
|
|
11
|
+
"attestationUID": "0x4ba65689be05c3f2f83ea250c78ce41b29aae776664c77d92b27772bd9ad4de2",
|
|
12
|
+
"timestamp": "2025-09-10T08:30:38.888Z",
|
|
13
|
+
"size": 6067
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"ipfsHash": "QmWU8D2giRsDAhFpe6kbVbdmMpsWNoZTW9TscDcBht7rip",
|
|
17
|
+
"attestationUID": "0xb70b9aa779c886b97553ae2323fcb27a91e007e6618d8c28cc1459bd77cf096c",
|
|
18
|
+
"timestamp": "2025-09-12T04:36:50.446Z",
|
|
19
|
+
"size": 5929
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"ipfsHash": "bafkreigdwx5eabsnfwbvt65x7b7dd2r4desmzpl3w7tst4smzc7pxzy2ru",
|
|
23
|
+
"attestationUID": "0xa57529c98b6765091463329cf75ce557a2200de3a7b60737ebebe1fd4d186c09",
|
|
24
|
+
"timestamp": "2025-10-20T05:22:21.756Z",
|
|
25
|
+
"size": 5919
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"ipfsHash": "bafkreigdwx5eabsnfwbvt65x7b7dd2r4desmzpl3w7tst4smzc7pxzy2ru",
|
|
29
|
+
"attestationUID": "0x65543d790c1ba99758d4c23185a122d62f257e7be8910c62b4d5e30068fe0c79",
|
|
30
|
+
"timestamp": "2026-01-05T12:17:17.576Z",
|
|
31
|
+
"size": 5919
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"ipfsHash": "bafkreigdwx5eabsnfwbvt65x7b7dd2r4desmzpl3w7tst4smzc7pxzy2ru",
|
|
35
|
+
"attestationUID": "0x2ea591bfad06d172399c28e8b9cf9550296c9ebbfda86847d86356f36c7b2818",
|
|
36
|
+
"timestamp": "2026-01-19T09:50:18.446Z",
|
|
37
|
+
"size": 5919
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"evidenceId": "05",
|
|
3
|
+
"ipfsHash": "bafkreifha2yi6mv4lrdvb6p6w4id6nzhctgfe2fdbabhljkoxupegirhh4",
|
|
4
|
+
"attestationUID": "0x1885abc1328de4cff38dd5652ac9ae22b1b3c241cb2747e9d9d3b057771b9d58",
|
|
5
|
+
"timestamp": "2026-01-05T12:17:24.301Z",
|
|
6
|
+
"size": 5999,
|
|
7
|
+
"updatedAt": "2026-01-05T12:18:46.574Z",
|
|
8
|
+
"history": [
|
|
9
|
+
{
|
|
10
|
+
"ipfsHash": "QmXbKFSfzZTcfTFZ9HJwVtPj4sNjiNDZBwbpakPmmL4WRA",
|
|
11
|
+
"attestationUID": "0xdb08d48b13ff597d21df2237df376443045e832d35bee2e291f4061dd3403a0e",
|
|
12
|
+
"timestamp": "2025-09-10T08:30:45.477Z",
|
|
13
|
+
"size": 6147
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"ipfsHash": "QmRAxaw4cUaZ75VxbdUGrUUix9NnSRtkZv9Fwfv86daEDp",
|
|
17
|
+
"attestationUID": "0xf8957b733bf6372700038f2243675312882b56a8301b30df5469ba60b10ca3b1",
|
|
18
|
+
"timestamp": "2025-09-12T04:36:57.164Z",
|
|
19
|
+
"size": 6009
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"ipfsHash": "bafkreifha2yi6mv4lrdvb6p6w4id6nzhctgfe2fdbabhljkoxupegirhh4",
|
|
23
|
+
"attestationUID": "0xe1afd90e239b994b7e3fb45208145372cb0a190a7489db5434b1a8bef543caf0",
|
|
24
|
+
"timestamp": "2025-10-20T05:22:28.939Z",
|
|
25
|
+
"size": 5999
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"evidenceId": "06",
|
|
3
|
+
"ipfsHash": "bafkreiftmmrxv3ofmm5w7xvnyi73ucxhm54zlg7an54esloeodzrelgaua",
|
|
4
|
+
"attestationUID": "0x1e18df54aecbfe0b53ed902be8b2da00f0b146e2395a6cb822a91c22fd506667",
|
|
5
|
+
"timestamp": "2026-01-05T12:17:26.810Z",
|
|
6
|
+
"size": 4124,
|
|
7
|
+
"updatedAt": "2026-01-05T12:18:46.575Z",
|
|
8
|
+
"history": [
|
|
9
|
+
{
|
|
10
|
+
"ipfsHash": "QmcFEzJvGd2MXQ79QNhdwiaBDXnkEgPRGD9Yz8s4tYwG2h",
|
|
11
|
+
"attestationUID": "0x2ba9c1db56ec67ceaf5b0f6958e9b4ab18b1729b38203f75f2d180d2eb8d2ecf",
|
|
12
|
+
"timestamp": "2025-09-10T08:30:52.079Z",
|
|
13
|
+
"size": 4378
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"ipfsHash": "QmTJbBGbTiS8M75cwafPcTT93oNf1iHkqhHUQKasdKCk7f",
|
|
17
|
+
"attestationUID": "0x77d86da89ee2663cc46f0d7e179af82e495423554a4d4a2a3f150c023dbbfba0",
|
|
18
|
+
"timestamp": "2025-09-12T04:36:59.631Z",
|
|
19
|
+
"size": 4136
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"ipfsHash": "bafkreiftmmrxv3ofmm5w7xvnyi73ucxhm54zlg7an54esloeodzrelgaua",
|
|
23
|
+
"attestationUID": "0xdb4020005bd8ad3fae0f8b59534371303d17d57bef9d6eccd3ed26be6489811e",
|
|
24
|
+
"timestamp": "2025-10-20T05:22:36.137Z",
|
|
25
|
+
"size": 4124
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"evidenceId": "07",
|
|
3
|
+
"ipfsHash": "bafkreibumu5m3hxwbquhupo2taeouuw6q2dyrhujkemtnkqq34fhsu4aoy",
|
|
4
|
+
"attestationUID": "0x00c3625f6e662865fd5f76069198c214418de58a99a9a80828a542c009d35d5f",
|
|
5
|
+
"timestamp": "2026-01-05T12:17:33.521Z",
|
|
6
|
+
"size": 3725,
|
|
7
|
+
"updatedAt": "2026-01-05T12:18:46.575Z",
|
|
8
|
+
"history": [
|
|
9
|
+
{
|
|
10
|
+
"ipfsHash": "QmUSjmGbYhUSDYr8bwTEzKAZLECy2sqAp39Y3zCZVr5yrP",
|
|
11
|
+
"attestationUID": "0x713761888d59c523c39166469e39f72a60ef267567d2e3da367a580e86d19d34",
|
|
12
|
+
"timestamp": "2025-09-10T08:30:58.646Z",
|
|
13
|
+
"size": 3963
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"ipfsHash": "Qmf9hraQRoKdXpUtKJGWUMNhPcsTzvEXokJmyT4JAnSncB",
|
|
17
|
+
"attestationUID": "0x131a05fc769bc4f88321b6393bac095acb91f414b9eb0269719d0700d6f0adf6",
|
|
18
|
+
"timestamp": "2025-09-12T04:37:06.307Z",
|
|
19
|
+
"size": 3737
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"ipfsHash": "bafkreibumu5m3hxwbquhupo2taeouuw6q2dyrhujkemtnkqq34fhsu4aoy",
|
|
23
|
+
"attestationUID": "0xc0d69bba3cbb98b888816ffc40a5fb9535a81845e208b9daee17642a20ebf88b",
|
|
24
|
+
"timestamp": "2025-10-20T05:22:43.324Z",
|
|
25
|
+
"size": 3725
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"evidenceId": "08",
|
|
3
|
+
"ipfsHash": "bafkreihyckti4phyh65fnrhtyvfxzzfnhd7gz5kpd33xoa4idexxrkomz4",
|
|
4
|
+
"attestationUID": "0x42dc0c6f359b2a1b41168322bdc147c6abf0598a7f02d4d7b987f9106366b2f3",
|
|
5
|
+
"timestamp": "2026-01-05T12:17:40.325Z",
|
|
6
|
+
"size": 2658,
|
|
7
|
+
"updatedAt": "2026-01-05T12:18:46.576Z",
|
|
8
|
+
"history": [
|
|
9
|
+
{
|
|
10
|
+
"ipfsHash": "QmPniW6pK61r2WXoGAsku7JDgpNZQJ343mpWhhirUQFS4w",
|
|
11
|
+
"attestationUID": "0x687828a7b2512a6d2a36047f8aef22ee211d94eb73fd621a55bc37210475f220",
|
|
12
|
+
"timestamp": "2025-09-10T08:31:00.999Z",
|
|
13
|
+
"size": 2912
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"ipfsHash": "QmWouWFKZuKKj3zBFb4oUDCCkwXGq4WxbLvvhpqYQnrVCd",
|
|
17
|
+
"attestationUID": "0xfbea1a38f1cfbe6fe2ce617626b1cc110910380b5e5def0dc07e3aa2ca633d71",
|
|
18
|
+
"timestamp": "2025-09-12T04:37:12.988Z",
|
|
19
|
+
"size": 2670
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"ipfsHash": "bafkreihyckti4phyh65fnrhtyvfxzzfnhd7gz5kpd33xoa4idexxrkomz4",
|
|
23
|
+
"attestationUID": "0x1f3053093c93d603a37d7f6d19de25214d76ad259203d0fdac9d688c149af1e5",
|
|
24
|
+
"timestamp": "2025-10-20T05:22:46.153Z",
|
|
25
|
+
"size": 2658
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"evidenceId": "09",
|
|
3
|
+
"ipfsHash": "bafkreid2vrcpjxgy7m7yljyjxi2sho2nzid3w7i5etm3dmef3kbfa62mzq",
|
|
4
|
+
"attestationUID": "0xe1d93bab34a109697802a44ff233aac984955e721e17b577911f9fd38d1a44fe",
|
|
5
|
+
"timestamp": "2026-01-05T12:17:47.117Z",
|
|
6
|
+
"size": 3722,
|
|
7
|
+
"updatedAt": "2026-01-05T12:18:46.576Z",
|
|
8
|
+
"history": [
|
|
9
|
+
{
|
|
10
|
+
"ipfsHash": "QmU2nEcUekxgwCdhmmn9dS1G8Yh6CCedZQn1vLDYbq9PYq",
|
|
11
|
+
"attestationUID": "0x7ba04ca3dc55b545cc3de55f6fac2a27fc4a068228a2225a9a1d27ba91cf85a0",
|
|
12
|
+
"timestamp": "2025-09-10T08:31:07.540Z",
|
|
13
|
+
"size": 3916
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"ipfsHash": "QmTyWtyBKqcg8gT9xKKEJ2miX2CeMoMNNbbZMxjG2eUxE7",
|
|
17
|
+
"attestationUID": "0xc3cda7c9789998c77b33d57e8c4e41c4b0fa768f2bda9ff6379a8bb194dc74ad",
|
|
18
|
+
"timestamp": "2025-09-12T04:37:19.737Z",
|
|
19
|
+
"size": 3734
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"ipfsHash": "bafkreid2vrcpjxgy7m7yljyjxi2sho2nzid3w7i5etm3dmef3kbfa62mzq",
|
|
23
|
+
"attestationUID": "0x082c456afefc31533a48f773feb0ff721cc9b9b916fa96f5adfb9e2a30725202",
|
|
24
|
+
"timestamp": "2025-10-20T05:22:48.983Z",
|
|
25
|
+
"size": 3722
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"evidenceId": "10",
|
|
3
|
+
"ipfsHash": "bafkreigtbl3k22aqtqnlfhcwbpxl4wvt3xd6kg4lnzmxbg2rhhlnvew76y",
|
|
4
|
+
"attestationUID": "0xa81599731cef9d9ff470847bc614d69b8a427eaa0b369c3bc5d4f2339d941644",
|
|
5
|
+
"timestamp": "2026-01-19T09:58:00.198Z",
|
|
6
|
+
"size": 3454,
|
|
7
|
+
"updatedAt": "2026-01-19T09:58:25.358Z",
|
|
8
|
+
"history": [
|
|
9
|
+
{
|
|
10
|
+
"ipfsHash": "QmPbfVG2aodGaRsQm1BMgZiEgALR7XoVTNccgsUJDKuecF",
|
|
11
|
+
"attestationUID": "0x6fa9b34c643d02ab33ebb9596f1a698314a4db474fdfc304dd9e4f4d3985aaee",
|
|
12
|
+
"timestamp": "2025-09-10T08:31:14.097Z",
|
|
13
|
+
"size": 3648
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"ipfsHash": "QmWndd7VvJqrtpMaEn1g5GZtA9GkYTLQ5u6fcimWima6wE",
|
|
17
|
+
"attestationUID": "0x5af7ea0464bb6dd3aa1dd9763fabc00431bfc9c0a11070f1f3e669a13e922812",
|
|
18
|
+
"timestamp": "2025-09-12T04:37:26.448Z",
|
|
19
|
+
"size": 3466
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"ipfsHash": "bafkreigtbl3k22aqtqnlfhcwbpxl4wvt3xd6kg4lnzmxbg2rhhlnvew76y",
|
|
23
|
+
"attestationUID": "0x59d3bc64a0ab9647c299730c7ebbc55dd091272f213ed4c74eeabc65c22b749f",
|
|
24
|
+
"timestamp": "2025-10-20T05:22:51.790Z",
|
|
25
|
+
"size": 3454
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"ipfsHash": "bafkreigtbl3k22aqtqnlfhcwbpxl4wvt3xd6kg4lnzmxbg2rhhlnvew76y",
|
|
29
|
+
"attestationUID": "0x4d156781642792664c95433cf73c2f8035aa8dc0eeb6ddd91d3d67036a0e9445",
|
|
30
|
+
"timestamp": "2026-01-05T12:17:49.570Z",
|
|
31
|
+
"size": 3454
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"ipfsHash": "bafkreigtbl3k22aqtqnlfhcwbpxl4wvt3xd6kg4lnzmxbg2rhhlnvew76y",
|
|
35
|
+
"attestationUID": "0x853bd8f7a2c2a7591a825a43b5eeb29cc21c3b3abd9226578c41c4ffdebabd31",
|
|
36
|
+
"timestamp": "2026-01-19T09:50:25.091Z",
|
|
37
|
+
"size": 3454
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"evidenceId": "11",
|
|
3
|
+
"ipfsHash": "bafkreigezvf4ewbyfbeer22ulitsacyikjwg57nz6angjlvoe7iozqidki",
|
|
4
|
+
"attestationUID": "0x7f8954d81d48671840bb6cfccfcb1d44f8e1cd3d633dc5f718591a53901f5576",
|
|
5
|
+
"timestamp": "2026-01-05T12:17:56.293Z",
|
|
6
|
+
"size": 2491,
|
|
7
|
+
"updatedAt": "2026-01-05T12:18:46.576Z",
|
|
8
|
+
"history": [
|
|
9
|
+
{
|
|
10
|
+
"ipfsHash": "QmNUWdNtC2vXHkpgLZyuZ8KWNdhW9dNNSMda6kkDTfTHS8",
|
|
11
|
+
"attestationUID": "0xc6975a4c1d5ff8335f89309d164f0c6e89fbc49b625ac0744fc07ca5c0cbc09f",
|
|
12
|
+
"timestamp": "2025-09-10T08:31:20.614Z",
|
|
13
|
+
"size": 2685
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"ipfsHash": "QmRohd3284brDjDcJ4GCZhiGChE5oMVb3VtSMMVaQRTRfZ",
|
|
17
|
+
"attestationUID": "0x3e9dfb59839a99b5ca33b853687fff01bdc0805427b6237b6e72aa41073f6142",
|
|
18
|
+
"timestamp": "2025-09-12T04:37:33.154Z",
|
|
19
|
+
"size": 2503
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"ipfsHash": "bafkreigezvf4ewbyfbeer22ulitsacyikjwg57nz6angjlvoe7iozqidki",
|
|
23
|
+
"attestationUID": "0x6296abe62d40f5923f7702167d86b561137fa51cbdc821d299eceb5eb5d67d84",
|
|
24
|
+
"timestamp": "2025-10-20T05:22:54.595Z",
|
|
25
|
+
"size": 2491
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"evidenceId": "12",
|
|
3
|
+
"ipfsHash": "bafkreifrdpmwf35q77tnb5mimm2blchx7pcc2j4375ujmnetd7uw4socmi",
|
|
4
|
+
"attestationUID": "0x31f4f57d3f75c40ad369718dc25cb98eeea7d6f538630df810c2019397ec61e1",
|
|
5
|
+
"timestamp": "2025-10-20T05:22:57.397Z",
|
|
6
|
+
"size": 3051,
|
|
7
|
+
"updatedAt": "2025-10-20T05:23:33.386Z",
|
|
8
|
+
"history": [
|
|
9
|
+
{
|
|
10
|
+
"ipfsHash": "QmaUMtZEjEvMoU7fTcojRdW74sLctXNV2oJZnw71mKRQih",
|
|
11
|
+
"attestationUID": "0x289e2d8f4a652f8cf6382c453d335ca8440b59cbced134b27637601365c44cba",
|
|
12
|
+
"timestamp": "2025-09-10T08:31:27.131Z",
|
|
13
|
+
"size": 3193
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"ipfsHash": "QmPVqaiNyVDBZZqBdQGtRJHhfuEtwap32t7BWB6qWkZar5",
|
|
17
|
+
"attestationUID": "0xa581f72f1aa99dff97488d117b4dde0d9b5d3f92e23c40f9b486350b78097ed6",
|
|
18
|
+
"timestamp": "2025-09-12T04:37:39.852Z",
|
|
19
|
+
"size": 3063
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
}
|