qualyx 0.3.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/LICENSE +21 -0
- package/README.md +523 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +124 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +3 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +122 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/run.d.ts +12 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +160 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/schedule.d.ts +19 -0
- package/dist/cli/commands/schedule.d.ts.map +1 -0
- package/dist/cli/commands/schedule.js +240 -0
- package/dist/cli/commands/schedule.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +3 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +47 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +194 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/claude-runner.d.ts +23 -0
- package/dist/core/claude-runner.d.ts.map +1 -0
- package/dist/core/claude-runner.js +196 -0
- package/dist/core/claude-runner.js.map +1 -0
- package/dist/core/config-loader.d.ts +137 -0
- package/dist/core/config-loader.d.ts.map +1 -0
- package/dist/core/config-loader.js +239 -0
- package/dist/core/config-loader.js.map +1 -0
- package/dist/core/executor.d.ts +75 -0
- package/dist/core/executor.d.ts.map +1 -0
- package/dist/core/executor.js +337 -0
- package/dist/core/executor.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/prompt-builder.d.ts +24 -0
- package/dist/core/prompt-builder.d.ts.map +1 -0
- package/dist/core/prompt-builder.js +145 -0
- package/dist/core/prompt-builder.js.map +1 -0
- package/dist/core/retry-handler.d.ts +42 -0
- package/dist/core/retry-handler.d.ts.map +1 -0
- package/dist/core/retry-handler.js +126 -0
- package/dist/core/retry-handler.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/email.d.ts +38 -0
- package/dist/integrations/email.d.ts.map +1 -0
- package/dist/integrations/email.js +216 -0
- package/dist/integrations/email.js.map +1 -0
- package/dist/integrations/index.d.ts +5 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +5 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/jira.d.ts +68 -0
- package/dist/integrations/jira.d.ts.map +1 -0
- package/dist/integrations/jira.js +288 -0
- package/dist/integrations/jira.js.map +1 -0
- package/dist/integrations/slack.d.ts +66 -0
- package/dist/integrations/slack.d.ts.map +1 -0
- package/dist/integrations/slack.js +192 -0
- package/dist/integrations/slack.js.map +1 -0
- package/dist/integrations/teams.d.ts +72 -0
- package/dist/integrations/teams.d.ts.map +1 -0
- package/dist/integrations/teams.js +197 -0
- package/dist/integrations/teams.js.map +1 -0
- package/dist/reporters/console.d.ts +83 -0
- package/dist/reporters/console.d.ts.map +1 -0
- package/dist/reporters/console.js +299 -0
- package/dist/reporters/console.js.map +1 -0
- package/dist/reporters/html.d.ts +29 -0
- package/dist/reporters/html.d.ts.map +1 -0
- package/dist/reporters/html.js +105 -0
- package/dist/reporters/html.js.map +1 -0
- package/dist/storage/results.d.ts +61 -0
- package/dist/storage/results.d.ts.map +1 -0
- package/dist/storage/results.js +111 -0
- package/dist/storage/results.js.map +1 -0
- package/dist/storage/sqlite.d.ts +70 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +240 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/types/index.d.ts +1239 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +105 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +75 -0
- package/templates/crontab.hbs +24 -0
- package/templates/github-schedule.yml.hbs +153 -0
- package/templates/prompt.md.hbs +147 -0
- package/templates/report.html.hbs +423 -0
- package/templates/slack-message.json.hbs +93 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { RunResult, TestResult } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* SQLite storage for test run history.
|
|
4
|
+
*/
|
|
5
|
+
export declare class QualyxStorage {
|
|
6
|
+
private db;
|
|
7
|
+
constructor(dbPath?: string);
|
|
8
|
+
/**
|
|
9
|
+
* Initialize the database schema.
|
|
10
|
+
*/
|
|
11
|
+
private initialize;
|
|
12
|
+
/**
|
|
13
|
+
* Save a complete run result to the database.
|
|
14
|
+
*/
|
|
15
|
+
saveRun(result: RunResult, configHash?: string): void;
|
|
16
|
+
/**
|
|
17
|
+
* Get the most recent run.
|
|
18
|
+
*/
|
|
19
|
+
getLatestRun(): RunResult | null;
|
|
20
|
+
/**
|
|
21
|
+
* Get a run by ID.
|
|
22
|
+
*/
|
|
23
|
+
getRun(runId: string): RunResult | null;
|
|
24
|
+
/**
|
|
25
|
+
* Get recent runs.
|
|
26
|
+
*/
|
|
27
|
+
getRecentRuns(limit?: number): RunResult[];
|
|
28
|
+
/**
|
|
29
|
+
* Get runs with failures.
|
|
30
|
+
*/
|
|
31
|
+
getFailedRuns(limit?: number): RunResult[];
|
|
32
|
+
/**
|
|
33
|
+
* Get test results for a specific rule across runs.
|
|
34
|
+
*/
|
|
35
|
+
getTestHistory(ruleId: string, appName: string, limit?: number): TestResult[];
|
|
36
|
+
/**
|
|
37
|
+
* Get statistics for a rule over time.
|
|
38
|
+
*/
|
|
39
|
+
getRuleStats(ruleId: string, appName: string): {
|
|
40
|
+
total: number;
|
|
41
|
+
passed: number;
|
|
42
|
+
failed: number;
|
|
43
|
+
passRate: number;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Delete old runs (older than specified days).
|
|
47
|
+
*/
|
|
48
|
+
cleanupOldRuns(daysToKeep?: number): number;
|
|
49
|
+
/**
|
|
50
|
+
* Convert a stored run row to a RunResult.
|
|
51
|
+
*/
|
|
52
|
+
private rowToRunResult;
|
|
53
|
+
/**
|
|
54
|
+
* Convert a stored test result row to a TestResult.
|
|
55
|
+
*/
|
|
56
|
+
private rowToTestResult;
|
|
57
|
+
/**
|
|
58
|
+
* Close the database connection.
|
|
59
|
+
*/
|
|
60
|
+
close(): void;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get the default storage instance.
|
|
64
|
+
*/
|
|
65
|
+
export declare function getStorage(dbPath?: string): QualyxStorage;
|
|
66
|
+
/**
|
|
67
|
+
* Close the default storage instance.
|
|
68
|
+
*/
|
|
69
|
+
export declare function closeStorage(): void;
|
|
70
|
+
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAA+B,MAAM,mBAAmB,CAAC;AAI5F;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAoB;gBAElB,MAAM,GAAE,MAAwB;IAY5C;;OAEG;IACH,OAAO,CAAC,UAAU;IAyClB;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAmDrD;;OAEG;IACH,YAAY,IAAI,SAAS,GAAG,IAAI;IAYhC;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAYvC;;OAEG;IACH,aAAa,CAAC,KAAK,GAAE,MAAW,GAAG,SAAS,EAAE;IAQ9C;;OAEG;IACH,aAAa,CAAC,KAAK,GAAE,MAAW,GAAG,SAAS,EAAE;IAQ9C;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,UAAU,EAAE;IAUjF;;OAEG;IACH,YAAY,CACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAsBtE;;OAEG;IACH,cAAc,CAAC,UAAU,GAAE,MAAW,GAAG,MAAM;IAsB/C;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB;;OAEG;IACH,OAAO,CAAC,eAAe;IAkBvB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAKD;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,CAKzD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAKnC"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { mkdirSync, existsSync } from 'node:fs';
|
|
4
|
+
const DEFAULT_DB_PATH = '.qualyx/history.db';
|
|
5
|
+
/**
|
|
6
|
+
* SQLite storage for test run history.
|
|
7
|
+
*/
|
|
8
|
+
export class QualyxStorage {
|
|
9
|
+
db;
|
|
10
|
+
constructor(dbPath = DEFAULT_DB_PATH) {
|
|
11
|
+
// Ensure directory exists
|
|
12
|
+
const fullPath = resolve(dbPath);
|
|
13
|
+
const dir = resolve(fullPath, '..');
|
|
14
|
+
if (!existsSync(dir)) {
|
|
15
|
+
mkdirSync(dir, { recursive: true });
|
|
16
|
+
}
|
|
17
|
+
this.db = new Database(fullPath);
|
|
18
|
+
this.initialize();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Initialize the database schema.
|
|
22
|
+
*/
|
|
23
|
+
initialize() {
|
|
24
|
+
this.db.exec(`
|
|
25
|
+
CREATE TABLE IF NOT EXISTS runs (
|
|
26
|
+
id TEXT PRIMARY KEY,
|
|
27
|
+
config_hash TEXT,
|
|
28
|
+
started_at TEXT NOT NULL,
|
|
29
|
+
completed_at TEXT NOT NULL,
|
|
30
|
+
duration INTEGER NOT NULL,
|
|
31
|
+
total_tests INTEGER NOT NULL,
|
|
32
|
+
passed INTEGER NOT NULL,
|
|
33
|
+
failed INTEGER NOT NULL,
|
|
34
|
+
skipped INTEGER NOT NULL,
|
|
35
|
+
environment TEXT,
|
|
36
|
+
results_json TEXT
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
CREATE TABLE IF NOT EXISTS test_results (
|
|
40
|
+
id TEXT PRIMARY KEY,
|
|
41
|
+
run_id TEXT NOT NULL,
|
|
42
|
+
rule_id TEXT NOT NULL,
|
|
43
|
+
rule_name TEXT NOT NULL,
|
|
44
|
+
app_name TEXT NOT NULL,
|
|
45
|
+
status TEXT NOT NULL,
|
|
46
|
+
severity TEXT NOT NULL,
|
|
47
|
+
started_at TEXT NOT NULL,
|
|
48
|
+
completed_at TEXT NOT NULL,
|
|
49
|
+
duration INTEGER NOT NULL,
|
|
50
|
+
error TEXT,
|
|
51
|
+
screenshot TEXT,
|
|
52
|
+
retry_count INTEGER DEFAULT 0,
|
|
53
|
+
steps_json TEXT,
|
|
54
|
+
validations_json TEXT,
|
|
55
|
+
FOREIGN KEY (run_id) REFERENCES runs(id)
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
CREATE INDEX IF NOT EXISTS idx_test_results_run_id ON test_results(run_id);
|
|
59
|
+
CREATE INDEX IF NOT EXISTS idx_test_results_status ON test_results(status);
|
|
60
|
+
CREATE INDEX IF NOT EXISTS idx_runs_started_at ON runs(started_at);
|
|
61
|
+
`);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Save a complete run result to the database.
|
|
65
|
+
*/
|
|
66
|
+
saveRun(result, configHash) {
|
|
67
|
+
const insertRun = this.db.prepare(`
|
|
68
|
+
INSERT INTO runs (id, config_hash, started_at, completed_at, duration, total_tests, passed, failed, skipped, environment, results_json)
|
|
69
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
70
|
+
`);
|
|
71
|
+
const insertTestResult = this.db.prepare(`
|
|
72
|
+
INSERT INTO test_results (id, run_id, rule_id, rule_name, app_name, status, severity, started_at, completed_at, duration, error, screenshot, retry_count, steps_json, validations_json)
|
|
73
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
74
|
+
`);
|
|
75
|
+
const saveAll = this.db.transaction(() => {
|
|
76
|
+
insertRun.run(result.runId, configHash || null, result.startedAt, result.completedAt, result.duration, result.totalTests, result.passed, result.failed, result.skipped, result.environment, JSON.stringify(result.results));
|
|
77
|
+
for (const test of result.results) {
|
|
78
|
+
const testId = `${result.runId}-${test.ruleId}`;
|
|
79
|
+
insertTestResult.run(testId, result.runId, test.ruleId, test.ruleName, test.appName, test.status, test.severity, test.startedAt, test.completedAt, test.duration, test.error || null, test.screenshot || null, test.retryCount, JSON.stringify(test.steps), JSON.stringify(test.validations));
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
saveAll();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get the most recent run.
|
|
86
|
+
*/
|
|
87
|
+
getLatestRun() {
|
|
88
|
+
const row = this.db
|
|
89
|
+
.prepare('SELECT * FROM runs ORDER BY started_at DESC LIMIT 1')
|
|
90
|
+
.get();
|
|
91
|
+
if (!row) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
return this.rowToRunResult(row);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get a run by ID.
|
|
98
|
+
*/
|
|
99
|
+
getRun(runId) {
|
|
100
|
+
const row = this.db
|
|
101
|
+
.prepare('SELECT * FROM runs WHERE id = ?')
|
|
102
|
+
.get(runId);
|
|
103
|
+
if (!row) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
return this.rowToRunResult(row);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get recent runs.
|
|
110
|
+
*/
|
|
111
|
+
getRecentRuns(limit = 10) {
|
|
112
|
+
const rows = this.db
|
|
113
|
+
.prepare('SELECT * FROM runs ORDER BY started_at DESC LIMIT ?')
|
|
114
|
+
.all(limit);
|
|
115
|
+
return rows.map((row) => this.rowToRunResult(row));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get runs with failures.
|
|
119
|
+
*/
|
|
120
|
+
getFailedRuns(limit = 10) {
|
|
121
|
+
const rows = this.db
|
|
122
|
+
.prepare('SELECT * FROM runs WHERE failed > 0 ORDER BY started_at DESC LIMIT ?')
|
|
123
|
+
.all(limit);
|
|
124
|
+
return rows.map((row) => this.rowToRunResult(row));
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get test results for a specific rule across runs.
|
|
128
|
+
*/
|
|
129
|
+
getTestHistory(ruleId, appName, limit = 10) {
|
|
130
|
+
const rows = this.db
|
|
131
|
+
.prepare('SELECT * FROM test_results WHERE rule_id = ? AND app_name = ? ORDER BY started_at DESC LIMIT ?')
|
|
132
|
+
.all(ruleId, appName, limit);
|
|
133
|
+
return rows.map((row) => this.rowToTestResult(row));
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get statistics for a rule over time.
|
|
137
|
+
*/
|
|
138
|
+
getRuleStats(ruleId, appName) {
|
|
139
|
+
const row = this.db
|
|
140
|
+
.prepare(`
|
|
141
|
+
SELECT
|
|
142
|
+
COUNT(*) as total,
|
|
143
|
+
SUM(CASE WHEN status = 'passed' THEN 1 ELSE 0 END) as passed,
|
|
144
|
+
SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed
|
|
145
|
+
FROM test_results
|
|
146
|
+
WHERE rule_id = ? AND app_name = ?
|
|
147
|
+
`)
|
|
148
|
+
.get(ruleId, appName);
|
|
149
|
+
return {
|
|
150
|
+
total: row.total,
|
|
151
|
+
passed: row.passed,
|
|
152
|
+
failed: row.failed,
|
|
153
|
+
passRate: row.total > 0 ? (row.passed / row.total) * 100 : 0,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Delete old runs (older than specified days).
|
|
158
|
+
*/
|
|
159
|
+
cleanupOldRuns(daysToKeep = 30) {
|
|
160
|
+
const cutoffDate = new Date();
|
|
161
|
+
cutoffDate.setDate(cutoffDate.getDate() - daysToKeep);
|
|
162
|
+
const cutoffIso = cutoffDate.toISOString();
|
|
163
|
+
const deleteTestResults = this.db.prepare(`
|
|
164
|
+
DELETE FROM test_results WHERE run_id IN (
|
|
165
|
+
SELECT id FROM runs WHERE started_at < ?
|
|
166
|
+
)
|
|
167
|
+
`);
|
|
168
|
+
const deleteRuns = this.db.prepare('DELETE FROM runs WHERE started_at < ?');
|
|
169
|
+
const cleanup = this.db.transaction(() => {
|
|
170
|
+
deleteTestResults.run(cutoffIso);
|
|
171
|
+
const result = deleteRuns.run(cutoffIso);
|
|
172
|
+
return result.changes;
|
|
173
|
+
});
|
|
174
|
+
return cleanup();
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Convert a stored run row to a RunResult.
|
|
178
|
+
*/
|
|
179
|
+
rowToRunResult(row) {
|
|
180
|
+
return {
|
|
181
|
+
runId: row.id,
|
|
182
|
+
startedAt: row.started_at,
|
|
183
|
+
completedAt: row.completed_at,
|
|
184
|
+
duration: row.duration,
|
|
185
|
+
totalTests: row.total_tests,
|
|
186
|
+
passed: row.passed,
|
|
187
|
+
failed: row.failed,
|
|
188
|
+
skipped: row.skipped,
|
|
189
|
+
environment: row.environment,
|
|
190
|
+
results: JSON.parse(row.results_json),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Convert a stored test result row to a TestResult.
|
|
195
|
+
*/
|
|
196
|
+
rowToTestResult(row) {
|
|
197
|
+
return {
|
|
198
|
+
ruleId: row.rule_id,
|
|
199
|
+
ruleName: row.rule_name,
|
|
200
|
+
appName: row.app_name,
|
|
201
|
+
status: row.status,
|
|
202
|
+
severity: row.severity,
|
|
203
|
+
startedAt: row.started_at,
|
|
204
|
+
completedAt: row.completed_at,
|
|
205
|
+
duration: row.duration,
|
|
206
|
+
steps: JSON.parse(row.steps_json),
|
|
207
|
+
validations: JSON.parse(row.validations_json),
|
|
208
|
+
error: row.error ?? undefined,
|
|
209
|
+
screenshot: row.screenshot ?? undefined,
|
|
210
|
+
retryCount: row.retry_count,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Close the database connection.
|
|
215
|
+
*/
|
|
216
|
+
close() {
|
|
217
|
+
this.db.close();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Singleton instance for convenience
|
|
221
|
+
let defaultStorage = null;
|
|
222
|
+
/**
|
|
223
|
+
* Get the default storage instance.
|
|
224
|
+
*/
|
|
225
|
+
export function getStorage(dbPath) {
|
|
226
|
+
if (!defaultStorage) {
|
|
227
|
+
defaultStorage = new QualyxStorage(dbPath);
|
|
228
|
+
}
|
|
229
|
+
return defaultStorage;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Close the default storage instance.
|
|
233
|
+
*/
|
|
234
|
+
export function closeStorage() {
|
|
235
|
+
if (defaultStorage) {
|
|
236
|
+
defaultStorage.close();
|
|
237
|
+
defaultStorage = null;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/storage/sqlite.ts"],"names":[],"mappings":"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"}
|