@mind-your-now/myn 0.6.4 → 0.7.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/src/tools/ynab.d.ts +26 -3
- package/dist/src/tools/ynab.d.ts.map +1 -1
- package/dist/src/tools/ynab.js +279 -40
- package/dist/src/tools/ynab.js.map +1 -1
- package/package.json +1 -1
package/dist/src/tools/ynab.d.ts
CHANGED
|
@@ -1,15 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* myn_ynab tool - YNAB budget management
|
|
3
|
+
*
|
|
4
|
+
* Full coverage of MYN backend YNAB endpoints:
|
|
5
|
+
* - Budget: overview, categories, accounts, months, payees, goals
|
|
6
|
+
* - Transactions: create, create_bulk, list
|
|
7
|
+
* - Scheduled: list, create, update, delete, subscriptions view
|
|
8
|
+
* - Analytics: spending, payees, trends, net worth, debt
|
|
9
|
+
* - Connection: status check
|
|
3
10
|
*/
|
|
4
11
|
import type { MynApiClient } from '../client.js';
|
|
5
12
|
export declare const YnabInputSchema: import("@sinclair/typebox").TObject<{
|
|
6
|
-
action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"budget_overview">, import("@sinclair/typebox").TLiteral<"category_balance">, import("@sinclair/typebox").TLiteral<"account_balances">, import("@sinclair/typebox").TLiteral<"set_category_goal">, import("@sinclair/typebox").TLiteral<"
|
|
13
|
+
action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"budget_overview">, import("@sinclair/typebox").TLiteral<"category_balance">, import("@sinclair/typebox").TLiteral<"list_categories">, import("@sinclair/typebox").TLiteral<"account_balances">, import("@sinclair/typebox").TLiteral<"set_category_goal">, import("@sinclair/typebox").TLiteral<"goal_progress">, import("@sinclair/typebox").TLiteral<"budget_months">, import("@sinclair/typebox").TLiteral<"search_payees">, import("@sinclair/typebox").TLiteral<"create_transaction">, import("@sinclair/typebox").TLiteral<"create_transactions_bulk">, import("@sinclair/typebox").TLiteral<"list_transactions">, import("@sinclair/typebox").TLiteral<"scheduled_transactions">, import("@sinclair/typebox").TLiteral<"create_scheduled_transaction">, import("@sinclair/typebox").TLiteral<"update_scheduled_transaction">, import("@sinclair/typebox").TLiteral<"delete_scheduled_transaction">, import("@sinclair/typebox").TLiteral<"subscriptions">, import("@sinclair/typebox").TLiteral<"upcoming_bills">, import("@sinclair/typebox").TLiteral<"spending_insights">, import("@sinclair/typebox").TLiteral<"payee_analysis">, import("@sinclair/typebox").TLiteral<"spending_trends">, import("@sinclair/typebox").TLiteral<"net_worth">, import("@sinclair/typebox").TLiteral<"debt_tracking">, import("@sinclair/typebox").TLiteral<"connection_status">]>;
|
|
7
14
|
categoryName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
15
|
+
accountId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
16
|
+
payeeName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
17
|
+
amount: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
18
|
+
date: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
19
|
+
memo: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
20
|
+
months: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
21
|
+
days: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
8
22
|
goalType: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
9
23
|
goalTargetDollars: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
10
24
|
goalTargetMonth: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
11
|
-
|
|
12
|
-
|
|
25
|
+
transactionId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
26
|
+
frequency: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
27
|
+
dateFirst: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
28
|
+
transactions: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
29
|
+
accountId: import("@sinclair/typebox").TString;
|
|
30
|
+
payeeName: import("@sinclair/typebox").TString;
|
|
31
|
+
amount: import("@sinclair/typebox").TNumber;
|
|
32
|
+
categoryName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
33
|
+
date: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
34
|
+
memo: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
35
|
+
}>>>;
|
|
13
36
|
}>;
|
|
14
37
|
export type YnabInput = typeof YnabInputSchema.static;
|
|
15
38
|
export declare function executeYnab(client: MynApiClient, input: YnabInput): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ynab.d.ts","sourceRoot":"","sources":["../../../src/tools/ynab.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ynab.d.ts","sourceRoot":"","sources":["../../../src/tools/ynab.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;EAgE1B,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,OAAO,eAAe,CAAC,MAAM,CAAC;AAuDtD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,SAAS,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CA4ElG;AA6MD,UAAU,iBAAiB;IACzB,YAAY,CAAC,IAAI,EAAE;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC;QACrB,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAC/C,GAAG,IAAI,CAAC;CACV;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAkBnF"}
|
package/dist/src/tools/ynab.js
CHANGED
|
@@ -1,27 +1,72 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* myn_ynab tool - YNAB budget management
|
|
3
|
+
*
|
|
4
|
+
* Full coverage of MYN backend YNAB endpoints:
|
|
5
|
+
* - Budget: overview, categories, accounts, months, payees, goals
|
|
6
|
+
* - Transactions: create, create_bulk, list
|
|
7
|
+
* - Scheduled: list, create, update, delete, subscriptions view
|
|
8
|
+
* - Analytics: spending, payees, trends, net worth, debt
|
|
9
|
+
* - Connection: status check
|
|
3
10
|
*/
|
|
4
11
|
import { Type } from '@sinclair/typebox';
|
|
5
12
|
import { jsonResult, errorResult } from '../client.js';
|
|
6
13
|
export const YnabInputSchema = Type.Object({
|
|
7
14
|
action: Type.Union([
|
|
15
|
+
// Budget & accounts
|
|
8
16
|
Type.Literal('budget_overview'),
|
|
9
17
|
Type.Literal('category_balance'),
|
|
18
|
+
Type.Literal('list_categories'),
|
|
10
19
|
Type.Literal('account_balances'),
|
|
11
20
|
Type.Literal('set_category_goal'),
|
|
21
|
+
Type.Literal('goal_progress'),
|
|
22
|
+
Type.Literal('budget_months'),
|
|
23
|
+
Type.Literal('search_payees'),
|
|
24
|
+
// Transactions
|
|
25
|
+
Type.Literal('create_transaction'),
|
|
26
|
+
Type.Literal('create_transactions_bulk'),
|
|
27
|
+
Type.Literal('list_transactions'),
|
|
28
|
+
// Scheduled transactions & subscriptions
|
|
29
|
+
Type.Literal('scheduled_transactions'),
|
|
30
|
+
Type.Literal('create_scheduled_transaction'),
|
|
31
|
+
Type.Literal('update_scheduled_transaction'),
|
|
32
|
+
Type.Literal('delete_scheduled_transaction'),
|
|
33
|
+
Type.Literal('subscriptions'),
|
|
34
|
+
Type.Literal('upcoming_bills'),
|
|
35
|
+
// Analytics
|
|
12
36
|
Type.Literal('spending_insights'),
|
|
13
|
-
Type.Literal('
|
|
37
|
+
Type.Literal('payee_analysis'),
|
|
38
|
+
Type.Literal('spending_trends'),
|
|
39
|
+
Type.Literal('net_worth'),
|
|
40
|
+
Type.Literal('debt_tracking'),
|
|
41
|
+
// Connection
|
|
42
|
+
Type.Literal('connection_status')
|
|
14
43
|
]),
|
|
15
|
-
//
|
|
16
|
-
categoryName: Type.Optional(Type.String({ description: 'Category name
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
months: Type.Optional(Type.Number({ description: 'Number of months
|
|
23
|
-
|
|
24
|
-
|
|
44
|
+
// Shared parameters
|
|
45
|
+
categoryName: Type.Optional(Type.String({ description: 'Category name (fuzzy match). Used by category_balance, set_category_goal, create_transaction, create_transactions_bulk.' })),
|
|
46
|
+
accountId: Type.Optional(Type.String({ description: 'YNAB account ID. Use account_balances to find IDs.' })),
|
|
47
|
+
payeeName: Type.Optional(Type.String({ description: 'Payee name. Used by create_transaction, create_transactions_bulk, search_payees, create_scheduled_transaction.' })),
|
|
48
|
+
amount: Type.Optional(Type.Number({ description: 'Amount in dollars. Negative for expenses (e.g., -45.50), positive for income.' })),
|
|
49
|
+
date: Type.Optional(Type.String({ description: 'Date in YYYY-MM-DD format. Defaults to today for transactions. Used as sinceDate filter for list_transactions.' })),
|
|
50
|
+
memo: Type.Optional(Type.String({ description: 'Optional memo/note.' })),
|
|
51
|
+
months: Type.Optional(Type.Number({ description: 'Number of months for analytics (default: 3 for spending, 6 for trends).' })),
|
|
52
|
+
days: Type.Optional(Type.Number({ description: 'Number of days to look ahead for upcoming_bills (default: 7).' })),
|
|
53
|
+
// Goal parameters
|
|
54
|
+
goalType: Type.Optional(Type.String({ description: 'Goal type: TB (Target Balance), TBD (Target Balance by Date), MF (Monthly Funding), NEED (Plan Your Spending).' })),
|
|
55
|
+
goalTargetDollars: Type.Optional(Type.Number({ description: 'Goal target in dollars (e.g., 500.00).' })),
|
|
56
|
+
goalTargetMonth: Type.Optional(Type.String({ description: 'Target month YYYY-MM (e.g., 2026-06). Required for TBD goals.' })),
|
|
57
|
+
// Scheduled transaction parameters
|
|
58
|
+
transactionId: Type.Optional(Type.String({ description: 'Scheduled transaction ID. Required for update/delete_scheduled_transaction.' })),
|
|
59
|
+
frequency: Type.Optional(Type.String({ description: 'Recurrence frequency: never, daily, weekly, everyOtherWeek, twiceAMonth, every4Weeks, monthly, everyOtherMonth, every3Months, every4Months, twiceAYear, yearly, everyOtherYear.' })),
|
|
60
|
+
dateFirst: Type.Optional(Type.String({ description: 'First occurrence date YYYY-MM-DD for create_scheduled_transaction.' })),
|
|
61
|
+
// Bulk transaction parameters
|
|
62
|
+
transactions: Type.Optional(Type.Array(Type.Object({
|
|
63
|
+
accountId: Type.String({ description: 'YNAB account ID.' }),
|
|
64
|
+
payeeName: Type.String({ description: 'Payee name.' }),
|
|
65
|
+
amount: Type.Number({ description: 'Amount in dollars. Negative for expenses.' }),
|
|
66
|
+
categoryName: Type.Optional(Type.String({ description: 'Category name (fuzzy match).' })),
|
|
67
|
+
date: Type.Optional(Type.String({ description: 'Date YYYY-MM-DD. Defaults to today.' })),
|
|
68
|
+
memo: Type.Optional(Type.String({ description: 'Optional memo.' }))
|
|
69
|
+
}), { description: 'Array of transactions for create_transactions_bulk.' }))
|
|
25
70
|
});
|
|
26
71
|
/**
|
|
27
72
|
* Convert YNAB milliunits to formatted dollar string.
|
|
@@ -38,7 +83,8 @@ const MILLIUNIT_FIELDS = new Set([
|
|
|
38
83
|
'readyToAssign', 'totalIncome', 'totalBudgeted', 'totalActivity',
|
|
39
84
|
'balance', 'budgeted', 'activity', 'clearedBalance', 'unclearedBalance',
|
|
40
85
|
'goalTarget', 'goalUnderFunded', 'goalOverFunded', 'goalOverallFunded', 'goalOverallLeft',
|
|
41
|
-
'amount', 'total', 'totalSpending'
|
|
86
|
+
'amount', 'total', 'totalSpending', 'monthlyTotal', 'annualTotal',
|
|
87
|
+
'amountMilliunits', 'totalSpent', 'monthlyAverage'
|
|
42
88
|
]);
|
|
43
89
|
/**
|
|
44
90
|
* Recursively convert milliunit fields to dollar strings in API responses.
|
|
@@ -62,21 +108,77 @@ function convertMilliunits(obj) {
|
|
|
62
108
|
}
|
|
63
109
|
return obj;
|
|
64
110
|
}
|
|
111
|
+
/** Resolve a category name to its ID via fuzzy search. Returns null if not found. */
|
|
112
|
+
async function resolveCategoryId(client, name) {
|
|
113
|
+
const result = await client.get(`/api/v1/ynab/budget/categories/search?query=${encodeURIComponent(name)}`);
|
|
114
|
+
return result?.id || null;
|
|
115
|
+
}
|
|
116
|
+
/** Today's date as YYYY-MM-DD */
|
|
117
|
+
function today() {
|
|
118
|
+
return new Date().toISOString().split('T')[0];
|
|
119
|
+
}
|
|
65
120
|
export async function executeYnab(client, input) {
|
|
66
121
|
try {
|
|
67
122
|
switch (input.action) {
|
|
123
|
+
// Budget & accounts
|
|
68
124
|
case 'budget_overview':
|
|
69
|
-
return await
|
|
125
|
+
return jsonResult(convertMilliunits(await client.get('/api/v1/ynab/budget/overview')));
|
|
70
126
|
case 'category_balance':
|
|
71
127
|
return await getCategoryBalance(client, input);
|
|
128
|
+
case 'list_categories':
|
|
129
|
+
return jsonResult(convertMilliunits(await client.get('/api/v1/ynab/budget/categories')));
|
|
72
130
|
case 'account_balances':
|
|
73
|
-
return await
|
|
131
|
+
return jsonResult(convertMilliunits(await client.get('/api/v1/ynab/budget/accounts')));
|
|
74
132
|
case 'set_category_goal':
|
|
75
133
|
return await setCategoryGoal(client, input);
|
|
76
|
-
case '
|
|
77
|
-
return await
|
|
78
|
-
case '
|
|
79
|
-
return await
|
|
134
|
+
case 'goal_progress':
|
|
135
|
+
return jsonResult(convertMilliunits(await client.get('/api/v1/ynab/budget/categories')));
|
|
136
|
+
case 'budget_months':
|
|
137
|
+
return jsonResult(convertMilliunits(await client.get('/api/v1/ynab/budget/months')));
|
|
138
|
+
case 'search_payees':
|
|
139
|
+
return await searchPayees(client, input);
|
|
140
|
+
// Transactions
|
|
141
|
+
case 'create_transaction':
|
|
142
|
+
return await createTransaction(client, input);
|
|
143
|
+
case 'create_transactions_bulk':
|
|
144
|
+
return await createTransactionsBulk(client, input);
|
|
145
|
+
case 'list_transactions':
|
|
146
|
+
return await listTransactions(client, input);
|
|
147
|
+
// Scheduled transactions & subscriptions
|
|
148
|
+
case 'scheduled_transactions':
|
|
149
|
+
return jsonResult(convertMilliunits(await client.get('/api/v1/ynab/scheduled-transactions')));
|
|
150
|
+
case 'create_scheduled_transaction':
|
|
151
|
+
return await createScheduledTransaction(client, input);
|
|
152
|
+
case 'update_scheduled_transaction':
|
|
153
|
+
return await updateScheduledTransaction(client, input);
|
|
154
|
+
case 'delete_scheduled_transaction':
|
|
155
|
+
return await deleteScheduledTransaction(client, input);
|
|
156
|
+
case 'subscriptions':
|
|
157
|
+
return jsonResult(convertMilliunits(await client.get('/api/v1/ynab/subscriptions')));
|
|
158
|
+
case 'upcoming_bills': {
|
|
159
|
+
const days = input.days || 7;
|
|
160
|
+
return jsonResult(convertMilliunits(await client.get(`/api/v1/ynab/scheduled?days=${days}`)));
|
|
161
|
+
}
|
|
162
|
+
// Analytics
|
|
163
|
+
case 'spending_insights': {
|
|
164
|
+
const months = input.months || 3;
|
|
165
|
+
return jsonResult(convertMilliunits(await client.get(`/api/v1/ynab/analytics/spending?months=${months}`)));
|
|
166
|
+
}
|
|
167
|
+
case 'payee_analysis': {
|
|
168
|
+
const months = input.months || 3;
|
|
169
|
+
return jsonResult(convertMilliunits(await client.get(`/api/v1/ynab/analytics/payees?months=${months}`)));
|
|
170
|
+
}
|
|
171
|
+
case 'spending_trends': {
|
|
172
|
+
const months = input.months || 6;
|
|
173
|
+
return jsonResult(convertMilliunits(await client.get(`/api/v1/ynab/analytics/trends?months=${months}`)));
|
|
174
|
+
}
|
|
175
|
+
case 'net_worth':
|
|
176
|
+
return jsonResult(convertMilliunits(await client.get('/api/v1/ynab/analytics/net-worth')));
|
|
177
|
+
case 'debt_tracking':
|
|
178
|
+
return jsonResult(convertMilliunits(await client.get('/api/v1/ynab/analytics/debt')));
|
|
179
|
+
// Connection
|
|
180
|
+
case 'connection_status':
|
|
181
|
+
return jsonResult(await client.get('/api/v1/ynab/status'));
|
|
80
182
|
default:
|
|
81
183
|
return errorResult(`Unknown action: ${input.action}`);
|
|
82
184
|
}
|
|
@@ -88,10 +190,7 @@ export async function executeYnab(client, input) {
|
|
|
88
190
|
return errorResult('Unknown error occurred');
|
|
89
191
|
}
|
|
90
192
|
}
|
|
91
|
-
|
|
92
|
-
const data = await client.get('/api/v1/ynab/budget/overview');
|
|
93
|
-
return jsonResult(convertMilliunits(data));
|
|
94
|
-
}
|
|
193
|
+
// ==================== Action implementations ====================
|
|
95
194
|
async function getCategoryBalance(client, input) {
|
|
96
195
|
if (!input.categoryName) {
|
|
97
196
|
return errorResult('categoryName is required for category_balance action');
|
|
@@ -99,9 +198,14 @@ async function getCategoryBalance(client, input) {
|
|
|
99
198
|
const data = await client.get(`/api/v1/ynab/budget/categories/search?query=${encodeURIComponent(input.categoryName)}`);
|
|
100
199
|
return jsonResult(convertMilliunits(data));
|
|
101
200
|
}
|
|
102
|
-
async function
|
|
103
|
-
|
|
104
|
-
|
|
201
|
+
async function searchPayees(client, input) {
|
|
202
|
+
if (input.payeeName) {
|
|
203
|
+
const data = await client.get(`/api/v1/ynab/budget/payees/search?query=${encodeURIComponent(input.payeeName)}`);
|
|
204
|
+
return jsonResult(data);
|
|
205
|
+
}
|
|
206
|
+
// No search query — return all payees
|
|
207
|
+
const data = await client.get('/api/v1/ynab/budget/payees');
|
|
208
|
+
return jsonResult(data);
|
|
105
209
|
}
|
|
106
210
|
async function setCategoryGoal(client, input) {
|
|
107
211
|
if (!input.categoryName) {
|
|
@@ -110,41 +214,176 @@ async function setCategoryGoal(client, input) {
|
|
|
110
214
|
if (!input.goalType) {
|
|
111
215
|
return errorResult('goalType is required for set_category_goal action (TB, TBD, MF, NEED)');
|
|
112
216
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if (!searchResult || !searchResult.id) {
|
|
217
|
+
const categoryId = await resolveCategoryId(client, input.categoryName);
|
|
218
|
+
if (!categoryId) {
|
|
116
219
|
return errorResult(`Category '${input.categoryName}' not found`);
|
|
117
220
|
}
|
|
118
|
-
// Format target month as YYYY-MM-01 if provided
|
|
119
221
|
let goalTargetMonth = input.goalTargetMonth;
|
|
120
222
|
if (goalTargetMonth && !goalTargetMonth.endsWith('-01')) {
|
|
121
223
|
goalTargetMonth = goalTargetMonth + '-01';
|
|
122
224
|
}
|
|
123
|
-
const body = {
|
|
124
|
-
goalType: input.goalType
|
|
125
|
-
};
|
|
225
|
+
const body = { goalType: input.goalType };
|
|
126
226
|
if (input.goalTargetDollars != null)
|
|
127
227
|
body.goalTargetDollars = input.goalTargetDollars;
|
|
128
228
|
if (goalTargetMonth)
|
|
129
229
|
body.goalTargetMonth = goalTargetMonth;
|
|
130
|
-
const data = await client.patch(`/api/v1/ynab/budget/categories/${
|
|
230
|
+
const data = await client.patch(`/api/v1/ynab/budget/categories/${categoryId}/goal`, body);
|
|
231
|
+
return jsonResult(convertMilliunits(data));
|
|
232
|
+
}
|
|
233
|
+
async function createTransaction(client, input) {
|
|
234
|
+
if (!input.accountId) {
|
|
235
|
+
return errorResult('accountId is required for create_transaction. Use account_balances to find IDs.');
|
|
236
|
+
}
|
|
237
|
+
if (!input.payeeName) {
|
|
238
|
+
return errorResult('payeeName is required for create_transaction.');
|
|
239
|
+
}
|
|
240
|
+
if (input.amount == null) {
|
|
241
|
+
return errorResult('amount is required for create_transaction (in dollars, negative for expenses).');
|
|
242
|
+
}
|
|
243
|
+
const amountMilliunits = Math.round(input.amount * 1000);
|
|
244
|
+
let categoryId;
|
|
245
|
+
if (input.categoryName) {
|
|
246
|
+
const resolved = await resolveCategoryId(client, input.categoryName);
|
|
247
|
+
if (!resolved) {
|
|
248
|
+
return errorResult(`Category '${input.categoryName}' not found. Use list_categories to browse.`);
|
|
249
|
+
}
|
|
250
|
+
categoryId = resolved;
|
|
251
|
+
}
|
|
252
|
+
// YNAB API defaults to "uncleared" when cleared status not specified
|
|
253
|
+
const body = {
|
|
254
|
+
accountId: input.accountId,
|
|
255
|
+
payeeName: input.payeeName,
|
|
256
|
+
amountMilliunits,
|
|
257
|
+
date: input.date || today()
|
|
258
|
+
};
|
|
259
|
+
if (input.memo)
|
|
260
|
+
body.memo = input.memo;
|
|
261
|
+
if (categoryId)
|
|
262
|
+
body.categoryId = categoryId;
|
|
263
|
+
const data = await client.post('/api/v1/ynab/transactions', body);
|
|
131
264
|
return jsonResult(convertMilliunits(data));
|
|
132
265
|
}
|
|
133
|
-
async function
|
|
134
|
-
|
|
135
|
-
|
|
266
|
+
async function createTransactionsBulk(client, input) {
|
|
267
|
+
if (!input.transactions || input.transactions.length === 0) {
|
|
268
|
+
return errorResult('transactions array is required for create_transactions_bulk. Each needs accountId, payeeName, amount.');
|
|
269
|
+
}
|
|
270
|
+
// Resolve category names and convert amounts for all transactions
|
|
271
|
+
const resolved = [];
|
|
272
|
+
for (const txn of input.transactions) {
|
|
273
|
+
const amountMilliunits = Math.round(txn.amount * 1000);
|
|
274
|
+
let categoryId;
|
|
275
|
+
if (txn.categoryName) {
|
|
276
|
+
const id = await resolveCategoryId(client, txn.categoryName);
|
|
277
|
+
if (!id) {
|
|
278
|
+
return errorResult(`Category '${txn.categoryName}' not found for transaction "${txn.payeeName}". Use list_categories to browse.`);
|
|
279
|
+
}
|
|
280
|
+
categoryId = id;
|
|
281
|
+
}
|
|
282
|
+
const entry = {
|
|
283
|
+
accountId: txn.accountId,
|
|
284
|
+
payeeName: txn.payeeName,
|
|
285
|
+
amount: amountMilliunits,
|
|
286
|
+
date: txn.date || today()
|
|
287
|
+
};
|
|
288
|
+
if (txn.memo)
|
|
289
|
+
entry.memo = txn.memo;
|
|
290
|
+
if (categoryId)
|
|
291
|
+
entry.categoryId = categoryId;
|
|
292
|
+
resolved.push(entry);
|
|
293
|
+
}
|
|
294
|
+
const data = await client.post('/api/v1/ynab/transactions/bulk', { transactions: resolved });
|
|
295
|
+
return jsonResult(data);
|
|
296
|
+
}
|
|
297
|
+
async function listTransactions(client, input) {
|
|
298
|
+
const params = input.date ? `?sinceDate=${encodeURIComponent(input.date)}` : '';
|
|
299
|
+
const data = await client.get(`/api/v1/ynab/transactions${params}`);
|
|
136
300
|
return jsonResult(convertMilliunits(data));
|
|
137
301
|
}
|
|
138
|
-
async function
|
|
139
|
-
|
|
140
|
-
|
|
302
|
+
async function createScheduledTransaction(client, input) {
|
|
303
|
+
if (!input.accountId) {
|
|
304
|
+
return errorResult('accountId is required for create_scheduled_transaction.');
|
|
305
|
+
}
|
|
306
|
+
if (!input.payeeName) {
|
|
307
|
+
return errorResult('payeeName is required for create_scheduled_transaction.');
|
|
308
|
+
}
|
|
309
|
+
if (input.amount == null) {
|
|
310
|
+
return errorResult('amount is required for create_scheduled_transaction (in dollars).');
|
|
311
|
+
}
|
|
312
|
+
if (!input.frequency) {
|
|
313
|
+
return errorResult('frequency is required (e.g., monthly, weekly, yearly).');
|
|
314
|
+
}
|
|
315
|
+
if (!input.dateFirst) {
|
|
316
|
+
return errorResult('dateFirst is required (YYYY-MM-DD, first occurrence date).');
|
|
317
|
+
}
|
|
318
|
+
const amountMilliunits = Math.round(input.amount * 1000);
|
|
319
|
+
let categoryId;
|
|
320
|
+
if (input.categoryName) {
|
|
321
|
+
const resolved = await resolveCategoryId(client, input.categoryName);
|
|
322
|
+
if (!resolved) {
|
|
323
|
+
return errorResult(`Category '${input.categoryName}' not found.`);
|
|
324
|
+
}
|
|
325
|
+
categoryId = resolved;
|
|
326
|
+
}
|
|
327
|
+
const body = {
|
|
328
|
+
accountId: input.accountId,
|
|
329
|
+
payeeName: input.payeeName,
|
|
330
|
+
amountMilliunits,
|
|
331
|
+
dateFirst: input.dateFirst,
|
|
332
|
+
dateNext: input.dateFirst,
|
|
333
|
+
frequency: input.frequency
|
|
334
|
+
};
|
|
335
|
+
if (input.memo)
|
|
336
|
+
body.memo = input.memo;
|
|
337
|
+
if (categoryId)
|
|
338
|
+
body.categoryId = categoryId;
|
|
339
|
+
const data = await client.post('/api/v1/ynab/scheduled-transactions', body);
|
|
340
|
+
return jsonResult(convertMilliunits(data));
|
|
341
|
+
}
|
|
342
|
+
async function updateScheduledTransaction(client, input) {
|
|
343
|
+
if (!input.transactionId) {
|
|
344
|
+
return errorResult('transactionId is required for update_scheduled_transaction.');
|
|
345
|
+
}
|
|
346
|
+
const body = {};
|
|
347
|
+
if (input.payeeName)
|
|
348
|
+
body.payeeName = input.payeeName;
|
|
349
|
+
if (input.amount != null)
|
|
350
|
+
body.amountMilliunits = Math.round(input.amount * 1000);
|
|
351
|
+
if (input.date)
|
|
352
|
+
body.dateNext = input.date;
|
|
353
|
+
if (input.frequency)
|
|
354
|
+
body.frequency = input.frequency;
|
|
355
|
+
if (input.memo)
|
|
356
|
+
body.memo = input.memo;
|
|
357
|
+
if (input.categoryName) {
|
|
358
|
+
const categoryId = await resolveCategoryId(client, input.categoryName);
|
|
359
|
+
if (!categoryId) {
|
|
360
|
+
return errorResult(`Category '${input.categoryName}' not found.`);
|
|
361
|
+
}
|
|
362
|
+
body.categoryId = categoryId;
|
|
363
|
+
}
|
|
364
|
+
const data = await client.put(`/api/v1/ynab/scheduled-transactions/${input.transactionId}`, body);
|
|
141
365
|
return jsonResult(convertMilliunits(data));
|
|
142
366
|
}
|
|
367
|
+
async function deleteScheduledTransaction(client, input) {
|
|
368
|
+
if (!input.transactionId) {
|
|
369
|
+
return errorResult('transactionId is required for delete_scheduled_transaction.');
|
|
370
|
+
}
|
|
371
|
+
const data = await client.delete(`/api/v1/ynab/scheduled-transactions/${input.transactionId}`);
|
|
372
|
+
return jsonResult(data);
|
|
373
|
+
}
|
|
143
374
|
export function registerYnabTool(api, client) {
|
|
144
375
|
api.registerTool({
|
|
145
376
|
id: 'myn_ynab',
|
|
146
377
|
name: 'MYN YNAB',
|
|
147
|
-
description:
|
|
378
|
+
description: [
|
|
379
|
+
'YNAB budget management with full read/write access.',
|
|
380
|
+
'Budget: budget_overview, category_balance, list_categories, account_balances, set_category_goal, goal_progress, budget_months, search_payees.',
|
|
381
|
+
'Transactions: create_transaction, create_transactions_bulk, list_transactions.',
|
|
382
|
+
'Scheduled: scheduled_transactions, create_scheduled_transaction, update_scheduled_transaction, delete_scheduled_transaction, subscriptions, upcoming_bills.',
|
|
383
|
+
'Analytics: spending_insights, payee_analysis, spending_trends, net_worth, debt_tracking.',
|
|
384
|
+
'Connection: connection_status.',
|
|
385
|
+
'Amounts in dollars (negative=expense). Categories resolved by name (fuzzy match).'
|
|
386
|
+
].join(' '),
|
|
148
387
|
inputSchema: YnabInputSchema,
|
|
149
388
|
async execute(input) {
|
|
150
389
|
return executeYnab(client, input);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ynab.js","sourceRoot":"","sources":["../../../src/tools/ynab.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;QACjB,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;KAC/B,CAAC;IACF,kDAAkD;IAClD,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC,CAAC;IACtG,+BAA+B;IAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,+GAA+G,EAAE,CAAC,CAAC;IACtK,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,8CAA8C,EAAE,CAAC,CAAC;IAC9G,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yEAAyE,EAAE,CAAC,CAAC;IACvI,+BAA+B;IAC/B,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,0CAA0C,EAAE,CAAC,CAAC;IAC/F,4BAA4B;IAC5B,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qDAAqD,EAAE,CAAC,CAAC;CACzG,CAAC,CAAC;AAIH;;;GAGG;AACH,SAAS,aAAa,CAAC,UAAkB;IACvC,MAAM,OAAO,GAAG,UAAU,GAAG,IAAI,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAC;IACtG,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC;AAC1D,CAAC;AAED,wDAAwD;AACxD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe;IAChE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB;IACvE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB;IACzF,QAAQ,EAAE,OAAO,EAAE,eAAe;CACnC,CAAC,CAAC;AAEH;;GAEG;AACH,SAAS,iBAAiB,CAAC,GAAY;IACrC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAClD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC1D,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;YAC1E,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC3D,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAoB,EACpB,KAAgB;IAEhB,IAAI,CAAC;QACH,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;YACrB,KAAK,iBAAiB;gBACpB,OAAO,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACzC,KAAK,kBAAkB;gBACrB,OAAO,MAAM,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACjD,KAAK,kBAAkB;gBACrB,OAAO,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAC1C,KAAK,mBAAmB;gBACtB,OAAO,MAAM,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9C,KAAK,mBAAmB;gBACtB,OAAO,MAAM,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAClD,KAAK,gBAAgB;gBACnB,OAAO,MAAM,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC/C;gBACE,OAAO,WAAW,CAAC,mBAAoB,KAA4B,CAAC,MAAM,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,MAAoB;IACnD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAU,8BAA8B,CAAC,CAAC;IACvE,OAAO,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,MAAoB,EAAE,KAAgB;IACtE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACxB,OAAO,WAAW,CAAC,sDAAsD,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,+CAA+C,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CACxF,CAAC;IACF,OAAO,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,MAAoB;IACpD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAU,8BAA8B,CAAC,CAAC;IACvE,OAAO,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,MAAoB,EAAE,KAAgB;IACnE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACxB,OAAO,WAAW,CAAC,uDAAuD,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC,uEAAuE,CAAC,CAAC;IAC9F,CAAC;IAED,gDAAgD;IAChD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,GAAG,CACnC,+CAA+C,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CACxF,CAAC;IAEF,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;QACtC,OAAO,WAAW,CAAC,aAAa,KAAK,CAAC,YAAY,aAAa,CAAC,CAAC;IACnE,CAAC;IAED,gDAAgD;IAChD,IAAI,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;IAC5C,IAAI,eAAe,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,eAAe,GAAG,eAAe,GAAG,KAAK,CAAC;IAC5C,CAAC;IAED,MAAM,IAAI,GAA4B;QACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC;IACF,IAAI,KAAK,CAAC,iBAAiB,IAAI,IAAI;QAAE,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;IACtF,IAAI,eAAe;QAAE,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IAE5D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAC7B,kCAAkC,YAAY,CAAC,EAAE,OAAO,EACxD,IAAI,CACL,CAAC;IACF,OAAO,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,MAAoB,EAAE,KAAgB;IACvE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,0CAA0C,MAAM,EAAE,CACnD,CAAC;IACF,OAAO,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,MAAoB,EAAE,KAAgB;IACpE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,+BAA+B,IAAI,EAAE,CACtC,CAAC;IACF,OAAO,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAaD,MAAM,UAAU,gBAAgB,CAAC,GAAsB,EAAE,MAAoB;IAC3E,GAAG,CAAC,YAAY,CAAC;QACf,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,8JAA8J;QAC3K,WAAW,EAAE,eAAe;QAC5B,KAAK,CAAC,OAAO,CAAC,KAAc;YAC1B,OAAO,WAAW,CAAC,MAAM,EAAE,KAAkB,CAAC,CAAC;QACjD,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"ynab.js","sourceRoot":"","sources":["../../../src/tools/ynab.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;QACjB,oBAAoB;QACpB,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;QAC7B,eAAe;QACf,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAAC;QACxC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;QACjC,yCAAyC;QACzC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,8BAA8B,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,8BAA8B,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,8BAA8B,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAC9B,YAAY;QACZ,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;QAC7B,aAAa;QACb,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;KAClC,CAAC;IAEF,oBAAoB;IACpB,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yHAAyH,EAAE,CAAC,CAAC;IACpL,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,oDAAoD,EAAE,CAAC,CAAC;IAC5G,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gHAAgH,EAAE,CAAC,CAAC;IACxK,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,+EAA+E,EAAE,CAAC,CAAC;IACpI,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gHAAgH,EAAE,CAAC,CAAC;IACnK,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC,CAAC;IACxE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yEAAyE,EAAE,CAAC,CAAC;IAC9H,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,+DAA+D,EAAE,CAAC,CAAC;IAElH,kBAAkB;IAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gHAAgH,EAAE,CAAC,CAAC;IACvK,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAC;IACxG,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,+DAA+D,EAAE,CAAC,CAAC;IAE7H,mCAAmC;IACnC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,6EAA6E,EAAE,CAAC,CAAC;IACzI,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,iLAAiL,EAAE,CAAC,CAAC;IACzO,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,oEAAoE,EAAE,CAAC,CAAC;IAE5H,8BAA8B;IAC9B,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CACpC,IAAI,CAAC,MAAM,CAAC;QACV,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;QAC3D,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;QACtD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC;QACjF,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAAC,CAAC;QACzF,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qCAAqC,EAAE,CAAC,CAAC;QACxF,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC;KACpE,CAAC,EACF,EAAE,WAAW,EAAE,qDAAqD,EAAE,CACvE,CAAC;CACH,CAAC,CAAC;AAIH;;;GAGG;AACH,SAAS,aAAa,CAAC,UAAkB;IACvC,MAAM,OAAO,GAAG,UAAU,GAAG,IAAI,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAC;IACtG,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC;AAC1D,CAAC;AAED,wDAAwD;AACxD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe;IAChE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB;IACvE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB;IACzF,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa;IACjE,kBAAkB,EAAE,YAAY,EAAE,gBAAgB;CACnD,CAAC,CAAC;AAEH;;GAEG;AACH,SAAS,iBAAiB,CAAC,GAAY;IACrC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAClD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC1D,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;YAC1E,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC3D,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,qFAAqF;AACrF,KAAK,UAAU,iBAAiB,CAAC,MAAoB,EAAE,IAAY;IACjE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAC7B,+CAA+C,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAC1E,CAAC;IACF,OAAO,MAAM,EAAE,EAAE,IAAI,IAAI,CAAC;AAC5B,CAAC;AAED,iCAAiC;AACjC,SAAS,KAAK;IACZ,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAoB,EACpB,KAAgB;IAEhB,IAAI,CAAC;QACH,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;YACrB,oBAAoB;YACpB,KAAK,iBAAiB;gBACpB,OAAO,UAAU,CAAC,iBAAiB,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC;YACzF,KAAK,kBAAkB;gBACrB,OAAO,MAAM,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACjD,KAAK,iBAAiB;gBACpB,OAAO,UAAU,CAAC,iBAAiB,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC,CAAC;YAC3F,KAAK,kBAAkB;gBACrB,OAAO,UAAU,CAAC,iBAAiB,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC;YACzF,KAAK,mBAAmB;gBACtB,OAAO,MAAM,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9C,KAAK,eAAe;gBAClB,OAAO,UAAU,CAAC,iBAAiB,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC,CAAC;YAC3F,KAAK,eAAe;gBAClB,OAAO,UAAU,CAAC,iBAAiB,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC;YACvF,KAAK,eAAe;gBAClB,OAAO,MAAM,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAE3C,eAAe;YACf,KAAK,oBAAoB;gBACvB,OAAO,MAAM,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAChD,KAAK,0BAA0B;gBAC7B,OAAO,MAAM,sBAAsB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACrD,KAAK,mBAAmB;gBACtB,OAAO,MAAM,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAE/C,yCAAyC;YACzC,KAAK,wBAAwB;gBAC3B,OAAO,UAAU,CAAC,iBAAiB,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC,CAAC;YAChG,KAAK,8BAA8B;gBACjC,OAAO,MAAM,0BAA0B,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,KAAK,8BAA8B;gBACjC,OAAO,MAAM,0BAA0B,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,KAAK,8BAA8B;gBACjC,OAAO,MAAM,0BAA0B,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,KAAK,eAAe;gBAClB,OAAO,UAAU,CAAC,iBAAiB,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC;YACvF,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;gBAC7B,OAAO,UAAU,CAAC,iBAAiB,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAChG,CAAC;YAED,YAAY;YACZ,KAAK,mBAAmB,CAAC,CAAC,CAAC;gBACzB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;gBACjC,OAAO,UAAU,CAAC,iBAAiB,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,0CAA0C,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7G,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;gBACjC,OAAO,UAAU,CAAC,iBAAiB,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,wCAAwC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3G,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;gBACjC,OAAO,UAAU,CAAC,iBAAiB,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,wCAAwC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3G,CAAC;YACD,KAAK,WAAW;gBACd,OAAO,UAAU,CAAC,iBAAiB,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC;YAC7F,KAAK,eAAe;gBAClB,OAAO,UAAU,CAAC,iBAAiB,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC;YAExF,aAAa;YACb,KAAK,mBAAmB;gBACtB,OAAO,UAAU,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAE7D;gBACE,OAAO,WAAW,CAAC,mBAAoB,KAA4B,CAAC,MAAM,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,mEAAmE;AAEnE,KAAK,UAAU,kBAAkB,CAAC,MAAoB,EAAE,KAAgB;IACtE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACxB,OAAO,WAAW,CAAC,sDAAsD,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,+CAA+C,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CACxF,CAAC;IACF,OAAO,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,MAAoB,EAAE,KAAgB;IAChE,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,2CAA2C,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CACjF,CAAC;QACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,sCAAsC;IACtC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAU,4BAA4B,CAAC,CAAC;IACrE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,MAAoB,EAAE,KAAgB;IACnE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACxB,OAAO,WAAW,CAAC,uDAAuD,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC,uEAAuE,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IACvE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC,aAAa,KAAK,CAAC,YAAY,aAAa,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;IAC5C,IAAI,eAAe,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,eAAe,GAAG,eAAe,GAAG,KAAK,CAAC;IAC5C,CAAC;IAED,MAAM,IAAI,GAA4B,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;IACnE,IAAI,KAAK,CAAC,iBAAiB,IAAI,IAAI;QAAE,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;IACtF,IAAI,eAAe;QAAE,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IAE5D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAAU,kCAAkC,UAAU,OAAO,EAAE,IAAI,CAAC,CAAC;IACpG,OAAO,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,MAAoB,EAAE,KAAgB;IACrE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC,iFAAiF,CAAC,CAAC;IACxG,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC,+CAA+C,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QACzB,OAAO,WAAW,CAAC,gFAAgF,CAAC,CAAC;IACvG,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEzD,IAAI,UAA8B,CAAC;IACnC,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,WAAW,CAAC,aAAa,KAAK,CAAC,YAAY,6CAA6C,CAAC,CAAC;QACnG,CAAC;QACD,UAAU,GAAG,QAAQ,CAAC;IACxB,CAAC;IAED,qEAAqE;IACrE,MAAM,IAAI,GAA4B;QACpC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,gBAAgB;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE;KAC5B,CAAC;IACF,IAAI,KAAK,CAAC,IAAI;QAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACvC,IAAI,UAAU;QAAE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAE7C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAU,2BAA2B,EAAE,IAAI,CAAC,CAAC;IAC3E,OAAO,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,MAAoB,EAAE,KAAgB;IAC1E,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,OAAO,WAAW,CAAC,uGAAuG,CAAC,CAAC;IAC9H,CAAC;IAED,kEAAkE;IAClE,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACrC,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QAEvD,IAAI,UAA8B,CAAC;QACnC,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YACrB,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;YAC7D,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,WAAW,CAAC,aAAa,GAAG,CAAC,YAAY,gCAAgC,GAAG,CAAC,SAAS,mCAAmC,CAAC,CAAC;YACpI,CAAC;YACD,UAAU,GAAG,EAAE,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAA4B;YACrC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE,gBAAgB;YACxB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,KAAK,EAAE;SAC1B,CAAC;QACF,IAAI,GAAG,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACpC,IAAI,UAAU;YAAE,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;QAC9C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAU,gCAAgC,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtG,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,MAAoB,EAAE,KAAgB;IACpE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAU,4BAA4B,MAAM,EAAE,CAAC,CAAC;IAC7E,OAAO,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,MAAoB,EAAE,KAAgB;IAC9E,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC,yDAAyD,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC,yDAAyD,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;QACzB,OAAO,WAAW,CAAC,mEAAmE,CAAC,CAAC;IAC1F,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC,wDAAwD,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC,4DAA4D,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEzD,IAAI,UAA8B,CAAC;IACnC,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,WAAW,CAAC,aAAa,KAAK,CAAC,YAAY,cAAc,CAAC,CAAC;QACpE,CAAC;QACD,UAAU,GAAG,QAAQ,CAAC;IACxB,CAAC;IAED,MAAM,IAAI,GAA4B;QACpC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,gBAAgB;QAChB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS;QACzB,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC;IACF,IAAI,KAAK,CAAC,IAAI;QAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACvC,IAAI,UAAU;QAAE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAE7C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAU,qCAAqC,EAAE,IAAI,CAAC,CAAC;IACrF,OAAO,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,MAAoB,EAAE,KAAgB;IAC9E,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QACzB,OAAO,WAAW,CAAC,6DAA6D,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,KAAK,CAAC,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IACtD,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI;QAAE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClF,IAAI,KAAK,CAAC,IAAI;QAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;IAC3C,IAAI,KAAK,CAAC,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IACtD,IAAI,KAAK,CAAC,IAAI;QAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IAEvC,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QACvE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC,aAAa,KAAK,CAAC,YAAY,cAAc,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAU,uCAAuC,KAAK,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,CAAC;IAC3G,OAAO,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,MAAoB,EAAE,KAAgB;IAC9E,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QACzB,OAAO,WAAW,CAAC,6DAA6D,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAU,uCAAuC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;IACxG,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAcD,MAAM,UAAU,gBAAgB,CAAC,GAAsB,EAAE,MAAoB;IAC3E,GAAG,CAAC,YAAY,CAAC;QACf,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE;YACX,qDAAqD;YACrD,+IAA+I;YAC/I,gFAAgF;YAChF,6JAA6J;YAC7J,0FAA0F;YAC1F,gCAAgC;YAChC,mFAAmF;SACpF,CAAC,IAAI,CAAC,GAAG,CAAC;QACX,WAAW,EAAE,eAAe;QAC5B,KAAK,CAAC,OAAO,CAAC,KAAc;YAC1B,OAAO,WAAW,CAAC,MAAM,EAAE,KAAkB,CAAC,CAAC;QACjD,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|