@hasna/todos 0.11.28 → 0.11.30
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/cli/index.js +26047 -27776
- package/dist/db/agents.d.ts.map +1 -1
- package/dist/db/checkpoints.d.ts +55 -0
- package/dist/db/checkpoints.d.ts.map +1 -0
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/migrations.d.ts +2 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/pg-migrations.d.ts.map +1 -1
- package/dist/db/schema.d.ts +0 -1
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/task-crud.d.ts +13 -0
- package/dist/db/task-crud.d.ts.map +1 -0
- package/dist/db/task-graph.d.ts +27 -0
- package/dist/db/task-graph.d.ts.map +1 -0
- package/dist/db/task-lifecycle.d.ts +80 -0
- package/dist/db/task-lifecycle.d.ts.map +1 -0
- package/dist/db/task-relations.d.ts +86 -0
- package/dist/db/task-relations.d.ts.map +1 -0
- package/dist/db/task-status.d.ts +65 -0
- package/dist/db/task-status.d.ts.map +1 -0
- package/dist/db/tasks.d.ts +10 -230
- package/dist/db/tasks.d.ts.map +1 -1
- package/dist/db/webhooks.d.ts +10 -0
- package/dist/db/webhooks.d.ts.map +1 -1
- package/dist/index.js +3210 -2486
- package/dist/lib/github.d.ts +1 -1
- package/dist/lib/github.d.ts.map +1 -1
- package/dist/lib/north-star.d.ts +33 -0
- package/dist/lib/north-star.d.ts.map +1 -0
- package/dist/lib/task-runner.d.ts +101 -0
- package/dist/lib/task-runner.d.ts.map +1 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +22857 -26511
- package/dist/mcp/tools/cloud.d.ts.map +1 -1
- package/dist/mcp/tools/code-tools.d.ts +15 -0
- package/dist/mcp/tools/code-tools.d.ts.map +1 -0
- package/dist/mcp/tools/task-adv-tools.d.ts +20 -0
- package/dist/mcp/tools/task-adv-tools.d.ts.map +1 -0
- package/dist/mcp/tools/task-auto-tools.d.ts +20 -0
- package/dist/mcp/tools/task-auto-tools.d.ts.map +1 -0
- package/dist/mcp/tools/task-crud.d.ts +20 -0
- package/dist/mcp/tools/task-crud.d.ts.map +1 -0
- package/dist/mcp/tools/task-meta-tools.d.ts +12 -0
- package/dist/mcp/tools/task-meta-tools.d.ts.map +1 -0
- package/dist/mcp/tools/task-project-tools.d.ts +20 -0
- package/dist/mcp/tools/task-project-tools.d.ts.map +1 -0
- package/dist/mcp/tools/task-rel-tools.d.ts +19 -0
- package/dist/mcp/tools/task-rel-tools.d.ts.map +1 -0
- package/dist/mcp/tools/task-resources.d.ts +13 -0
- package/dist/mcp/tools/task-resources.d.ts.map +1 -0
- package/dist/mcp/tools/task-workflow-tools.d.ts +20 -0
- package/dist/mcp/tools/task-workflow-tools.d.ts.map +1 -0
- package/dist/mcp/tools/webhooks.d.ts.map +1 -1
- package/dist/sdk/client.d.ts +361 -0
- package/dist/sdk/client.d.ts.map +1 -0
- package/dist/sdk/index.d.ts +14 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/types.d.ts +167 -0
- package/dist/sdk/types.d.ts.map +1 -0
- package/dist/sdk.d.ts +15 -182
- package/dist/sdk.d.ts.map +1 -1
- package/dist/server/index.js +2039 -2708
- package/dist/server/routes.d.ts +85 -0
- package/dist/server/routes.d.ts.map +1 -0
- package/dist/server/serve.d.ts +29 -0
- package/dist/server/serve.d.ts.map +1 -1
- package/dist/types/index.d.ts +105 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/db/tasks.d.ts
CHANGED
|
@@ -1,231 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export declare function startTask(id: string, agentId: string, db?: Database): Task;
|
|
12
|
-
export declare function completeTask(id: string, agentId?: string, db?: Database, options?: {
|
|
13
|
-
files_changed?: string[];
|
|
14
|
-
test_results?: string;
|
|
15
|
-
commit_hash?: string;
|
|
16
|
-
notes?: string;
|
|
17
|
-
attachment_ids?: string[];
|
|
18
|
-
skip_recurrence?: boolean;
|
|
19
|
-
confidence?: number;
|
|
20
|
-
}): Task;
|
|
21
|
-
export declare function lockTask(id: string, agentId: string, db?: Database): LockResult;
|
|
22
|
-
export declare function unlockTask(id: string, agentId?: string, db?: Database): boolean;
|
|
23
|
-
export declare function addDependency(taskId: string, dependsOn: string, db?: Database): void;
|
|
24
|
-
export declare function removeDependency(taskId: string, dependsOn: string, db?: Database): boolean;
|
|
25
|
-
export declare function getTaskDependencies(taskId: string, db?: Database): TaskDependency[];
|
|
26
|
-
export declare function getTaskDependents(taskId: string, db?: Database): TaskDependency[];
|
|
27
|
-
export declare function cloneTask(taskId: string, overrides?: Partial<CreateTaskInput>, db?: Database): Task;
|
|
28
|
-
export interface TaskGraphNode {
|
|
29
|
-
id: string;
|
|
30
|
-
short_id: string | null;
|
|
31
|
-
title: string;
|
|
32
|
-
status: string;
|
|
33
|
-
priority: string;
|
|
34
|
-
is_blocked: boolean;
|
|
35
|
-
}
|
|
36
|
-
export interface TaskGraph {
|
|
37
|
-
task: TaskGraphNode;
|
|
38
|
-
depends_on: TaskGraph[];
|
|
39
|
-
blocks: TaskGraph[];
|
|
40
|
-
}
|
|
41
|
-
export declare function getTaskGraph(taskId: string, direction?: "up" | "down" | "both", db?: Database): TaskGraph;
|
|
42
|
-
export declare function moveTask(taskId: string, target: {
|
|
43
|
-
task_list_id?: string | null;
|
|
44
|
-
project_id?: string | null;
|
|
45
|
-
plan_id?: string | null;
|
|
46
|
-
}, db?: Database): Task;
|
|
47
|
-
export declare function claimNextTask(agentId: string, filters?: {
|
|
48
|
-
project_id?: string;
|
|
49
|
-
task_list_id?: string;
|
|
50
|
-
plan_id?: string;
|
|
51
|
-
tags?: string[];
|
|
52
|
-
}, db?: Database): Task | null;
|
|
53
|
-
export declare function getNextTask(agentId?: string, filters?: {
|
|
54
|
-
project_id?: string;
|
|
55
|
-
task_list_id?: string;
|
|
56
|
-
plan_id?: string;
|
|
57
|
-
tags?: string[];
|
|
58
|
-
}, db?: Database): Task | null;
|
|
59
|
-
export interface ActiveWorkItem {
|
|
60
|
-
id: string;
|
|
61
|
-
short_id: string | null;
|
|
62
|
-
title: string;
|
|
63
|
-
priority: string;
|
|
64
|
-
assigned_to: string | null;
|
|
65
|
-
locked_by: string | null;
|
|
66
|
-
locked_at: string | null;
|
|
67
|
-
updated_at: string;
|
|
68
|
-
}
|
|
69
|
-
export declare function getActiveWork(filters?: {
|
|
70
|
-
project_id?: string;
|
|
71
|
-
task_list_id?: string;
|
|
72
|
-
}, db?: Database): ActiveWorkItem[];
|
|
73
|
-
export declare function getTasksChangedSince(since: string, filters?: {
|
|
74
|
-
project_id?: string;
|
|
75
|
-
task_list_id?: string;
|
|
76
|
-
}, db?: Database): Task[];
|
|
77
|
-
export declare function failTask(id: string, agentId?: string, reason?: string, options?: {
|
|
78
|
-
retry?: boolean;
|
|
79
|
-
retry_after?: string;
|
|
80
|
-
error_code?: string;
|
|
81
|
-
}, db?: Database): {
|
|
82
|
-
task: Task;
|
|
83
|
-
retryTask?: Task;
|
|
84
|
-
};
|
|
85
|
-
export declare function getStaleTasks(staleMinutes?: number, filters?: {
|
|
86
|
-
project_id?: string;
|
|
87
|
-
task_list_id?: string;
|
|
88
|
-
}, db?: Database): Task[];
|
|
89
|
-
/**
|
|
90
|
-
* Log cost (tokens + USD) to a task. Accumulates — does not replace.
|
|
91
|
-
*/
|
|
92
|
-
export declare function logCost(taskId: string, tokens: number, usd: number, db?: Database): void;
|
|
93
|
-
/**
|
|
94
|
-
* Work-stealing: find the highest-priority stale in_progress task and reassign it to the given agent.
|
|
95
|
-
* A task is stealable if it's in_progress and its lock/update is older than staleMinutes.
|
|
96
|
-
*/
|
|
97
|
-
export declare function stealTask(agentId: string, opts?: {
|
|
98
|
-
stale_minutes?: number;
|
|
99
|
-
project_id?: string;
|
|
100
|
-
task_list_id?: string;
|
|
101
|
-
}, db?: Database): Task | null;
|
|
102
|
-
/**
|
|
103
|
-
* Enhanced claim: try pending queue first, then steal from stale agents if nothing pending.
|
|
104
|
-
*/
|
|
105
|
-
export declare function claimOrSteal(agentId: string, filters?: {
|
|
106
|
-
project_id?: string;
|
|
107
|
-
task_list_id?: string;
|
|
108
|
-
plan_id?: string;
|
|
109
|
-
tags?: string[];
|
|
110
|
-
stale_minutes?: number;
|
|
111
|
-
}, db?: Database): {
|
|
112
|
-
task: Task;
|
|
113
|
-
stolen: boolean;
|
|
114
|
-
} | null;
|
|
115
|
-
export interface StatusSummary {
|
|
116
|
-
pending: number;
|
|
117
|
-
in_progress: number;
|
|
118
|
-
completed: number;
|
|
119
|
-
total: number;
|
|
120
|
-
active_work: ActiveWorkItem[];
|
|
121
|
-
next_task: Task | null;
|
|
122
|
-
stale_count: number;
|
|
123
|
-
overdue_recurring: number;
|
|
124
|
-
blocked_tasks?: {
|
|
125
|
-
id: string;
|
|
126
|
-
short_id: string | null;
|
|
127
|
-
title: string;
|
|
128
|
-
blocked_by: {
|
|
129
|
-
id: string;
|
|
130
|
-
short_id: string | null;
|
|
131
|
-
title: string;
|
|
132
|
-
status: string;
|
|
133
|
-
}[];
|
|
134
|
-
}[];
|
|
135
|
-
}
|
|
136
|
-
export declare function getStatus(filters?: {
|
|
137
|
-
project_id?: string;
|
|
138
|
-
task_list_id?: string;
|
|
139
|
-
}, agentId?: string, options?: {
|
|
140
|
-
explain_blocked?: boolean;
|
|
141
|
-
}, db?: Database): StatusSummary;
|
|
142
|
-
export interface DecomposeSubtaskInput {
|
|
143
|
-
title: string;
|
|
144
|
-
description?: string;
|
|
145
|
-
priority?: Task["priority"];
|
|
146
|
-
assigned_to?: string;
|
|
147
|
-
estimated_minutes?: number;
|
|
148
|
-
tags?: string[];
|
|
149
|
-
}
|
|
150
|
-
export declare function decomposeTasks(parentId: string, subtasks: DecomposeSubtaskInput[], options?: {
|
|
151
|
-
depends_on_prev?: boolean;
|
|
152
|
-
}, db?: Database): {
|
|
153
|
-
parent: Task;
|
|
154
|
-
subtasks: Task[];
|
|
155
|
-
};
|
|
156
|
-
export declare function setTaskStatus(id: string, status: TaskStatus, _agentId?: string, db?: Database): Task;
|
|
157
|
-
export declare function setTaskPriority(id: string, priority: TaskPriority, _agentId?: string, db?: Database): Task;
|
|
158
|
-
export declare function redistributeStaleTasks(agentId: string, options?: {
|
|
159
|
-
max_age_minutes?: number;
|
|
160
|
-
project_id?: string;
|
|
161
|
-
limit?: number;
|
|
162
|
-
}, db?: Database): {
|
|
163
|
-
released: Task[];
|
|
164
|
-
claimed: Task | null;
|
|
165
|
-
};
|
|
166
|
-
export declare function getTaskStats(filters?: {
|
|
167
|
-
project_id?: string;
|
|
168
|
-
task_list_id?: string;
|
|
169
|
-
agent_id?: string;
|
|
170
|
-
}, db?: Database): {
|
|
171
|
-
total: number;
|
|
172
|
-
by_status: Record<string, number>;
|
|
173
|
-
by_priority: Record<string, number>;
|
|
174
|
-
completion_rate: number;
|
|
175
|
-
by_agent: Record<string, number>;
|
|
176
|
-
};
|
|
177
|
-
export interface BulkCreateTaskInput {
|
|
178
|
-
temp_id?: string;
|
|
179
|
-
title: string;
|
|
180
|
-
description?: string;
|
|
181
|
-
priority?: "low" | "medium" | "high" | "critical";
|
|
182
|
-
status?: "pending" | "in_progress" | "completed" | "failed" | "cancelled";
|
|
183
|
-
project_id?: string;
|
|
184
|
-
parent_id?: string;
|
|
185
|
-
plan_id?: string;
|
|
186
|
-
task_list_id?: string;
|
|
187
|
-
agent_id?: string;
|
|
188
|
-
assigned_to?: string;
|
|
189
|
-
tags?: string[];
|
|
190
|
-
metadata?: Record<string, unknown>;
|
|
191
|
-
estimated_minutes?: number;
|
|
192
|
-
depends_on_temp_ids?: string[];
|
|
193
|
-
}
|
|
194
|
-
export declare function bulkCreateTasks(inputs: BulkCreateTaskInput[], db?: Database): {
|
|
195
|
-
created: {
|
|
196
|
-
temp_id: string | null;
|
|
197
|
-
id: string;
|
|
198
|
-
short_id: string | null;
|
|
199
|
-
title: string;
|
|
200
|
-
}[];
|
|
201
|
-
};
|
|
202
|
-
export declare function bulkUpdateTasks(taskIds: string[], updates: {
|
|
203
|
-
status?: Task["status"];
|
|
204
|
-
priority?: Task["priority"];
|
|
205
|
-
assigned_to?: string;
|
|
206
|
-
tags?: string[];
|
|
207
|
-
}, db?: Database): {
|
|
208
|
-
updated: number;
|
|
209
|
-
failed: {
|
|
210
|
-
id: string;
|
|
211
|
-
error: string;
|
|
212
|
-
}[];
|
|
213
|
-
};
|
|
214
|
-
/**
|
|
215
|
-
* Archive tasks matching the criteria. Archives completed/failed/cancelled tasks
|
|
216
|
-
* older than `olderThanDays` days. Returns count of archived tasks.
|
|
217
|
-
*/
|
|
218
|
-
export declare function archiveTasks(options: {
|
|
219
|
-
project_id?: string;
|
|
220
|
-
task_list_id?: string;
|
|
221
|
-
older_than_days?: number;
|
|
222
|
-
status?: TaskStatus[];
|
|
223
|
-
}, db?: Database): {
|
|
224
|
-
archived: number;
|
|
225
|
-
};
|
|
226
|
-
/**
|
|
227
|
-
* Unarchive (restore) a specific task.
|
|
228
|
-
*/
|
|
229
|
-
export declare function unarchiveTask(id: string, db?: Database): Task | null;
|
|
230
|
-
export declare function getOverdueTasks(projectId?: string, db?: Database): Task[];
|
|
1
|
+
export { createTask, getTask, getTaskWithRelations, listTasks, countTasks, updateTask, deleteTask, rowToTask, insertTaskTags, replaceTaskTags, } from "./task-crud.js";
|
|
2
|
+
export { startTask, completeTask, failTask, lockTask, unlockTask, claimNextTask, getNextTask, getActiveWork, getTasksChangedSince, stealTask, claimOrSteal, getBlockingDeps, getStaleTasks, } from "./task-lifecycle.js";
|
|
3
|
+
export type { ActiveWorkItem } from "./task-lifecycle.js";
|
|
4
|
+
export { addDependency, removeDependency, getTaskDependencies, getTaskDependents, cloneTask, getTaskGraph, moveTask, } from "./task-graph.js";
|
|
5
|
+
export type { TaskGraphNode, TaskGraph } from "./task-graph.js";
|
|
6
|
+
export { getStatus, decomposeTasks, setTaskStatus, setTaskPriority, redistributeStaleTasks, getTaskStats, } from "./task-status.js";
|
|
7
|
+
export type { StatusSummary, DecomposeSubtaskInput } from "./task-status.js";
|
|
8
|
+
export { bulkCreateTasks, bulkUpdateTasks, archiveTasks, unarchiveTask, getOverdueTasks, logTime, getTimeLogs, getTimeReport, watchTask, unwatchTask, getTaskWatchers, notifyWatchers, logCost, } from "./task-relations.js";
|
|
9
|
+
export type { BulkCreateTaskInput, LogTimeInput } from "./task-relations.ts";
|
|
10
|
+
export type { TaskFilter } from "../types/index.js";
|
|
231
11
|
//# sourceMappingURL=tasks.d.ts.map
|
package/dist/db/tasks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/db/tasks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/db/tasks.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,UAAU,EACV,OAAO,EACP,oBAAoB,EACpB,SAAS,EACT,UAAU,EACV,UAAU,EACV,UAAU,EACV,SAAS,EACT,cAAc,EACd,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,aAAa,EACb,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,SAAS,EACT,YAAY,EACZ,eAAe,EACf,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,QAAQ,GACT,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEhE,OAAO,EACL,SAAS,EACT,cAAc,EACd,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,YAAY,GACb,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE7E,OAAO,EACL,eAAe,EACf,eAAe,EACf,YAAY,EACZ,aAAa,EACb,eAAe,EACf,OAAO,EACP,WAAW,EACX,aAAa,EACb,SAAS,EACT,WAAW,EACX,eAAe,EACf,cAAc,EACd,OAAO,GACR,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAG7E,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/db/webhooks.d.ts
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
import type { Database } from "bun:sqlite";
|
|
2
2
|
import type { Webhook, CreateWebhookInput } from "../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Validate webhook URL to prevent SSRF attacks.
|
|
5
|
+
* Blocks localhost, private IPs, and cloud metadata endpoints.
|
|
6
|
+
*/
|
|
7
|
+
export declare function validateWebhookUrl(urlString: string): {
|
|
8
|
+
valid: false;
|
|
9
|
+
error: string;
|
|
10
|
+
} | {
|
|
11
|
+
valid: true;
|
|
12
|
+
};
|
|
3
13
|
export interface WebhookDelivery {
|
|
4
14
|
id: string;
|
|
5
15
|
webhook_id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/db/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/db/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAsBrE;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,CA6CvG;AAyBD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAcD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAsB/E;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CAIpE;AAED,wBAAgB,YAAY,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,EAAE,CAGrD;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAGhE;AAED,wBAAgB,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,eAAe,EAAE,CAM/F;AAqGD,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAcnG"}
|