@knowledgine/cli 0.6.1 → 0.6.3
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/dist/CLAUDE.md +7 -0
- package/dist/commands/benchmark.d.ts +6 -0
- package/dist/commands/benchmark.d.ts.map +1 -0
- package/dist/commands/benchmark.js +136 -0
- package/dist/commands/benchmark.js.map +1 -0
- package/dist/commands/deprecation-check.d.ts +1 -0
- package/dist/commands/deprecation-check.d.ts.map +1 -1
- package/dist/commands/deprecation-check.js +23 -5
- package/dist/commands/deprecation-check.js.map +1 -1
- package/dist/commands/doctor.d.ts +23 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +600 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/explain.d.ts.map +1 -1
- package/dist/commands/explain.js +4 -1
- package/dist/commands/explain.js.map +1 -1
- package/dist/commands/ingest.d.ts +1 -0
- package/dist/commands/ingest.d.ts.map +1 -1
- package/dist/commands/ingest.js +142 -2
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +2 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/search.d.ts +2 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +54 -14
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/serve.d.ts +1 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +16 -1
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +8 -0
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +5 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/suggest.d.ts.map +1 -1
- package/dist/commands/suggest.js +12 -0
- package/dist/commands/suggest.js.map +1 -1
- package/dist/commands/upgrade.d.ts +1 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +99 -2
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/index.js +45 -10
- package/dist/index.js.map +1 -1
- package/dist/lib/entity-extractor.d.ts +17 -0
- package/dist/lib/entity-extractor.d.ts.map +1 -0
- package/dist/lib/entity-extractor.js +22 -0
- package/dist/lib/entity-extractor.js.map +1 -0
- package/dist/lib/formatter.d.ts.map +1 -1
- package/dist/lib/formatter.js +13 -8
- package/dist/lib/formatter.js.map +1 -1
- package/dist/templates/skills/knowledgine-explain/references.d.ts +2 -0
- package/dist/templates/skills/knowledgine-explain/references.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-explain/references.js +183 -0
- package/dist/templates/skills/knowledgine-explain/references.js.map +1 -0
- package/dist/templates/skills/knowledgine-explain/skill-md.d.ts +2 -0
- package/dist/templates/skills/knowledgine-explain/skill-md.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-explain/skill-md.js +89 -0
- package/dist/templates/skills/knowledgine-explain/skill-md.js.map +1 -0
- package/dist/templates/skills/knowledgine-recall/references.d.ts +2 -0
- package/dist/templates/skills/knowledgine-recall/references.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-recall/references.js +207 -0
- package/dist/templates/skills/knowledgine-recall/references.js.map +1 -0
- package/dist/templates/skills/knowledgine-recall/skill-md.d.ts +2 -0
- package/dist/templates/skills/knowledgine-recall/skill-md.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-recall/skill-md.js +86 -0
- package/dist/templates/skills/knowledgine-recall/skill-md.js.map +1 -0
- package/dist/templates/skills/knowledgine-suggest/references.d.ts +2 -0
- package/dist/templates/skills/knowledgine-suggest/references.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-suggest/references.js +121 -0
- package/dist/templates/skills/knowledgine-suggest/references.js.map +1 -0
- package/dist/templates/skills/knowledgine-suggest/skill-md.d.ts +2 -0
- package/dist/templates/skills/knowledgine-suggest/skill-md.d.ts.map +1 -0
- package/dist/templates/skills/knowledgine-suggest/skill-md.js +94 -0
- package/dist/templates/skills/knowledgine-suggest/skill-md.js.map +1 -0
- package/package.json +4 -4
package/dist/CLAUDE.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../../src/commands/benchmark.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAmBD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqJ/E"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { resolve } from "path";
|
|
2
|
+
import { existsSync } from "fs";
|
|
3
|
+
import { createDatabase, Migrator, ALL_MIGRATIONS } from "@knowledgine/core";
|
|
4
|
+
function cosineSimilarityFromL2(a, b) {
|
|
5
|
+
// L2-normalized vectors: cosine_similarity = 1 - L2_distance^2 / 2
|
|
6
|
+
let sumSq = 0;
|
|
7
|
+
for (let i = 0; i < a.length; i++) {
|
|
8
|
+
const diff = a[i] - b[i];
|
|
9
|
+
sumSq += diff * diff;
|
|
10
|
+
}
|
|
11
|
+
const l2dist = Math.sqrt(sumSq);
|
|
12
|
+
return Math.max(0, 1 - (l2dist * l2dist) / 2);
|
|
13
|
+
}
|
|
14
|
+
function sampleIndices(total, maxSamples) {
|
|
15
|
+
if (total <= maxSamples)
|
|
16
|
+
return Array.from({ length: total }, (_, i) => i);
|
|
17
|
+
const step = total / maxSamples;
|
|
18
|
+
return Array.from({ length: maxSamples }, (_, i) => Math.floor(i * step));
|
|
19
|
+
}
|
|
20
|
+
export async function benchmarkCommand(options) {
|
|
21
|
+
const rootPath = options.path ? resolve(options.path) : process.cwd();
|
|
22
|
+
const dbPath = resolve(rootPath, ".knowledgine", "index.sqlite");
|
|
23
|
+
if (!existsSync(dbPath)) {
|
|
24
|
+
console.error(`Error: Database not found at ${dbPath}`);
|
|
25
|
+
console.error("Run 'knowledgine init --path <dir>' first.");
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
if (!options.semantic) {
|
|
29
|
+
console.error("Use --semantic to run the semantic score distribution benchmark.");
|
|
30
|
+
process.exit(0);
|
|
31
|
+
}
|
|
32
|
+
let db;
|
|
33
|
+
try {
|
|
34
|
+
db = createDatabase(dbPath);
|
|
35
|
+
new Migrator(db, ALL_MIGRATIONS).migrate();
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
console.error(`Error opening database: ${err instanceof Error ? err.message : String(err)}`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
const countRow = db.prepare("SELECT COUNT(*) AS count FROM note_embeddings").get();
|
|
42
|
+
const totalEmbeddings = countRow?.count ?? 0;
|
|
43
|
+
if (totalEmbeddings === 0) {
|
|
44
|
+
console.error("No embeddings found. Run 'knowledgine upgrade --semantic' first.");
|
|
45
|
+
db.close();
|
|
46
|
+
process.exit(0);
|
|
47
|
+
}
|
|
48
|
+
const MAX_SAMPLES = 50;
|
|
49
|
+
const indices = sampleIndices(totalEmbeddings, MAX_SAMPLES);
|
|
50
|
+
// Fetch only the sampled rows by offset to avoid loading all BLOBs.
|
|
51
|
+
const stmtOffset = db.prepare("SELECT note_id, embedding, dimensions FROM note_embeddings ORDER BY note_id LIMIT 1 OFFSET ?");
|
|
52
|
+
const sample = indices
|
|
53
|
+
.map((offset) => stmtOffset.get(offset))
|
|
54
|
+
.filter((row) => row !== undefined);
|
|
55
|
+
console.error(`\nSemantic Score Distribution Benchmark`);
|
|
56
|
+
console.error(`Total embeddings: ${totalEmbeddings}`);
|
|
57
|
+
console.error(`Sample size: ${sample.length}`);
|
|
58
|
+
console.error(`Computing pairwise cosine similarities...\n`);
|
|
59
|
+
const BYTES_PER_FLOAT32 = 4;
|
|
60
|
+
const scores = [];
|
|
61
|
+
let skippedPairs = 0;
|
|
62
|
+
for (let i = 0; i < sample.length; i++) {
|
|
63
|
+
const rowA = sample[i];
|
|
64
|
+
const dimsA = rowA.dimensions;
|
|
65
|
+
const maxFloatsA = rowA.embedding.byteLength / BYTES_PER_FLOAT32;
|
|
66
|
+
if (!Number.isInteger(dimsA) || dimsA <= 0 || dimsA > maxFloatsA)
|
|
67
|
+
continue;
|
|
68
|
+
const a = new Float32Array(rowA.embedding.buffer, rowA.embedding.byteOffset, dimsA);
|
|
69
|
+
for (let j = i + 1; j < sample.length; j++) {
|
|
70
|
+
const rowB = sample[j];
|
|
71
|
+
const dimsB = rowB.dimensions;
|
|
72
|
+
const maxFloatsB = rowB.embedding.byteLength / BYTES_PER_FLOAT32;
|
|
73
|
+
if (!Number.isInteger(dimsB) || dimsB <= 0 || dimsB > maxFloatsB || dimsB !== dimsA) {
|
|
74
|
+
skippedPairs++;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const b = new Float32Array(rowB.embedding.buffer, rowB.embedding.byteOffset, dimsB);
|
|
78
|
+
scores.push(cosineSimilarityFromL2(a, b));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (scores.length === 0) {
|
|
82
|
+
console.error("Not enough samples to compute distribution (need at least 2 valid matching-dimension embeddings).");
|
|
83
|
+
if (skippedPairs > 0) {
|
|
84
|
+
console.error(`Note: Skipped ${skippedPairs} pair(s) due to invalid or mismatched dimensions.`);
|
|
85
|
+
}
|
|
86
|
+
db.close();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (skippedPairs > 0) {
|
|
90
|
+
console.error(`Note: Skipped ${skippedPairs} pair(s) with invalid or mismatched dimensions.`);
|
|
91
|
+
}
|
|
92
|
+
scores.sort((a, b) => a - b);
|
|
93
|
+
const n = scores.length;
|
|
94
|
+
const mean = scores.reduce((s, x) => s + x, 0) / n;
|
|
95
|
+
const variance = scores.reduce((s, x) => s + (x - mean) ** 2, 0) / n;
|
|
96
|
+
const stddev = Math.sqrt(variance);
|
|
97
|
+
const min = scores[0];
|
|
98
|
+
const max = scores[n - 1];
|
|
99
|
+
const p25 = scores[Math.floor(n * 0.25)];
|
|
100
|
+
const median = scores[Math.floor(n * 0.5)];
|
|
101
|
+
const p75 = scores[Math.floor(n * 0.75)];
|
|
102
|
+
const p90 = scores[Math.floor(n * 0.9)];
|
|
103
|
+
console.error(`Results (${n} pairs):`);
|
|
104
|
+
console.error(` mean: ${(mean * 100).toFixed(2)}%`);
|
|
105
|
+
console.error(` stddev: ${(stddev * 100).toFixed(2)}%`);
|
|
106
|
+
console.error(` min: ${(min * 100).toFixed(2)}%`);
|
|
107
|
+
console.error(` p25: ${(p25 * 100).toFixed(2)}%`);
|
|
108
|
+
console.error(` median: ${(median * 100).toFixed(2)}%`);
|
|
109
|
+
console.error(` p75: ${(p75 * 100).toFixed(2)}%`);
|
|
110
|
+
console.error(` p90: ${(p90 * 100).toFixed(2)}%`);
|
|
111
|
+
console.error(` max: ${(max * 100).toFixed(2)}%`);
|
|
112
|
+
console.error("");
|
|
113
|
+
if (stddev < 0.05) {
|
|
114
|
+
console.error("Warning: Low stddev indicates score flattening. Check embedding normalization.");
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
console.error("Score distribution looks healthy (stddev >= 5%).");
|
|
118
|
+
}
|
|
119
|
+
console.error("");
|
|
120
|
+
// Also output as JSON to stdout for scripting
|
|
121
|
+
console.log(JSON.stringify({
|
|
122
|
+
totalEmbeddings: totalEmbeddings,
|
|
123
|
+
sampleSize: sample.length,
|
|
124
|
+
pairCount: n,
|
|
125
|
+
mean: parseFloat((mean * 100).toFixed(4)),
|
|
126
|
+
stddev: parseFloat((stddev * 100).toFixed(4)),
|
|
127
|
+
min: parseFloat((min * 100).toFixed(4)),
|
|
128
|
+
p25: parseFloat((p25 * 100).toFixed(4)),
|
|
129
|
+
median: parseFloat((median * 100).toFixed(4)),
|
|
130
|
+
p75: parseFloat((p75 * 100).toFixed(4)),
|
|
131
|
+
p90: parseFloat((p90 * 100).toFixed(4)),
|
|
132
|
+
max: parseFloat((max * 100).toFixed(4)),
|
|
133
|
+
}, null, 2));
|
|
134
|
+
db.close();
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=benchmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../src/commands/benchmark.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ export interface DeprecationCheckOptions {
|
|
|
2
2
|
path?: string;
|
|
3
3
|
apply?: boolean;
|
|
4
4
|
threshold?: string;
|
|
5
|
+
excludeTranslations?: boolean;
|
|
5
6
|
}
|
|
6
7
|
export declare function deprecationCheckCommand(options: DeprecationCheckOptions): Promise<void>;
|
|
7
8
|
//# sourceMappingURL=deprecation-check.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deprecation-check.d.ts","sourceRoot":"","sources":["../../src/commands/deprecation-check.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"deprecation-check.d.ts","sourceRoot":"","sources":["../../src/commands/deprecation-check.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AA4CD,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0E7F"}
|
|
@@ -3,10 +3,24 @@ import { loadConfig, resolveDefaultPath, createDatabase, Migrator, KnowledgeRepo
|
|
|
3
3
|
* 簡易テキスト類似度(Jaccard係数)でdeprecation候補を検出する
|
|
4
4
|
*/
|
|
5
5
|
function jaccardSimilarity(a, b) {
|
|
6
|
-
const tokenize = (text) =>
|
|
7
|
-
.toLowerCase()
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
const tokenize = (text) => {
|
|
7
|
+
const lower = text.toLowerCase();
|
|
8
|
+
const tokens = new Set();
|
|
9
|
+
// Word-level tokens for Latin/Cyrillic text
|
|
10
|
+
for (const token of lower.split(/\W+/)) {
|
|
11
|
+
if (token.length > 2)
|
|
12
|
+
tokens.add(token);
|
|
13
|
+
}
|
|
14
|
+
// Bigram tokens for CJK characters
|
|
15
|
+
const cjkRe = /[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\uAC00-\uD7AF]/g;
|
|
16
|
+
const cjkChars = lower.match(cjkRe);
|
|
17
|
+
if (cjkChars && cjkChars.length >= 2) {
|
|
18
|
+
for (let i = 0; i < cjkChars.length - 1; i++) {
|
|
19
|
+
tokens.add(cjkChars[i] + cjkChars[i + 1]);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return tokens;
|
|
23
|
+
};
|
|
10
24
|
const setA = tokenize(a);
|
|
11
25
|
const setB = tokenize(b);
|
|
12
26
|
if (setA.size === 0 || setB.size === 0)
|
|
@@ -31,7 +45,11 @@ export async function deprecationCheckCommand(options) {
|
|
|
31
45
|
new Migrator(db, ALL_MIGRATIONS).migrate();
|
|
32
46
|
const repository = new KnowledgeRepository(db);
|
|
33
47
|
try {
|
|
34
|
-
|
|
48
|
+
let allNotes = repository.getAllNotes().filter((n) => !n.deprecated);
|
|
49
|
+
if (options.excludeTranslations) {
|
|
50
|
+
const translationPattern = /\.(po|pot|mo|xlf|xliff)$|[\\/](locales?|i18n|translations?)[\\/]|\.i18n\./i;
|
|
51
|
+
allNotes = allNotes.filter((n) => !translationPattern.test(n.file_path));
|
|
52
|
+
}
|
|
35
53
|
const candidates = [];
|
|
36
54
|
// O(n²) comparison — intended for small knowledge bases
|
|
37
55
|
// For large bases, use findNotesByTimeProximity() as pre-filter
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deprecation-check.js","sourceRoot":"","sources":["../../src/commands/deprecation-check.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,QAAQ,EACR,mBAAmB,EACnB,cAAc,GACf,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"deprecation-check.js","sourceRoot":"","sources":["../../src/commands/deprecation-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface DiagnosticResult {
|
|
2
|
+
name: string;
|
|
3
|
+
status: "pass" | "warning" | "error";
|
|
4
|
+
message: string;
|
|
5
|
+
fix?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface DoctorOptions {
|
|
8
|
+
path?: string;
|
|
9
|
+
fix?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function checkKnowledgineDir(knowledgineDir: string): DiagnosticResult;
|
|
12
|
+
export declare function checkDatabaseExists(dbPath: string): DiagnosticResult;
|
|
13
|
+
export declare function checkDatabaseNotEmpty(dbPath: string): DiagnosticResult;
|
|
14
|
+
export declare function checkDatabasePermissions(dbPath: string): DiagnosticResult;
|
|
15
|
+
export declare function checkFTS5Integrity(dbPath: string): DiagnosticResult;
|
|
16
|
+
export declare function checkModelFiles(): DiagnosticResult;
|
|
17
|
+
export declare function checkEmbeddingCoverage(dbPath: string): DiagnosticResult;
|
|
18
|
+
export declare function checkSqliteVec(dbPath: string): Promise<DiagnosticResult>;
|
|
19
|
+
export declare function checkStaleEmbeddings(dbPath: string): DiagnosticResult;
|
|
20
|
+
export declare function checkNodeVersion(): DiagnosticResult;
|
|
21
|
+
export declare function checkSearchLatency(dbPath: string): Promise<DiagnosticResult>;
|
|
22
|
+
export declare function doctorCommand(options: DoctorOptions): Promise<void>;
|
|
23
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAGD,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,gBAAgB,CAc5E;AAGD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAwBpE;AAGD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAsBtE;AAGD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CA+BzE;AAGD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CA8CnE;AAGD,wBAAgB,eAAe,IAAI,gBAAgB,CA0BlD;AAGD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAsEvE;AAGD,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqC9E;AAGD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CA8DrE;AAGD,wBAAgB,gBAAgB,IAAI,gBAAgB,CAwBnD;AAGD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuDlF;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA2KzE"}
|