bps-mcp-server 0.16.2 → 0.16.4
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/README.md +19 -3
- package/dist/client/allstats-client.d.ts +2 -0
- package/dist/client/allstats-client.d.ts.map +1 -1
- package/dist/client/allstats-client.js +62 -34
- package/dist/client/allstats-client.js.map +1 -1
- package/dist/client/bps-client.d.ts +14 -5
- package/dist/client/bps-client.d.ts.map +1 -1
- package/dist/client/bps-client.js +215 -23
- package/dist/client/bps-client.js.map +1 -1
- package/dist/client/endpoints.d.ts +7 -0
- package/dist/client/endpoints.d.ts.map +1 -1
- package/dist/client/endpoints.js +43 -5
- package/dist/client/endpoints.js.map +1 -1
- package/dist/client/fields.d.ts +27 -0
- package/dist/client/fields.d.ts.map +1 -0
- package/dist/client/fields.js +105 -0
- package/dist/client/fields.js.map +1 -0
- package/dist/client/types.d.ts +56 -23
- package/dist/client/types.d.ts.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/resources/domain.resources.js +2 -2
- package/dist/resources/domain.resources.js.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/services/data-formatter.d.ts +5 -1
- package/dist/services/data-formatter.d.ts.map +1 -1
- package/dist/services/data-formatter.js +55 -38
- package/dist/services/data-formatter.js.map +1 -1
- package/dist/services/dynamic-data-utils.d.ts +35 -0
- package/dist/services/dynamic-data-utils.d.ts.map +1 -0
- package/dist/services/dynamic-data-utils.js +132 -0
- package/dist/services/dynamic-data-utils.js.map +1 -0
- package/dist/services/file-store.d.ts +5 -1
- package/dist/services/file-store.d.ts.map +1 -1
- package/dist/services/file-store.js +16 -5
- package/dist/services/file-store.js.map +1 -1
- package/dist/services/intent-detector.d.ts.map +1 -1
- package/dist/services/intent-detector.js +10 -10
- package/dist/services/intent-detector.js.map +1 -1
- package/dist/services/learning.d.ts +2 -0
- package/dist/services/learning.d.ts.map +1 -1
- package/dist/services/learning.js +48 -28
- package/dist/services/learning.js.map +1 -1
- package/dist/services/variable-search.d.ts +50 -0
- package/dist/services/variable-search.d.ts.map +1 -0
- package/dist/services/variable-search.js +482 -0
- package/dist/services/variable-search.js.map +1 -0
- package/dist/tools/allstats.tools.d.ts.map +1 -1
- package/dist/tools/allstats.tools.js +13 -3
- package/dist/tools/allstats.tools.js.map +1 -1
- package/dist/tools/analysis.tools.d.ts.map +1 -1
- package/dist/tools/analysis.tools.js +291 -549
- package/dist/tools/analysis.tools.js.map +1 -1
- package/dist/tools/csa.tools.d.ts.map +1 -1
- package/dist/tools/csa.tools.js +13 -4
- package/dist/tools/csa.tools.js.map +1 -1
- package/dist/tools/domain.tools.d.ts.map +1 -1
- package/dist/tools/domain.tools.js +9 -0
- package/dist/tools/domain.tools.js.map +1 -1
- package/dist/tools/dynamic-data.tools.d.ts.map +1 -1
- package/dist/tools/dynamic-data.tools.js +66 -22
- package/dist/tools/dynamic-data.tools.js.map +1 -1
- package/dist/tools/glossary.tools.d.ts +2 -1
- package/dist/tools/glossary.tools.d.ts.map +1 -1
- package/dist/tools/glossary.tools.js +30 -1
- package/dist/tools/glossary.tools.js.map +1 -1
- package/dist/tools/infographic.tools.d.ts.map +1 -1
- package/dist/tools/infographic.tools.js +7 -9
- package/dist/tools/infographic.tools.js.map +1 -1
- package/dist/tools/news.tools.d.ts.map +1 -1
- package/dist/tools/news.tools.js +2 -7
- package/dist/tools/news.tools.js.map +1 -1
- package/dist/tools/publication.tools.d.ts.map +1 -1
- package/dist/tools/publication.tools.js +12 -4
- package/dist/tools/publication.tools.js.map +1 -1
- package/dist/tools/reference.tools.d.ts.map +1 -1
- package/dist/tools/reference.tools.js +9 -1
- package/dist/tools/reference.tools.js.map +1 -1
- package/dist/tools/search.tools.d.ts.map +1 -1
- package/dist/tools/search.tools.js +71 -7
- package/dist/tools/search.tools.js.map +1 -1
- package/dist/tools/smart.tools.d.ts.map +1 -1
- package/dist/tools/smart.tools.js +352 -415
- package/dist/tools/smart.tools.js.map +1 -1
- package/dist/tools/static-table.tools.d.ts.map +1 -1
- package/dist/tools/static-table.tools.js +4 -3
- package/dist/tools/static-table.tools.js.map +1 -1
- package/dist/tools/trade.tools.d.ts.map +1 -1
- package/dist/tools/trade.tools.js +53 -7
- package/dist/tools/trade.tools.js.map +1 -1
- package/dist/utils/error.d.ts.map +1 -1
- package/dist/utils/error.js +5 -0
- package/dist/utils/error.js.map +1 -1
- package/dist/utils/html.d.ts +9 -0
- package/dist/utils/html.d.ts.map +1 -0
- package/dist/utils/html.js +77 -0
- package/dist/utils/html.js.map +1 -0
- package/package.json +10 -10
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-data-utils.d.ts","sourceRoot":"","sources":["../../src/services/dynamic-data-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AASjE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,WAAW,EAAE,CAIhF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,sBAAsB,EAChC,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CA6Bf;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI,CAM5F;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,sBAAsB,EAChC,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,EACnB,aAAa,SAAK,GACjB,sBAAsB,CAkBxB;AAQD,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI,CASrF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI,CAe5F;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,sBAAsB,EAChC,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CAsBf;AAED,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,sBAAsB,EAChC,EAAE,EAAE,MAAM,GACT,MAAM,GAAG,IAAI,CAGf"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { getTurvarId, getTurvarLabel, getVariableId, getVervarId, getVervarLabel, } from "../client/fields.js";
|
|
2
|
+
export function getVervarEntries(response) {
|
|
3
|
+
return (response.vervar ?? [])
|
|
4
|
+
.map((vervar) => ({ id: getVervarId(vervar), label: getVervarLabel(vervar) }))
|
|
5
|
+
.filter((entry) => entry.id !== "");
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Pick the aggregate row for a response.
|
|
9
|
+
* Examples: INDONESIA (9999), Kota+Desa (poverty), or the domain's own
|
|
10
|
+
* province/city when the data is a national table queried for a region.
|
|
11
|
+
*/
|
|
12
|
+
export function selectAggregateVervar(response, domain, domainName) {
|
|
13
|
+
const entries = getVervarEntries(response);
|
|
14
|
+
if (entries.length === 0)
|
|
15
|
+
return null;
|
|
16
|
+
const indonesia = entries.find((entry) => /\bindonesia\b/i.test(entry.label));
|
|
17
|
+
if (indonesia)
|
|
18
|
+
return indonesia.id;
|
|
19
|
+
const combined = entries.find((entry) => /^(kota\s*\+\s*desa|total|jumlah|nasional|semua)$/i.test(entry.label.trim()));
|
|
20
|
+
if (combined)
|
|
21
|
+
return combined.id;
|
|
22
|
+
if (domain !== "0000") {
|
|
23
|
+
const exact = entries.find((entry) => entry.id === domain ||
|
|
24
|
+
(domainName !== undefined && entry.label.trim().toLowerCase() === domainName.trim().toLowerCase()));
|
|
25
|
+
if (exact)
|
|
26
|
+
return exact.id;
|
|
27
|
+
const provinceLike = entries.find((entry) => entry.id === `${domain.slice(0, 2)}99` || entry.id === `${domain.slice(0, 4)}0`);
|
|
28
|
+
if (provinceLike)
|
|
29
|
+
return provinceLike.id;
|
|
30
|
+
if (entries.length === 1)
|
|
31
|
+
return entries[0].id;
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Find the vervar id at the start of a datacontent key.
|
|
37
|
+
* Prefer the longest known id so "3" does not swallow a "30" category.
|
|
38
|
+
*/
|
|
39
|
+
export function extractVervarId(key, response) {
|
|
40
|
+
const ids = getVervarEntries(response).map((entry) => entry.id).sort((a, b) => b.length - a.length);
|
|
41
|
+
for (const id of ids) {
|
|
42
|
+
if (key.startsWith(id))
|
|
43
|
+
return id;
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Keep every category when the breakdown is small and meaningful (e.g.
|
|
49
|
+
* Kota/Desa/Kota+Desa), but collapse large region breakdowns to the aggregate
|
|
50
|
+
* so `find_data` does not dump hundreds of kabupaten rows.
|
|
51
|
+
*/
|
|
52
|
+
export function filterRelevantVervar(response, domain, domainName, maxCategories = 10) {
|
|
53
|
+
const entries = getVervarEntries(response);
|
|
54
|
+
if (entries.length <= maxCategories)
|
|
55
|
+
return response;
|
|
56
|
+
const aggregate = selectAggregateVervar(response, domain, domainName);
|
|
57
|
+
if (!aggregate)
|
|
58
|
+
return response;
|
|
59
|
+
const datacontent = response.datacontent ?? {};
|
|
60
|
+
const filtered = Object.fromEntries(Object.entries(datacontent).filter(([key]) => extractVervarId(key, response) === aggregate));
|
|
61
|
+
if (Object.keys(filtered).length === 0)
|
|
62
|
+
return response;
|
|
63
|
+
return {
|
|
64
|
+
...response,
|
|
65
|
+
datacontent: filtered,
|
|
66
|
+
vervar: (response.vervar ?? []).filter((vervar) => getVervarId(vervar) === aggregate),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function getTurvarEntries(response) {
|
|
70
|
+
return (response.turvar ?? [])
|
|
71
|
+
.map((turvar) => ({ id: getTurvarId(turvar), label: getTurvarLabel(turvar) }))
|
|
72
|
+
.filter((entry) => entry.id !== "");
|
|
73
|
+
}
|
|
74
|
+
/** Pick the combined derived-variable row (e.g. "Perkotaan + Perdesaan"). */
|
|
75
|
+
export function selectAggregateTurvar(response) {
|
|
76
|
+
const entries = getTurvarEntries(response);
|
|
77
|
+
if (entries.length === 0)
|
|
78
|
+
return null;
|
|
79
|
+
if (entries.length === 1)
|
|
80
|
+
return entries[0].id;
|
|
81
|
+
const combined = entries.find((entry) => /perkotaan\s*\+\s*perdesaan|perdesaan\s*\+\s*perkotaan|^(total|jumlah|semua)$/i.test(entry.label.trim()));
|
|
82
|
+
return combined?.id ?? null;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Find the derived-variable id inside a datacontent key by stripping the
|
|
86
|
+
* vervar and variable prefixes (avoids "1" matching "12").
|
|
87
|
+
*/
|
|
88
|
+
export function extractTurvarId(key, response) {
|
|
89
|
+
const vervarId = extractVervarId(key, response);
|
|
90
|
+
let rest = vervarId ? key.slice(vervarId.length) : key;
|
|
91
|
+
const varIds = (response.var ?? [])
|
|
92
|
+
.map((variable) => getVariableId(variable))
|
|
93
|
+
.filter(Boolean)
|
|
94
|
+
.sort((a, b) => b.length - a.length);
|
|
95
|
+
const varId = varIds.find((id) => rest.startsWith(id));
|
|
96
|
+
if (varId)
|
|
97
|
+
rest = rest.slice(varId.length);
|
|
98
|
+
const turvarIds = getTurvarEntries(response)
|
|
99
|
+
.map((entry) => entry.id)
|
|
100
|
+
.sort((a, b) => b.length - a.length);
|
|
101
|
+
return turvarIds.find((id) => rest.startsWith(id)) ?? null;
|
|
102
|
+
}
|
|
103
|
+
/** Extract the aggregate numeric value (or the only value) from a response. */
|
|
104
|
+
export function getAggregateValue(response, domain, domainName) {
|
|
105
|
+
const datacontent = response.datacontent ?? {};
|
|
106
|
+
const numericEntries = Object.entries(datacontent).filter((entry) => typeof entry[1] === "number");
|
|
107
|
+
if (numericEntries.length === 0)
|
|
108
|
+
return null;
|
|
109
|
+
const aggregateVervar = selectAggregateVervar(response, domain, domainName);
|
|
110
|
+
const aggregateTurvar = selectAggregateTurvar(response);
|
|
111
|
+
if (aggregateVervar || aggregateTurvar) {
|
|
112
|
+
const match = numericEntries.find(([key]) => {
|
|
113
|
+
if (aggregateVervar && extractVervarId(key, response) !== aggregateVervar)
|
|
114
|
+
return false;
|
|
115
|
+
if (aggregateTurvar && extractTurvarId(key, response) !== aggregateTurvar)
|
|
116
|
+
return false;
|
|
117
|
+
return true;
|
|
118
|
+
});
|
|
119
|
+
if (match)
|
|
120
|
+
return match[1];
|
|
121
|
+
}
|
|
122
|
+
// Only safe when there is exactly one numeric value.
|
|
123
|
+
if (numericEntries.length === 1)
|
|
124
|
+
return numericEntries[0][1];
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
/** Find a vervar label by id (for formatting ranking rows). */
|
|
128
|
+
export function getVervarLabelById(response, id) {
|
|
129
|
+
const entry = getVervarEntries(response).find((candidate) => candidate.id === id);
|
|
130
|
+
return entry?.label ?? null;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=dynamic-data-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-data-utils.js","sourceRoot":"","sources":["../../src/services/dynamic-data-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,9 @@ import type { IPersistentStore } from "./persistent-store.js";
|
|
|
2
2
|
/**
|
|
3
3
|
* File-based persistent store for stdio transport.
|
|
4
4
|
* Reads from disk on init, writes debounced.
|
|
5
|
-
*
|
|
5
|
+
*
|
|
6
|
+
* Remote sync is opt-in: set BPS_WORKER_URL explicitly. The server will not
|
|
7
|
+
* send your BPS API key to a third-party host by default.
|
|
6
8
|
*/
|
|
7
9
|
export declare class FileStore implements IPersistentStore {
|
|
8
10
|
private data;
|
|
@@ -21,6 +23,8 @@ export declare class FileStore implements IPersistentStore {
|
|
|
21
23
|
get(key: string): Promise<string | null>;
|
|
22
24
|
set(key: string, value: string): Promise<void>;
|
|
23
25
|
delete(key: string): Promise<void>;
|
|
26
|
+
/** Flush pending changes synchronously (called on process exit). */
|
|
27
|
+
flushNow(): void;
|
|
24
28
|
getAll(): Promise<Record<string, string>>;
|
|
25
29
|
merge(entries: Record<string, string>): Promise<void>;
|
|
26
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../src/services/file-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../src/services/file-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQ9D;;;;;;GAMG;AACH,qBAAa,SAAU,YAAW,gBAAgB;IAChD,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAS/C,OAAO,CAAC,IAAI;IAaZ,gEAAgE;IAChE,OAAO,CAAC,cAAc;IAyBtB,mEAAmE;IACnE,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,KAAK;IAYP,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,oEAAoE;IACpE,QAAQ,IAAI,IAAI;IAQV,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIzC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAa5D"}
|
|
@@ -6,11 +6,12 @@ const STORE_DIR = join(homedir(), ".bps-mcp");
|
|
|
6
6
|
const STORE_FILE = join(STORE_DIR, "learned-vars.json");
|
|
7
7
|
const FLUSH_DELAY_MS = 5_000;
|
|
8
8
|
const SYNC_TIMEOUT_MS = 5_000;
|
|
9
|
-
const DEFAULT_WORKER_URL = "https://bps-mcp-server.murphi.my.id";
|
|
10
9
|
/**
|
|
11
10
|
* File-based persistent store for stdio transport.
|
|
12
11
|
* Reads from disk on init, writes debounced.
|
|
13
|
-
*
|
|
12
|
+
*
|
|
13
|
+
* Remote sync is opt-in: set BPS_WORKER_URL explicitly. The server will not
|
|
14
|
+
* send your BPS API key to a third-party host by default.
|
|
14
15
|
*/
|
|
15
16
|
export class FileStore {
|
|
16
17
|
data = {};
|
|
@@ -19,10 +20,12 @@ export class FileStore {
|
|
|
19
20
|
workerUrl;
|
|
20
21
|
apiKey;
|
|
21
22
|
constructor(workerUrl, apiKey) {
|
|
22
|
-
this.workerUrl = workerUrl || process.env.BPS_WORKER_URL ||
|
|
23
|
+
this.workerUrl = workerUrl || process.env.BPS_WORKER_URL || "";
|
|
23
24
|
this.apiKey = apiKey || process.env.BPS_API_KEY || null;
|
|
24
25
|
this.load();
|
|
25
|
-
this.
|
|
26
|
+
if (this.workerUrl && this.apiKey) {
|
|
27
|
+
this.syncFromWorker();
|
|
28
|
+
}
|
|
26
29
|
}
|
|
27
30
|
load() {
|
|
28
31
|
try {
|
|
@@ -65,7 +68,7 @@ export class FileStore {
|
|
|
65
68
|
}
|
|
66
69
|
/** Push a single entry to Worker (background, fire-and-forget). */
|
|
67
70
|
pushToWorker(key, value) {
|
|
68
|
-
if (!this.apiKey)
|
|
71
|
+
if (!this.workerUrl || !this.apiKey)
|
|
69
72
|
return;
|
|
70
73
|
const endpoint = key.startsWith("period:") ? "/api/learned-periods" : "/api/learned-vars";
|
|
71
74
|
fetch(`${this.workerUrl}${endpoint}`, {
|
|
@@ -117,6 +120,14 @@ export class FileStore {
|
|
|
117
120
|
this.scheduleFlush();
|
|
118
121
|
}
|
|
119
122
|
}
|
|
123
|
+
/** Flush pending changes synchronously (called on process exit). */
|
|
124
|
+
flushNow() {
|
|
125
|
+
if (this.flushTimer) {
|
|
126
|
+
clearTimeout(this.flushTimer);
|
|
127
|
+
this.flushTimer = null;
|
|
128
|
+
}
|
|
129
|
+
this.flush();
|
|
130
|
+
}
|
|
120
131
|
async getAll() {
|
|
121
132
|
return { ...this.data };
|
|
122
133
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../src/services/file-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;AACxD,MAAM,cAAc,GAAG,KAAK,CAAC;AAC7B,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B
|
|
1
|
+
{"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../src/services/file-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent-detector.d.ts","sourceRoot":"","sources":["../../src/services/intent-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,SAAS,GACjB,cAAc,GACd,YAAY,GACZ,OAAO,GACP,SAAS,GACT,OAAO,GACP,aAAa,GACb,SAAS,CAAC;AAEd,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"intent-detector.d.ts","sourceRoot":"","sources":["../../src/services/intent-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,SAAS,GACjB,cAAc,GACd,YAAY,GACZ,OAAO,GACP,SAAS,GACT,OAAO,GACP,aAAa,GACb,SAAS,CAAC;AAEd,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AA4CD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,GACZ,YAAY,CAyGd;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,EAAE,CAiCV"}
|
|
@@ -4,12 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
// --- Intent patterns ---
|
|
6
6
|
const COMPARISON_PATTERNS = [
|
|
7
|
-
/\b(bandingkan|banding|vs|versus|dibandingkan|dibanding|membandingkan)\b/i,
|
|
7
|
+
/\b(bandingkan|banding|perbandingan|komparasi|vs|versus|dibandingkan|dibanding|membandingkan)\b/i,
|
|
8
8
|
/\b(antara)\s+(.+?)\s+(dan|dengan)\s+(.+?)(?:\s|$)/i,
|
|
9
9
|
/\b(manakah?\s+(yang|lebih))\b/i,
|
|
10
10
|
/\b(lebih\s+(tinggi|rendah|besar|kecil|baik|buruk))\b/i,
|
|
11
11
|
/\b(perbedaan|selisih|beda)\b/i,
|
|
12
|
-
/\b(dan)\b.*\b(dan)\b/i, // "X dan Y" pattern (2+ regions)
|
|
13
12
|
];
|
|
14
13
|
const TREND_PATTERNS = [
|
|
15
14
|
/\b(tren|trend|perkembangan|perubahan|fluktuasi|naik\s*turun)\b/i,
|
|
@@ -52,11 +51,16 @@ export function detectIntent(query, region, year) {
|
|
|
52
51
|
extractedParams.year = `${yearRange[1]},${yearRange[2]}`;
|
|
53
52
|
}
|
|
54
53
|
}
|
|
55
|
-
// Extract regions for comparison
|
|
56
|
-
|
|
54
|
+
// Extract regions for comparison: "antara X dan Y", "bandingkan X dan Y",
|
|
55
|
+
// or "X vs Y". Only add them when both sides look like names.
|
|
56
|
+
const comparisonMatch = query.match(/(?:antara|bandingkan|perbandingan|komparasi)\s+(.+?)\s+(?:dan|dengan|vs|versus)\s+(.+?)(?:\s+(?:pada|tahun|di)|[,.;]|$)/i) ||
|
|
57
|
+
query.match(/([a-z][a-z .]+?)\s+(?:vs|versus)\s+([a-z][a-z .]+?)(?:\s+(?:pada|tahun|di)|[,.;]|$)/i);
|
|
57
58
|
if (comparisonMatch) {
|
|
58
|
-
|
|
59
|
-
|
|
59
|
+
const stripIndicator = (value) => value
|
|
60
|
+
.replace(/^(kemiskinan|pengangguran|ipm|penduduk|inflasi|pdrb|gini|indeks pembangunan manusia|tingkat pengangguran terbuka)\s+/i, "")
|
|
61
|
+
.trim();
|
|
62
|
+
extractedParams.region1 = stripIndicator(comparisonMatch[1]);
|
|
63
|
+
extractedParams.region2 = stripIndicator(comparisonMatch[2]);
|
|
60
64
|
}
|
|
61
65
|
// Score each intent
|
|
62
66
|
const scores = {
|
|
@@ -88,10 +92,6 @@ export function detectIntent(query, region, year) {
|
|
|
88
92
|
if (pattern.test(query))
|
|
89
93
|
scores.publication += 30;
|
|
90
94
|
}
|
|
91
|
-
// Bonus for multiple regions in query
|
|
92
|
-
const regionCount = (query.match(/(dan|,|versus|vs)/g) || []).length;
|
|
93
|
-
if (regionCount >= 2)
|
|
94
|
-
scores.comparison += 20;
|
|
95
95
|
// Bonus for year range
|
|
96
96
|
if (year && year.includes(","))
|
|
97
97
|
scores.trend += 20;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent-detector.js","sourceRoot":"","sources":["../../src/services/intent-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,0BAA0B;AAE1B,MAAM,mBAAmB,GAAG;IAC1B,
|
|
1
|
+
{"version":3,"file":"intent-detector.js","sourceRoot":"","sources":["../../src/services/intent-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learning.d.ts","sourceRoot":"","sources":["../../src/services/learning.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,yDAAyD;AACzD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"learning.d.ts","sourceRoot":"","sources":["../../src/services/learning.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,yDAAyD;AACzD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA4FD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMtD;AAmDD;;GAEG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA6C5B;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAC7B,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
|
@@ -1,28 +1,31 @@
|
|
|
1
1
|
import { logger } from "../utils/logger.js";
|
|
2
|
-
import stopwords from "stopwords-iso";
|
|
2
|
+
import stopwords from "stopwords-iso" with { type: "json" };
|
|
3
3
|
// --- KNOWN_VARS: hardcoded stable var_ids ---
|
|
4
4
|
const KNOWN_VARS = {
|
|
5
5
|
miskin: [
|
|
6
|
-
{ var_id: 184, title: "Persentase Penduduk Miskin", sub_name: "Kemiskinan dan Ketimpangan" },
|
|
7
|
-
{ var_id: 183, title: "Jumlah Penduduk Miskin
|
|
6
|
+
{ var_id: 184, title: "Persentase Penduduk Miskin (P0)", sub_name: "Kemiskinan dan Ketimpangan" },
|
|
7
|
+
{ var_id: 183, title: "Jumlah Penduduk Miskin Menurut Wilayah", sub_name: "Kemiskinan dan Ketimpangan", unit: "Juta Jiwa" },
|
|
8
|
+
],
|
|
9
|
+
garis_kemiskinan: [
|
|
10
|
+
{ var_id: 195, title: "Garis Kemiskinan (Rupiah/Kapita/Bulan)", sub_name: "Kemiskinan dan Ketimpangan" }
|
|
8
11
|
],
|
|
9
12
|
pengangguran: [
|
|
10
|
-
{ var_id: 543, title: "Tingkat Pengangguran Terbuka
|
|
11
|
-
{ var_id: 674, title: "Jumlah Pengangguran (jiwa)", sub_name: "Tenaga Kerja" },
|
|
13
|
+
{ var_id: 543, title: "Tingkat Pengangguran Terbuka Menurut Provinsi", sub_name: "Tenaga Kerja", unit: "Persen" },
|
|
12
14
|
],
|
|
13
15
|
ipm: [
|
|
14
16
|
{ var_id: 413, title: "[Metode Baru] Indeks Pembangunan Manusia (IPM)", sub_name: "IPM" },
|
|
15
17
|
],
|
|
16
18
|
gini: [
|
|
17
|
-
{ var_id: 98, title: "Gini
|
|
19
|
+
{ var_id: 98, title: "Gini Ratio Menurut Provinsi dan Daerah", sub_name: "Kemiskinan dan Ketimpangan" },
|
|
18
20
|
],
|
|
19
21
|
penduduk: [
|
|
20
|
-
{ var_id:
|
|
22
|
+
{ var_id: 2781, title: "Jumlah Penduduk menurut Provinsi dan Jenis Kelamin", sub_name: "Kependudukan" },
|
|
21
23
|
],
|
|
22
24
|
};
|
|
23
25
|
// --- KEYWORD_ALIASES: map variations to canonical key ---
|
|
24
26
|
const KEYWORD_ALIASES = {
|
|
25
27
|
// Kemiskinan
|
|
28
|
+
"garis kemiskinan": "garis_kemiskinan",
|
|
26
29
|
kemiskinan: "miskin",
|
|
27
30
|
"penduduk miskin": "miskin",
|
|
28
31
|
"warga miskin": "miskin",
|
|
@@ -92,26 +95,21 @@ function resolveCanonical(normalized) {
|
|
|
92
95
|
// Check if normalized IS a canonical key
|
|
93
96
|
if (KNOWN_VARS[normalized])
|
|
94
97
|
return normalized;
|
|
95
|
-
//
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
const pos = normalized.indexOf(alias);
|
|
101
|
-
if (pos >= 0 && pos > lastPos) {
|
|
102
|
-
lastMatch = canonical;
|
|
103
|
-
lastPos = pos;
|
|
98
|
+
// Find matching alias, sorting by length descending to match more specific/longer phrases first
|
|
99
|
+
const sortedAliases = Object.keys(KEYWORD_ALIASES).sort((a, b) => b.length - a.length);
|
|
100
|
+
for (const alias of sortedAliases) {
|
|
101
|
+
if (normalized.includes(alias)) {
|
|
102
|
+
return KEYWORD_ALIASES[alias];
|
|
104
103
|
}
|
|
105
104
|
}
|
|
106
|
-
//
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
if (
|
|
110
|
-
|
|
111
|
-
lastPos = pos;
|
|
105
|
+
// Find matching canonical key
|
|
106
|
+
const sortedKnown = Object.keys(KNOWN_VARS).sort((a, b) => b.length - a.length);
|
|
107
|
+
for (const key of sortedKnown) {
|
|
108
|
+
if (normalized.includes(key)) {
|
|
109
|
+
return key;
|
|
112
110
|
}
|
|
113
111
|
}
|
|
114
|
-
//
|
|
112
|
+
// Word-level fallback
|
|
115
113
|
const words = normalized.split(/\s+/);
|
|
116
114
|
for (let i = words.length - 1; i >= 0; i--) {
|
|
117
115
|
const word = words[i];
|
|
@@ -122,16 +120,16 @@ function resolveCanonical(normalized) {
|
|
|
122
120
|
return word;
|
|
123
121
|
}
|
|
124
122
|
// Substring check for individual words
|
|
125
|
-
for (const
|
|
123
|
+
for (const alias of sortedAliases) {
|
|
126
124
|
if (alias.includes(word) || word.includes(alias))
|
|
127
|
-
return
|
|
125
|
+
return KEYWORD_ALIASES[alias];
|
|
128
126
|
}
|
|
129
|
-
for (const key of
|
|
127
|
+
for (const key of sortedKnown) {
|
|
130
128
|
if (key.includes(word) || word.includes(key))
|
|
131
129
|
return key;
|
|
132
130
|
}
|
|
133
131
|
}
|
|
134
|
-
return
|
|
132
|
+
return normalized;
|
|
135
133
|
}
|
|
136
134
|
/**
|
|
137
135
|
* 3-layer lookup: KNOWN_VARS → PersistentStore → null (caller does full search).
|
|
@@ -158,6 +156,21 @@ export async function lookupVar(query, domain, store) {
|
|
|
158
156
|
if (stored) {
|
|
159
157
|
try {
|
|
160
158
|
const parsed = JSON.parse(stored);
|
|
159
|
+
// Legacy entries (before `domain` was stored) are only safe for the
|
|
160
|
+
// national domain. Provincial variable IDs are domain-specific; reusing a
|
|
161
|
+
// national ID for a province can point to a completely different table.
|
|
162
|
+
if (parsed.domain === undefined) {
|
|
163
|
+
if (domain !== "0000") {
|
|
164
|
+
logger.debug(`lookupVar: discarding legacy provincial mapping "${storeKey}"`);
|
|
165
|
+
await store.delete(storeKey);
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else if (parsed.domain !== domain) {
|
|
170
|
+
logger.debug(`lookupVar: discarding cross-domain mapping "${storeKey}"`);
|
|
171
|
+
await store.delete(storeKey);
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
161
174
|
logger.debug(`lookupVar: store hit "${storeKey}" → var_id=${parsed.var_id}`);
|
|
162
175
|
return parsed;
|
|
163
176
|
}
|
|
@@ -174,7 +187,14 @@ export async function learnVar(query, domain, varData, store) {
|
|
|
174
187
|
const normalized = normalizeKeyword(query);
|
|
175
188
|
const canonical = resolveCanonical(normalized);
|
|
176
189
|
const key = `${canonical}:${domain}`;
|
|
177
|
-
|
|
190
|
+
const payload = {
|
|
191
|
+
var_id: varData.var_id,
|
|
192
|
+
title: varData.title,
|
|
193
|
+
sub_name: varData.sub_name,
|
|
194
|
+
unit: varData.unit,
|
|
195
|
+
domain,
|
|
196
|
+
};
|
|
197
|
+
await store.set(key, JSON.stringify(payload));
|
|
178
198
|
logger.debug(`learnVar: saved "${key}" → var_id=${varData.var_id}`);
|
|
179
199
|
}
|
|
180
200
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learning.js","sourceRoot":"","sources":["../../src/services/learning.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,SAAS,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"learning.js","sourceRoot":"","sources":["../../src/services/learning.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { BpsClient } from "../client/bps-client.js";
|
|
2
|
+
import type { BpsPeriod } from "../client/types.js";
|
|
3
|
+
import type { IPersistentStore } from "./persistent-store.js";
|
|
4
|
+
import type { LearnedVar } from "./learning.js";
|
|
5
|
+
export interface VariableCandidate extends LearnedVar {
|
|
6
|
+
score: number;
|
|
7
|
+
}
|
|
8
|
+
export interface SearchVariablesOptions {
|
|
9
|
+
maxSubjects?: number;
|
|
10
|
+
maxPagesPerSubject?: number;
|
|
11
|
+
maxCandidates?: number;
|
|
12
|
+
}
|
|
13
|
+
/** Extract root words and synonyms so "kemiskinan" also matches "miskin". */
|
|
14
|
+
export declare function expandQueryTerms(query: string): string[];
|
|
15
|
+
export declare function getSubjectIdsForKeyword(query: string): number[];
|
|
16
|
+
/**
|
|
17
|
+
* Score how well a variable title matches a query.
|
|
18
|
+
* Returns 0 when there is no keyword match at all — generic bonuses such as
|
|
19
|
+
* "title contains 'jumlah' or is short" must never make an unrelated variable
|
|
20
|
+
* win (this previously made "pemeluk agama" return a population variable).
|
|
21
|
+
*/
|
|
22
|
+
export declare function computeRelevanceScore(query: string, title: string, subName?: string, definition?: string): number;
|
|
23
|
+
/**
|
|
24
|
+
* Search variables across the subjects that are likely relevant to a query.
|
|
25
|
+
* Returns candidates sorted by relevance (best first).
|
|
26
|
+
*/
|
|
27
|
+
export declare function searchVariables(client: BpsClient, domain: string, query: string, options?: SearchVariablesOptions): Promise<VariableCandidate[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Resolve the best variable for a query: learned mapping → full search.
|
|
30
|
+
* Saves a successful mapping for future calls.
|
|
31
|
+
*/
|
|
32
|
+
export declare function resolveVariable(client: BpsClient, store: IPersistentStore | null, query: string, domain: string): Promise<LearnedVar | null>;
|
|
33
|
+
export interface ResolvedVariableWithPeriods {
|
|
34
|
+
varData: LearnedVar;
|
|
35
|
+
periods: BpsPeriod[];
|
|
36
|
+
matchedYears: string[];
|
|
37
|
+
candidates: VariableCandidate[];
|
|
38
|
+
}
|
|
39
|
+
export interface ResolveYearsOptions {
|
|
40
|
+
/** Do not trust a learned mapping (e.g. a breakdown query). */
|
|
41
|
+
skipLearned?: boolean;
|
|
42
|
+
maxCandidates?: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Resolve a variable and require that it has periods for the requested years.
|
|
46
|
+
* BPS often keeps an old series (e.g. IPM 2014–2019) next to a current one;
|
|
47
|
+
* without this check a 2023 query silently returns 2019 data.
|
|
48
|
+
*/
|
|
49
|
+
export declare function resolveVariableForYears(client: BpsClient, store: IPersistentStore | null, query: string, domain: string, years: string[], options?: ResolveYearsOptions): Promise<ResolvedVariableWithPeriods | null>;
|
|
50
|
+
//# sourceMappingURL=variable-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variable-search.d.ts","sourceRoot":"","sources":["../../src/services/variable-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAuEhD,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA2BxD;AAwBD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAO/D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,SAAK,EACZ,UAAU,SAAK,GACd,MAAM,CA8GR;AA0BD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA2F9B;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,gBAAgB,GAAG,IAAI,EAC9B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAe5B;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,UAAU,CAAC;IACpB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,iBAAiB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,+DAA+D;IAC/D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAgBD;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,gBAAgB,GAAG,IAAI,EAC9B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC,CAgF7C"}
|