@kernel.chat/kbot 3.39.0 → 3.41.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/dist/interactive-buttons.d.ts +90 -0
- package/dist/interactive-buttons.d.ts.map +1 -0
- package/dist/interactive-buttons.js +286 -0
- package/dist/interactive-buttons.js.map +1 -0
- package/dist/knowledge-base.d.ts +95 -0
- package/dist/knowledge-base.d.ts.map +1 -0
- package/dist/knowledge-base.js +468 -0
- package/dist/knowledge-base.js.map +1 -0
- package/dist/memory-hotswap.d.ts +58 -0
- package/dist/memory-hotswap.d.ts.map +1 -0
- package/dist/memory-hotswap.js +288 -0
- package/dist/memory-hotswap.js.map +1 -0
- package/dist/pattern-feed.d.ts +65 -0
- package/dist/pattern-feed.d.ts.map +1 -0
- package/dist/pattern-feed.js +357 -0
- package/dist/pattern-feed.js.map +1 -0
- package/dist/personal-security.d.ts +142 -0
- package/dist/personal-security.d.ts.map +1 -0
- package/dist/personal-security.js +1151 -0
- package/dist/personal-security.js.map +1 -0
- package/dist/side-conversation.d.ts +58 -0
- package/dist/side-conversation.d.ts.map +1 -0
- package/dist/side-conversation.js +224 -0
- package/dist/side-conversation.js.map +1 -0
- package/dist/user-graph.d.ts +123 -0
- package/dist/user-graph.d.ts.map +1 -0
- package/dist/user-graph.js +435 -0
- package/dist/user-graph.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
// kbot Memory Hot-Swap — Swap learning modules at runtime
|
|
2
|
+
//
|
|
3
|
+
// Load different expertise profiles for different projects
|
|
4
|
+
// without restarting kbot. Profiles contain patterns, solutions,
|
|
5
|
+
// user profile, and routing data.
|
|
6
|
+
//
|
|
7
|
+
// Stored at ~/.kbot/memory-profiles/{name}/
|
|
8
|
+
import { homedir } from 'node:os';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, cpSync, rmSync, statSync, } from 'node:fs';
|
|
11
|
+
const KBOT_DIR = join(homedir(), '.kbot');
|
|
12
|
+
const MEMORY_DIR = join(KBOT_DIR, 'memory');
|
|
13
|
+
const PROFILES_DIR = join(KBOT_DIR, 'memory-profiles');
|
|
14
|
+
const ACTIVE_PROFILE_FILE = join(MEMORY_DIR, 'active-profile.json');
|
|
15
|
+
const BACKUP_NAME = '_backup';
|
|
16
|
+
/** Files that constitute a memory profile */
|
|
17
|
+
const PROFILE_FILES = [
|
|
18
|
+
'patterns.json',
|
|
19
|
+
'solutions.json',
|
|
20
|
+
'profile.json',
|
|
21
|
+
'routing-history.json',
|
|
22
|
+
'knowledge.json',
|
|
23
|
+
'corrections.json',
|
|
24
|
+
'context.md',
|
|
25
|
+
];
|
|
26
|
+
function ensureDir(dir) {
|
|
27
|
+
if (!existsSync(dir))
|
|
28
|
+
mkdirSync(dir, { recursive: true });
|
|
29
|
+
}
|
|
30
|
+
function ensureProfilesDir() {
|
|
31
|
+
ensureDir(PROFILES_DIR);
|
|
32
|
+
}
|
|
33
|
+
function ensureMemoryDir() {
|
|
34
|
+
ensureDir(MEMORY_DIR);
|
|
35
|
+
}
|
|
36
|
+
function profileDir(name) {
|
|
37
|
+
return join(PROFILES_DIR, name);
|
|
38
|
+
}
|
|
39
|
+
function loadJSON(path, fallback) {
|
|
40
|
+
if (!existsSync(path))
|
|
41
|
+
return fallback;
|
|
42
|
+
try {
|
|
43
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return fallback;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function countPatterns(dir) {
|
|
50
|
+
const patternsPath = join(dir, 'patterns.json');
|
|
51
|
+
const patterns = loadJSON(patternsPath, []);
|
|
52
|
+
return Array.isArray(patterns) ? patterns.length : 0;
|
|
53
|
+
}
|
|
54
|
+
/** Copy memory files from source directory to target directory */
|
|
55
|
+
function copyMemoryFiles(sourceDir, targetDir) {
|
|
56
|
+
ensureDir(targetDir);
|
|
57
|
+
let copied = 0;
|
|
58
|
+
for (const file of PROFILE_FILES) {
|
|
59
|
+
const src = join(sourceDir, file);
|
|
60
|
+
if (existsSync(src)) {
|
|
61
|
+
cpSync(src, join(targetDir, file));
|
|
62
|
+
copied++;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return copied;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Scan ~/.kbot/memory-profiles/ for saved profiles.
|
|
69
|
+
* Returns array of profile metadata.
|
|
70
|
+
*/
|
|
71
|
+
export function listMemoryProfiles() {
|
|
72
|
+
ensureProfilesDir();
|
|
73
|
+
const entries = readdirSync(PROFILES_DIR, { withFileTypes: true });
|
|
74
|
+
const profiles = [];
|
|
75
|
+
for (const entry of entries) {
|
|
76
|
+
if (!entry.isDirectory())
|
|
77
|
+
continue;
|
|
78
|
+
// Skip the internal backup directory
|
|
79
|
+
if (entry.name === BACKUP_NAME)
|
|
80
|
+
continue;
|
|
81
|
+
const dir = profileDir(entry.name);
|
|
82
|
+
const metaPath = join(dir, 'metadata.json');
|
|
83
|
+
const meta = loadJSON(metaPath, {
|
|
84
|
+
name: entry.name,
|
|
85
|
+
description: '',
|
|
86
|
+
expertise: '',
|
|
87
|
+
created_at: '',
|
|
88
|
+
updated_at: '',
|
|
89
|
+
});
|
|
90
|
+
// If no created_at in metadata, use directory stat
|
|
91
|
+
let createdAt = meta.created_at;
|
|
92
|
+
if (!createdAt) {
|
|
93
|
+
try {
|
|
94
|
+
const stat = statSync(dir);
|
|
95
|
+
createdAt = stat.birthtime.toISOString();
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
createdAt = new Date().toISOString();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
profiles.push({
|
|
102
|
+
name: meta.name || entry.name,
|
|
103
|
+
description: meta.description || '',
|
|
104
|
+
patterns_count: countPatterns(dir),
|
|
105
|
+
created_at: createdAt,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return profiles.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Snapshot current ~/.kbot/memory/ into a named profile.
|
|
112
|
+
* Saves all learning data (patterns, solutions, profile, routing).
|
|
113
|
+
*/
|
|
114
|
+
export function saveCurrentAsProfile(name, description) {
|
|
115
|
+
ensureMemoryDir();
|
|
116
|
+
ensureProfilesDir();
|
|
117
|
+
const sanitized = name.toLowerCase().replace(/[^a-z0-9_-]/g, '-').slice(0, 60);
|
|
118
|
+
const targetDir = profileDir(sanitized);
|
|
119
|
+
// Copy current memory files into the profile directory
|
|
120
|
+
copyMemoryFiles(MEMORY_DIR, targetDir);
|
|
121
|
+
// Count patterns in the snapshot
|
|
122
|
+
const patternsCount = countPatterns(targetDir);
|
|
123
|
+
// Write metadata
|
|
124
|
+
const meta = {
|
|
125
|
+
name: sanitized,
|
|
126
|
+
description: description || `Profile snapshot of ${name}`,
|
|
127
|
+
expertise: '',
|
|
128
|
+
created_at: new Date().toISOString(),
|
|
129
|
+
updated_at: new Date().toISOString(),
|
|
130
|
+
};
|
|
131
|
+
writeFileSync(join(targetDir, 'metadata.json'), JSON.stringify(meta, null, 2));
|
|
132
|
+
return { name: sanitized, patterns_saved: patternsCount };
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Load a named profile into ~/.kbot/memory/.
|
|
136
|
+
* Backs up current memory to _backup first.
|
|
137
|
+
*/
|
|
138
|
+
export function loadProfile(name) {
|
|
139
|
+
ensureProfilesDir();
|
|
140
|
+
ensureMemoryDir();
|
|
141
|
+
const sanitized = name.toLowerCase().replace(/[^a-z0-9_-]/g, '-').slice(0, 60);
|
|
142
|
+
const sourceDir = profileDir(sanitized);
|
|
143
|
+
if (!existsSync(sourceDir)) {
|
|
144
|
+
throw new Error(`Profile "${sanitized}" not found in ${PROFILES_DIR}`);
|
|
145
|
+
}
|
|
146
|
+
// Backup current memory
|
|
147
|
+
const backupDir = profileDir(BACKUP_NAME);
|
|
148
|
+
copyMemoryFiles(MEMORY_DIR, backupDir);
|
|
149
|
+
// Write backup metadata
|
|
150
|
+
const backupMeta = {
|
|
151
|
+
name: BACKUP_NAME,
|
|
152
|
+
description: 'Auto-backup before profile load',
|
|
153
|
+
expertise: '',
|
|
154
|
+
created_at: new Date().toISOString(),
|
|
155
|
+
updated_at: new Date().toISOString(),
|
|
156
|
+
};
|
|
157
|
+
writeFileSync(join(backupDir, 'metadata.json'), JSON.stringify(backupMeta, null, 2));
|
|
158
|
+
// Copy profile files into memory directory
|
|
159
|
+
copyMemoryFiles(sourceDir, MEMORY_DIR);
|
|
160
|
+
const patternsLoaded = countPatterns(MEMORY_DIR);
|
|
161
|
+
// Mark the active profile
|
|
162
|
+
const marker = {
|
|
163
|
+
name: sanitized,
|
|
164
|
+
loaded_at: new Date().toISOString(),
|
|
165
|
+
previous_backup: BACKUP_NAME,
|
|
166
|
+
};
|
|
167
|
+
writeFileSync(ACTIVE_PROFILE_FILE, JSON.stringify(marker, null, 2));
|
|
168
|
+
return {
|
|
169
|
+
name: sanitized,
|
|
170
|
+
patterns_loaded: patternsLoaded,
|
|
171
|
+
previous_backup: BACKUP_NAME,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Unload the current profile, restoring from _backup.
|
|
176
|
+
* Returns to the previous state before loadProfile was called.
|
|
177
|
+
*/
|
|
178
|
+
export function unloadProfile() {
|
|
179
|
+
ensureMemoryDir();
|
|
180
|
+
ensureProfilesDir();
|
|
181
|
+
const active = getActiveProfile();
|
|
182
|
+
if (!active) {
|
|
183
|
+
return { restored: false, previous_profile: null };
|
|
184
|
+
}
|
|
185
|
+
const backupDir = profileDir(BACKUP_NAME);
|
|
186
|
+
if (!existsSync(backupDir)) {
|
|
187
|
+
throw new Error('No backup found. Cannot unload profile without a previous backup.');
|
|
188
|
+
}
|
|
189
|
+
const previousName = active.name;
|
|
190
|
+
// Restore backup into memory
|
|
191
|
+
copyMemoryFiles(backupDir, MEMORY_DIR);
|
|
192
|
+
// Remove the active profile marker
|
|
193
|
+
if (existsSync(ACTIVE_PROFILE_FILE)) {
|
|
194
|
+
rmSync(ACTIVE_PROFILE_FILE);
|
|
195
|
+
}
|
|
196
|
+
// Clean up backup
|
|
197
|
+
rmSync(backupDir, { recursive: true, force: true });
|
|
198
|
+
return { restored: true, previous_profile: previousName };
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Create a new empty profile with metadata.
|
|
202
|
+
* Seeds initial routing preferences based on expertise string.
|
|
203
|
+
*/
|
|
204
|
+
export function createProfile(name, description, expertise) {
|
|
205
|
+
ensureProfilesDir();
|
|
206
|
+
const sanitized = name.toLowerCase().replace(/[^a-z0-9_-]/g, '-').slice(0, 60);
|
|
207
|
+
const targetDir = profileDir(sanitized);
|
|
208
|
+
if (existsSync(targetDir)) {
|
|
209
|
+
throw new Error(`Profile "${sanitized}" already exists`);
|
|
210
|
+
}
|
|
211
|
+
ensureDir(targetDir);
|
|
212
|
+
// Write metadata
|
|
213
|
+
const meta = {
|
|
214
|
+
name: sanitized,
|
|
215
|
+
description,
|
|
216
|
+
expertise,
|
|
217
|
+
created_at: new Date().toISOString(),
|
|
218
|
+
updated_at: new Date().toISOString(),
|
|
219
|
+
};
|
|
220
|
+
writeFileSync(join(targetDir, 'metadata.json'), JSON.stringify(meta, null, 2));
|
|
221
|
+
// Seed empty patterns and solutions
|
|
222
|
+
writeFileSync(join(targetDir, 'patterns.json'), JSON.stringify([], null, 2));
|
|
223
|
+
writeFileSync(join(targetDir, 'solutions.json'), JSON.stringify([], null, 2));
|
|
224
|
+
// Seed routing preferences based on expertise
|
|
225
|
+
const routingPrefs = buildRoutingPreferences(expertise);
|
|
226
|
+
writeFileSync(join(targetDir, 'routing-history.json'), JSON.stringify(routingPrefs, null, 2));
|
|
227
|
+
// Seed profile with expertise info
|
|
228
|
+
const userProfile = {
|
|
229
|
+
expertise,
|
|
230
|
+
preferred_languages: [expertise],
|
|
231
|
+
created_at: new Date().toISOString(),
|
|
232
|
+
};
|
|
233
|
+
writeFileSync(join(targetDir, 'profile.json'), JSON.stringify(userProfile, null, 2));
|
|
234
|
+
return { name: sanitized, created: true };
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Returns which profile is currently loaded.
|
|
238
|
+
* Reads ~/.kbot/memory/active-profile.json.
|
|
239
|
+
*/
|
|
240
|
+
export function getActiveProfile() {
|
|
241
|
+
ensureMemoryDir();
|
|
242
|
+
if (!existsSync(ACTIVE_PROFILE_FILE))
|
|
243
|
+
return null;
|
|
244
|
+
try {
|
|
245
|
+
return JSON.parse(readFileSync(ACTIVE_PROFILE_FILE, 'utf-8'));
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/** Build initial routing preferences from an expertise keyword */
|
|
252
|
+
function buildRoutingPreferences(expertise) {
|
|
253
|
+
const agentMap = {
|
|
254
|
+
python: 'coder',
|
|
255
|
+
react: 'coder',
|
|
256
|
+
typescript: 'coder',
|
|
257
|
+
rust: 'coder',
|
|
258
|
+
go: 'coder',
|
|
259
|
+
java: 'coder',
|
|
260
|
+
swift: 'coder',
|
|
261
|
+
ruby: 'coder',
|
|
262
|
+
devops: 'infrastructure',
|
|
263
|
+
docker: 'infrastructure',
|
|
264
|
+
terraform: 'infrastructure',
|
|
265
|
+
kubernetes: 'infrastructure',
|
|
266
|
+
security: 'guardian',
|
|
267
|
+
design: 'aesthete',
|
|
268
|
+
writing: 'writer',
|
|
269
|
+
research: 'researcher',
|
|
270
|
+
data: 'quant',
|
|
271
|
+
trading: 'quant',
|
|
272
|
+
strategy: 'strategist',
|
|
273
|
+
};
|
|
274
|
+
const agent = agentMap[expertise.toLowerCase()] || 'coder';
|
|
275
|
+
const now = new Date().toISOString();
|
|
276
|
+
return [
|
|
277
|
+
{
|
|
278
|
+
intent: expertise.toLowerCase(),
|
|
279
|
+
keywords: [expertise.toLowerCase()],
|
|
280
|
+
agent,
|
|
281
|
+
method: 'category',
|
|
282
|
+
success: true,
|
|
283
|
+
count: 1,
|
|
284
|
+
lastUsed: now,
|
|
285
|
+
},
|
|
286
|
+
];
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=memory-hotswap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-hotswap.js","sourceRoot":"","sources":["../src/memory-hotswap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export interface FeedPattern {
|
|
2
|
+
/** Pattern type: intent_match, tool_sequence, etc. */
|
|
3
|
+
type: string;
|
|
4
|
+
/** Programming language (if detected) */
|
|
5
|
+
language: string | null;
|
|
6
|
+
/** Framework (if detected) */
|
|
7
|
+
framework: string | null;
|
|
8
|
+
/** Success rate 0-1 */
|
|
9
|
+
successRate: number;
|
|
10
|
+
/** Tool names used */
|
|
11
|
+
toolsUsed: string[];
|
|
12
|
+
/** Agent that handled it */
|
|
13
|
+
agentUsed: string | null;
|
|
14
|
+
/** Number of times this pattern was observed */
|
|
15
|
+
hits: number;
|
|
16
|
+
/** Keywords (generic tech terms) */
|
|
17
|
+
keywords: string[];
|
|
18
|
+
/** Confidence score (0-1) */
|
|
19
|
+
confidence: number;
|
|
20
|
+
/** Number of contributing sources */
|
|
21
|
+
sampleCount: number;
|
|
22
|
+
/** Last updated timestamp */
|
|
23
|
+
lastUpdated: string;
|
|
24
|
+
/** Source: 'local' or 'collective' */
|
|
25
|
+
source: 'local' | 'collective';
|
|
26
|
+
}
|
|
27
|
+
export interface FeedEntry {
|
|
28
|
+
/** Human-readable insight */
|
|
29
|
+
insight: string;
|
|
30
|
+
/** Feed category */
|
|
31
|
+
category: FeedCategory;
|
|
32
|
+
/** Relevance score (higher = more relevant) */
|
|
33
|
+
score: number;
|
|
34
|
+
/** Underlying pattern */
|
|
35
|
+
pattern: FeedPattern;
|
|
36
|
+
}
|
|
37
|
+
export type FeedCategory = 'tools_that_worked' | 'best_agents' | 'common_solutions' | 'forged_tools';
|
|
38
|
+
export interface FeedResult {
|
|
39
|
+
entries: FeedEntry[];
|
|
40
|
+
total_patterns_scanned: number;
|
|
41
|
+
project_type: string | null;
|
|
42
|
+
}
|
|
43
|
+
/** Format a single pattern as a readable insight */
|
|
44
|
+
export declare function formatFeedEntry(pattern: FeedPattern): string;
|
|
45
|
+
/**
|
|
46
|
+
* Run the pattern feed. Reads local + collective patterns, scores them,
|
|
47
|
+
* groups by category, and returns the top 20 insights.
|
|
48
|
+
*
|
|
49
|
+
* @param options.projectType - Optional project type filter (react, python, etc.)
|
|
50
|
+
* @returns Feed result with entries, total patterns scanned, and project type
|
|
51
|
+
*/
|
|
52
|
+
export declare function runPatternFeed(options?: {
|
|
53
|
+
projectType?: string;
|
|
54
|
+
}): FeedResult;
|
|
55
|
+
/**
|
|
56
|
+
* Get a feed filtered for a specific project type.
|
|
57
|
+
* Returns patterns that other users of the same stack found useful.
|
|
58
|
+
*/
|
|
59
|
+
export declare function getFeedForProject(projectType: string): FeedResult;
|
|
60
|
+
/**
|
|
61
|
+
* Full-text search across all patterns.
|
|
62
|
+
* Returns matching insights with confidence scores.
|
|
63
|
+
*/
|
|
64
|
+
export declare function searchFeed(query: string): FeedEntry[];
|
|
65
|
+
//# sourceMappingURL=pattern-feed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-feed.d.ts","sourceRoot":"","sources":["../src/pattern-feed.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAA;IACZ,yCAAyC;IACzC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,sBAAsB;IACtB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAA;IACZ,oCAAoC;IACpC,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAA;IACnB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,sCAAsC;IACtC,MAAM,EAAE,OAAO,GAAG,YAAY,CAAA;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,oBAAoB;IACpB,QAAQ,EAAE,YAAY,CAAA;IACtB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAA;IACb,yBAAyB;IACzB,OAAO,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,MAAM,YAAY,GACpB,mBAAmB,GACnB,aAAa,GACb,kBAAkB,GAClB,cAAc,CAAA;AAElB,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AA2MD,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAiD5D;AAID;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CA+E7E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,CAEjE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,CAsDrD"}
|