@push.rocks/smartagent 1.1.0 → 1.1.1
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.
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartagent',
|
|
6
|
-
version: '1.1.
|
|
6
|
+
version: '1.1.1',
|
|
7
7
|
description: 'an agentic framework built on top of @push.rocks/smartai'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDBEQUEwRDtDQUN4RSxDQUFBIn0=
|
package/npmextra.json
CHANGED
|
@@ -14,5 +14,14 @@
|
|
|
14
14
|
"npmci": {
|
|
15
15
|
"npmGlobalTools": [],
|
|
16
16
|
"npmAccessLevel": "public"
|
|
17
|
+
},
|
|
18
|
+
"@git.zone/cli": {
|
|
19
|
+
"release": {
|
|
20
|
+
"registries": [
|
|
21
|
+
"https://verdaccio.lossless.digital",
|
|
22
|
+
"https://registry.npmjs.org"
|
|
23
|
+
],
|
|
24
|
+
"accessLevel": "public"
|
|
25
|
+
}
|
|
17
26
|
}
|
|
18
|
-
}
|
|
27
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartagent",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "an agentic framework built on top of @push.rocks/smartai",
|
|
6
6
|
"main": "dist_ts/index.js",
|
|
@@ -8,12 +8,17 @@
|
|
|
8
8
|
"type": "module",
|
|
9
9
|
"author": "Task Venture Capital GmbH",
|
|
10
10
|
"license": "MIT",
|
|
11
|
+
"scripts": {
|
|
12
|
+
"test": "(tstest test/ --verbose)",
|
|
13
|
+
"build": "(tsbuild --web --allowimplicitany)",
|
|
14
|
+
"buildDocs": "(tsdoc)"
|
|
15
|
+
},
|
|
11
16
|
"devDependencies": {
|
|
12
|
-
"@git.zone/tsbuild": "^
|
|
13
|
-
"@git.zone/tsbundle": "^2.6.
|
|
14
|
-
"@git.zone/tsrun": "^2.0.
|
|
17
|
+
"@git.zone/tsbuild": "^4.0.2",
|
|
18
|
+
"@git.zone/tsbundle": "^2.6.3",
|
|
19
|
+
"@git.zone/tsrun": "^2.0.1",
|
|
15
20
|
"@git.zone/tstest": "^3.1.3",
|
|
16
|
-
"@types/node": "^
|
|
21
|
+
"@types/node": "^25.0.2"
|
|
17
22
|
},
|
|
18
23
|
"dependencies": {
|
|
19
24
|
"@push.rocks/smartai": "^0.8.0",
|
|
@@ -23,6 +28,7 @@
|
|
|
23
28
|
"@push.rocks/smartrequest": "^5.0.1",
|
|
24
29
|
"@push.rocks/smartshell": "^3.3.0"
|
|
25
30
|
},
|
|
31
|
+
"packageManager": "pnpm@10.18.1+sha512.77a884a165cbba2d8d1c19e3b4880eee6d2fcabd0d879121e282196b80042351d5eb3ca0935fa599da1dc51265cc68816ad2bddd2a2de5ea9fdf92adbec7cd34",
|
|
26
32
|
"repository": {
|
|
27
33
|
"type": "git",
|
|
28
34
|
"url": "https://code.foss.global/push.rocks/smartagent.git"
|
|
@@ -43,9 +49,7 @@
|
|
|
43
49
|
"npmextra.json",
|
|
44
50
|
"readme.md"
|
|
45
51
|
],
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"build": "(tsbuild --web --allowimplicitany)",
|
|
49
|
-
"buildDocs": "(tsdoc)"
|
|
52
|
+
"pnpm": {
|
|
53
|
+
"overrides": {}
|
|
50
54
|
}
|
|
51
|
-
}
|
|
55
|
+
}
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import * as plugins from './plugins.js';
|
|
2
|
-
/**
|
|
3
|
-
* Configuration options for SmartAgent
|
|
4
|
-
*/
|
|
5
|
-
export interface ISmartAgentOptions extends plugins.smartai.ISmartAiOptions {
|
|
6
|
-
/** Name of the agent for identification */
|
|
7
|
-
name?: string;
|
|
8
|
-
/** Default provider to use for agent operations */
|
|
9
|
-
defaultProvider?: plugins.smartai.TProvider;
|
|
10
|
-
/** System message that defines the agent's behavior */
|
|
11
|
-
systemMessage?: string;
|
|
12
|
-
/** Maximum number of reasoning steps before forcing completion */
|
|
13
|
-
maxIterations?: number;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Represents a tool that an agent can use
|
|
17
|
-
*/
|
|
18
|
-
export interface IAgentTool {
|
|
19
|
-
/** Unique name for the tool */
|
|
20
|
-
name: string;
|
|
21
|
-
/** Description of what the tool does (used by the AI to decide when to use it) */
|
|
22
|
-
description: string;
|
|
23
|
-
/** JSON schema defining the tool's parameters */
|
|
24
|
-
parameters: Record<string, unknown>;
|
|
25
|
-
/** The function to execute when the tool is called */
|
|
26
|
-
execute: (params: Record<string, unknown>) => Promise<unknown>;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Represents a message in the agent's conversation history
|
|
30
|
-
*/
|
|
31
|
-
export interface IAgentMessage {
|
|
32
|
-
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
33
|
-
content: string;
|
|
34
|
-
toolName?: string;
|
|
35
|
-
toolResult?: unknown;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Result of an agent run
|
|
39
|
-
*/
|
|
40
|
-
export interface IAgentRunResult {
|
|
41
|
-
/** The final response from the agent */
|
|
42
|
-
response: string;
|
|
43
|
-
/** Number of iterations the agent took */
|
|
44
|
-
iterations: number;
|
|
45
|
-
/** Full message history from this run */
|
|
46
|
-
messages: IAgentMessage[];
|
|
47
|
-
/** Whether the agent completed successfully or hit max iterations */
|
|
48
|
-
completed: boolean;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* SmartAgent - An agentic framework built on top of @push.rocks/smartai
|
|
52
|
-
*
|
|
53
|
-
* Provides autonomous agent capabilities including:
|
|
54
|
-
* - Tool use and function calling
|
|
55
|
-
* - Multi-step reasoning
|
|
56
|
-
* - Conversation memory
|
|
57
|
-
* - Multiple AI provider support
|
|
58
|
-
*/
|
|
59
|
-
export declare class SmartAgent {
|
|
60
|
-
options: ISmartAgentOptions;
|
|
61
|
-
smartai: plugins.smartai.SmartAi;
|
|
62
|
-
tools: Map<string, IAgentTool>;
|
|
63
|
-
messageHistory: IAgentMessage[];
|
|
64
|
-
private isStarted;
|
|
65
|
-
constructor(optionsArg: ISmartAgentOptions);
|
|
66
|
-
/**
|
|
67
|
-
* Starts the agent and initializes the underlying SmartAi instance
|
|
68
|
-
*/
|
|
69
|
-
start(): Promise<void>;
|
|
70
|
-
/**
|
|
71
|
-
* Stops the agent and cleans up resources
|
|
72
|
-
*/
|
|
73
|
-
stop(): Promise<void>;
|
|
74
|
-
/**
|
|
75
|
-
* Registers a tool that the agent can use
|
|
76
|
-
*/
|
|
77
|
-
registerTool(tool: IAgentTool): void;
|
|
78
|
-
/**
|
|
79
|
-
* Removes a tool from the agent
|
|
80
|
-
*/
|
|
81
|
-
unregisterTool(toolName: string): void;
|
|
82
|
-
/**
|
|
83
|
-
* Gets all registered tools
|
|
84
|
-
*/
|
|
85
|
-
getTools(): IAgentTool[];
|
|
86
|
-
/**
|
|
87
|
-
* Sets or updates the system message
|
|
88
|
-
*/
|
|
89
|
-
setSystemMessage(message: string): void;
|
|
90
|
-
/**
|
|
91
|
-
* Clears the conversation history (except system message)
|
|
92
|
-
*/
|
|
93
|
-
clearHistory(): void;
|
|
94
|
-
/**
|
|
95
|
-
* Runs the agent with a user message
|
|
96
|
-
* The agent will reason, use tools, and respond autonomously
|
|
97
|
-
*/
|
|
98
|
-
run(userMessage: string): Promise<IAgentRunResult>;
|
|
99
|
-
/**
|
|
100
|
-
* Simple chat without tool use
|
|
101
|
-
*/
|
|
102
|
-
chat(message: string): Promise<string>;
|
|
103
|
-
/**
|
|
104
|
-
* Gets the AI provider based on configuration
|
|
105
|
-
*/
|
|
106
|
-
private getProvider;
|
|
107
|
-
/**
|
|
108
|
-
* Builds tool descriptions for the system prompt
|
|
109
|
-
*/
|
|
110
|
-
private buildToolDescriptions;
|
|
111
|
-
/**
|
|
112
|
-
* Builds the system prompt including tool descriptions
|
|
113
|
-
*/
|
|
114
|
-
private buildSystemPrompt;
|
|
115
|
-
/**
|
|
116
|
-
* Builds the contextual prompt from message history
|
|
117
|
-
*/
|
|
118
|
-
private buildContextualPrompt;
|
|
119
|
-
/**
|
|
120
|
-
* Parses a tool call from the AI response
|
|
121
|
-
*/
|
|
122
|
-
private parseToolCall;
|
|
123
|
-
}
|
|
@@ -1,274 +0,0 @@
|
|
|
1
|
-
import * as plugins from './plugins.js';
|
|
2
|
-
/**
|
|
3
|
-
* SmartAgent - An agentic framework built on top of @push.rocks/smartai
|
|
4
|
-
*
|
|
5
|
-
* Provides autonomous agent capabilities including:
|
|
6
|
-
* - Tool use and function calling
|
|
7
|
-
* - Multi-step reasoning
|
|
8
|
-
* - Conversation memory
|
|
9
|
-
* - Multiple AI provider support
|
|
10
|
-
*/
|
|
11
|
-
export class SmartAgent {
|
|
12
|
-
options;
|
|
13
|
-
smartai;
|
|
14
|
-
tools = new Map();
|
|
15
|
-
messageHistory = [];
|
|
16
|
-
isStarted = false;
|
|
17
|
-
constructor(optionsArg) {
|
|
18
|
-
this.options = {
|
|
19
|
-
name: 'SmartAgent',
|
|
20
|
-
defaultProvider: 'openai',
|
|
21
|
-
maxIterations: 10,
|
|
22
|
-
...optionsArg,
|
|
23
|
-
};
|
|
24
|
-
this.smartai = new plugins.smartai.SmartAi(this.options);
|
|
25
|
-
if (this.options.systemMessage) {
|
|
26
|
-
this.messageHistory.push({
|
|
27
|
-
role: 'system',
|
|
28
|
-
content: this.options.systemMessage,
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Starts the agent and initializes the underlying SmartAi instance
|
|
34
|
-
*/
|
|
35
|
-
async start() {
|
|
36
|
-
if (this.isStarted)
|
|
37
|
-
return;
|
|
38
|
-
await this.smartai.start();
|
|
39
|
-
this.isStarted = true;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Stops the agent and cleans up resources
|
|
43
|
-
*/
|
|
44
|
-
async stop() {
|
|
45
|
-
if (!this.isStarted)
|
|
46
|
-
return;
|
|
47
|
-
await this.smartai.stop();
|
|
48
|
-
this.isStarted = false;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Registers a tool that the agent can use
|
|
52
|
-
*/
|
|
53
|
-
registerTool(tool) {
|
|
54
|
-
this.tools.set(tool.name, tool);
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Removes a tool from the agent
|
|
58
|
-
*/
|
|
59
|
-
unregisterTool(toolName) {
|
|
60
|
-
this.tools.delete(toolName);
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Gets all registered tools
|
|
64
|
-
*/
|
|
65
|
-
getTools() {
|
|
66
|
-
return Array.from(this.tools.values());
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Sets or updates the system message
|
|
70
|
-
*/
|
|
71
|
-
setSystemMessage(message) {
|
|
72
|
-
const existingIndex = this.messageHistory.findIndex(m => m.role === 'system');
|
|
73
|
-
if (existingIndex >= 0) {
|
|
74
|
-
this.messageHistory[existingIndex].content = message;
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
this.messageHistory.unshift({
|
|
78
|
-
role: 'system',
|
|
79
|
-
content: message,
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Clears the conversation history (except system message)
|
|
85
|
-
*/
|
|
86
|
-
clearHistory() {
|
|
87
|
-
this.messageHistory = this.messageHistory.filter(m => m.role === 'system');
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Runs the agent with a user message
|
|
91
|
-
* The agent will reason, use tools, and respond autonomously
|
|
92
|
-
*/
|
|
93
|
-
async run(userMessage) {
|
|
94
|
-
if (!this.isStarted) {
|
|
95
|
-
await this.start();
|
|
96
|
-
}
|
|
97
|
-
// Add user message to history
|
|
98
|
-
this.messageHistory.push({
|
|
99
|
-
role: 'user',
|
|
100
|
-
content: userMessage,
|
|
101
|
-
});
|
|
102
|
-
let iterations = 0;
|
|
103
|
-
let completed = false;
|
|
104
|
-
let response = '';
|
|
105
|
-
while (iterations < (this.options.maxIterations || 10) && !completed) {
|
|
106
|
-
iterations++;
|
|
107
|
-
// Build the prompt with tool descriptions if tools are available
|
|
108
|
-
const toolDescriptions = this.buildToolDescriptions();
|
|
109
|
-
const systemPrompt = this.buildSystemPrompt(toolDescriptions);
|
|
110
|
-
// Get response from AI
|
|
111
|
-
const provider = this.getProvider();
|
|
112
|
-
const chatResponse = await provider.chat({
|
|
113
|
-
systemMessage: systemPrompt,
|
|
114
|
-
userMessage: this.buildContextualPrompt(),
|
|
115
|
-
messageHistory: [],
|
|
116
|
-
});
|
|
117
|
-
response = chatResponse.message;
|
|
118
|
-
// Check if the response contains a tool call
|
|
119
|
-
const toolCall = this.parseToolCall(response);
|
|
120
|
-
if (toolCall) {
|
|
121
|
-
// Execute the tool
|
|
122
|
-
const tool = this.tools.get(toolCall.name);
|
|
123
|
-
if (tool) {
|
|
124
|
-
try {
|
|
125
|
-
const toolResult = await tool.execute(toolCall.params);
|
|
126
|
-
// Add tool interaction to history
|
|
127
|
-
this.messageHistory.push({
|
|
128
|
-
role: 'assistant',
|
|
129
|
-
content: response,
|
|
130
|
-
});
|
|
131
|
-
this.messageHistory.push({
|
|
132
|
-
role: 'tool',
|
|
133
|
-
content: JSON.stringify(toolResult),
|
|
134
|
-
toolName: toolCall.name,
|
|
135
|
-
toolResult,
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
catch (error) {
|
|
139
|
-
// Add error to history
|
|
140
|
-
this.messageHistory.push({
|
|
141
|
-
role: 'tool',
|
|
142
|
-
content: `Error executing tool ${toolCall.name}: ${error}`,
|
|
143
|
-
toolName: toolCall.name,
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
// Unknown tool
|
|
149
|
-
this.messageHistory.push({
|
|
150
|
-
role: 'tool',
|
|
151
|
-
content: `Unknown tool: ${toolCall.name}`,
|
|
152
|
-
toolName: toolCall.name,
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
// No tool call, this is the final response
|
|
158
|
-
this.messageHistory.push({
|
|
159
|
-
role: 'assistant',
|
|
160
|
-
content: response,
|
|
161
|
-
});
|
|
162
|
-
completed = true;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
return {
|
|
166
|
-
response,
|
|
167
|
-
iterations,
|
|
168
|
-
messages: [...this.messageHistory],
|
|
169
|
-
completed,
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Simple chat without tool use
|
|
174
|
-
*/
|
|
175
|
-
async chat(message) {
|
|
176
|
-
if (!this.isStarted) {
|
|
177
|
-
await this.start();
|
|
178
|
-
}
|
|
179
|
-
const systemMessage = this.messageHistory.find(m => m.role === 'system')?.content || 'You are a helpful assistant.';
|
|
180
|
-
const provider = this.getProvider();
|
|
181
|
-
const response = await provider.chat({
|
|
182
|
-
systemMessage,
|
|
183
|
-
userMessage: message,
|
|
184
|
-
messageHistory: this.messageHistory
|
|
185
|
-
.filter(m => m.role !== 'system')
|
|
186
|
-
.map(m => ({
|
|
187
|
-
role: m.role === 'tool' ? 'user' : m.role,
|
|
188
|
-
content: m.content,
|
|
189
|
-
})),
|
|
190
|
-
});
|
|
191
|
-
this.messageHistory.push({ role: 'user', content: message });
|
|
192
|
-
this.messageHistory.push({ role: 'assistant', content: response.message });
|
|
193
|
-
return response.message;
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Gets the AI provider based on configuration
|
|
197
|
-
*/
|
|
198
|
-
getProvider() {
|
|
199
|
-
const providerName = this.options.defaultProvider || 'openai';
|
|
200
|
-
switch (providerName) {
|
|
201
|
-
case 'openai':
|
|
202
|
-
return this.smartai.openaiProvider;
|
|
203
|
-
case 'anthropic':
|
|
204
|
-
return this.smartai.anthropicProvider;
|
|
205
|
-
case 'perplexity':
|
|
206
|
-
return this.smartai.perplexityProvider;
|
|
207
|
-
case 'groq':
|
|
208
|
-
return this.smartai.groqProvider;
|
|
209
|
-
case 'ollama':
|
|
210
|
-
return this.smartai.ollamaProvider;
|
|
211
|
-
case 'xai':
|
|
212
|
-
return this.smartai.xaiProvider;
|
|
213
|
-
case 'exo':
|
|
214
|
-
return this.smartai.exoProvider;
|
|
215
|
-
default:
|
|
216
|
-
return this.smartai.openaiProvider;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Builds tool descriptions for the system prompt
|
|
221
|
-
*/
|
|
222
|
-
buildToolDescriptions() {
|
|
223
|
-
if (this.tools.size === 0)
|
|
224
|
-
return '';
|
|
225
|
-
const toolList = Array.from(this.tools.values())
|
|
226
|
-
.map(tool => `- ${tool.name}: ${tool.description}\n Parameters: ${JSON.stringify(tool.parameters)}`)
|
|
227
|
-
.join('\n');
|
|
228
|
-
return `\nYou have access to the following tools:\n${toolList}\n\nTo use a tool, respond with:\n<tool_call>\n{"name": "tool_name", "params": {...}}\n</tool_call>\n\nAfter receiving the tool result, continue your reasoning or provide a final response.`;
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* Builds the system prompt including tool descriptions
|
|
232
|
-
*/
|
|
233
|
-
buildSystemPrompt(toolDescriptions) {
|
|
234
|
-
const baseSystemMessage = this.messageHistory.find(m => m.role === 'system')?.content ||
|
|
235
|
-
'You are a helpful AI assistant.';
|
|
236
|
-
return baseSystemMessage + toolDescriptions;
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Builds the contextual prompt from message history
|
|
240
|
-
*/
|
|
241
|
-
buildContextualPrompt() {
|
|
242
|
-
return this.messageHistory
|
|
243
|
-
.filter(m => m.role !== 'system')
|
|
244
|
-
.map(m => {
|
|
245
|
-
if (m.role === 'tool') {
|
|
246
|
-
return `[Tool Result from ${m.toolName}]: ${m.content}`;
|
|
247
|
-
}
|
|
248
|
-
return `[${m.role}]: ${m.content}`;
|
|
249
|
-
})
|
|
250
|
-
.join('\n\n');
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Parses a tool call from the AI response
|
|
254
|
-
*/
|
|
255
|
-
parseToolCall(response) {
|
|
256
|
-
const toolCallMatch = response.match(/<tool_call>\s*(\{[\s\S]*?\})\s*<\/tool_call>/);
|
|
257
|
-
if (!toolCallMatch)
|
|
258
|
-
return null;
|
|
259
|
-
try {
|
|
260
|
-
const parsed = JSON.parse(toolCallMatch[1]);
|
|
261
|
-
if (parsed.name && typeof parsed.name === 'string') {
|
|
262
|
-
return {
|
|
263
|
-
name: parsed.name,
|
|
264
|
-
params: parsed.params || {},
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
catch {
|
|
269
|
-
return null;
|
|
270
|
-
}
|
|
271
|
-
return null;
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jbGFzc2VzLnNtYXJ0YWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGFnZW50LmNsYXNzZXMuc21hcnRhZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQXNEeEM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sVUFBVTtJQUNkLE9BQU8sQ0FBcUI7SUFDNUIsT0FBTyxDQUEwQjtJQUNqQyxLQUFLLEdBQTRCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDM0MsY0FBYyxHQUFvQixFQUFFLENBQUM7SUFFcEMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUUxQixZQUFZLFVBQThCO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixJQUFJLEVBQUUsWUFBWTtZQUNsQixlQUFlLEVBQUUsUUFBUTtZQUN6QixhQUFhLEVBQUUsRUFBRTtZQUNqQixHQUFHLFVBQVU7U0FDZCxDQUFDO1FBRUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV6RCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZCLElBQUksRUFBRSxRQUFRO2dCQUNkLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWE7YUFDcEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQzNCLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFD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
|