openplanter 0.2.6 → 0.2.8

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.
Files changed (31) hide show
  1. package/dist/investigation-tools/asx-reddit-scraper.d.ts +43 -0
  2. package/dist/investigation-tools/asx-reddit-scraper.d.ts.map +1 -0
  3. package/dist/investigation-tools/asx-reddit-scraper.js +215 -0
  4. package/dist/investigation-tools/asx-reddit-scraper.js.map +1 -0
  5. package/dist/investigation-tools/index.d.ts +5 -0
  6. package/dist/investigation-tools/index.d.ts.map +1 -1
  7. package/dist/investigation-tools/index.js +5 -0
  8. package/dist/investigation-tools/index.js.map +1 -1
  9. package/dist/investigation-tools/listcorp-scraper.d.ts +41 -0
  10. package/dist/investigation-tools/listcorp-scraper.d.ts.map +1 -0
  11. package/dist/investigation-tools/listcorp-scraper.js +204 -0
  12. package/dist/investigation-tools/listcorp-scraper.js.map +1 -0
  13. package/dist/investigation-tools/seeking-alpha-asx-scraper.d.ts +55 -0
  14. package/dist/investigation-tools/seeking-alpha-asx-scraper.d.ts.map +1 -0
  15. package/dist/investigation-tools/seeking-alpha-asx-scraper.js +234 -0
  16. package/dist/investigation-tools/seeking-alpha-asx-scraper.js.map +1 -0
  17. package/dist/investigation-tools/tool-registry.d.ts.map +1 -1
  18. package/dist/investigation-tools/tool-registry.js +56 -0
  19. package/dist/investigation-tools/tool-registry.js.map +1 -1
  20. package/dist/investigation-tools/universal-forum-scraper.d.ts +44 -0
  21. package/dist/investigation-tools/universal-forum-scraper.d.ts.map +1 -0
  22. package/dist/investigation-tools/universal-forum-scraper.js +175 -0
  23. package/dist/investigation-tools/universal-forum-scraper.js.map +1 -0
  24. package/dist/investigation-tools/yahoo-finance-au-scraper.d.ts +33 -0
  25. package/dist/investigation-tools/yahoo-finance-au-scraper.d.ts.map +1 -0
  26. package/dist/investigation-tools/yahoo-finance-au-scraper.js +212 -0
  27. package/dist/investigation-tools/yahoo-finance-au-scraper.js.map +1 -0
  28. package/dist/tool-defs.d.ts.map +1 -1
  29. package/dist/tool-defs.js +197 -0
  30. package/dist/tool-defs.js.map +1 -1
  31. package/package.json +1 -1
@@ -0,0 +1,43 @@
1
+ /**
2
+ * asx-reddit-scraper.ts — Australian Finance Reddit Scraper
3
+ *
4
+ * Scrapes r/ASX_Bets, r/AusFinance, r/AusStocks and other Australian
5
+ * finance subreddits for ASX ticker mentions. Extracts sentiment, rumor
6
+ * flags, and pre-announcement timing signals.
7
+ *
8
+ * Uses Reddit's public JSON endpoints (no API key required).
9
+ */
10
+ export interface RedditPostRecord {
11
+ post_id: string;
12
+ date: string;
13
+ subreddit: string;
14
+ author: string;
15
+ title: string;
16
+ text_snip: string;
17
+ sentiment_score: number;
18
+ sentiment_label: string;
19
+ rumor_score: number;
20
+ pre_ann_flag: boolean;
21
+ url: string;
22
+ score: number;
23
+ num_comments: number;
24
+ }
25
+ export interface AsxRedditResult {
26
+ ticker: string;
27
+ scraped_at: string;
28
+ subreddits: string[];
29
+ period_days: number;
30
+ total_posts: number;
31
+ posts: RedditPostRecord[];
32
+ overall_sentiment: number;
33
+ rumor_count: number;
34
+ pre_ann_count: number;
35
+ }
36
+ export declare function scrapeAsxReddit(opts: {
37
+ ticker: string;
38
+ subreddits?: string[];
39
+ days?: number;
40
+ keywords?: string[];
41
+ }): Promise<AsxRedditResult>;
42
+ export declare function sampleData(ticker: string): AsxRedditResult;
43
+ //# sourceMappingURL=asx-reddit-scraper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asx-reddit-scraper.d.ts","sourceRoot":"","sources":["../../src/investigation-tools/asx-reddit-scraper.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAuCH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAqID,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,GAAG,OAAO,CAAC,eAAe,CAAC,CAgD3B;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CA2D1D"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * asx-reddit-scraper.ts — Australian Finance Reddit Scraper
3
+ *
4
+ * Scrapes r/ASX_Bets, r/AusFinance, r/AusStocks and other Australian
5
+ * finance subreddits for ASX ticker mentions. Extracts sentiment, rumor
6
+ * flags, and pre-announcement timing signals.
7
+ *
8
+ * Uses Reddit's public JSON endpoints (no API key required).
9
+ */
10
+ import { fetchWithDelay, sentimentScore, sentimentLabel, isRumor, isoNow, normalizeTicker, DEFAULT_USER_AGENT, } from "./shared.js";
11
+ // ── Constants ────────────────────────────────────────────────────
12
+ const REDDIT_SEARCH_JSON = "https://old.reddit.com/r/{subreddit}/search.json?q={query}&sort=new&restrict_sr=1&t=month&limit=100";
13
+ const DEFAULT_SUBREDDITS = ["ASX_Bets", "AusFinance", "AusStocks"];
14
+ const DEFAULT_RUMOR_KEYWORDS = ["leak", "insider", "before ASX", "ptt"];
15
+ const PRE_ANN_KEYWORDS = [
16
+ "before asx",
17
+ "before open",
18
+ "before ann",
19
+ "pre-ann",
20
+ "pre ann",
21
+ "pending announcement",
22
+ "about to drop",
23
+ "imminent",
24
+ "tomorrow morning",
25
+ "before market",
26
+ ];
27
+ const MAX_TEXT_SNIP = 400;
28
+ const REQUEST_DELAY_S = 2.0;
29
+ // ── Helpers ──────────────────────────────────────────────────────
30
+ function truncate(text, maxLen = MAX_TEXT_SNIP) {
31
+ if (text.length <= maxLen)
32
+ return text;
33
+ const cut = text.slice(0, maxLen);
34
+ const sp = cut.lastIndexOf(" ");
35
+ return (sp > 0 ? cut.slice(0, sp) : cut) + "…";
36
+ }
37
+ function computeRumorScore(text, keywords) {
38
+ const lower = text.toLowerCase();
39
+ let hits = 0;
40
+ for (const kw of keywords) {
41
+ if (lower.includes(kw.toLowerCase()))
42
+ hits++;
43
+ }
44
+ if (isRumor(text))
45
+ hits += 2;
46
+ return Math.min(1, hits / Math.max(keywords.length, 1));
47
+ }
48
+ function hasPreAnnSignal(text) {
49
+ const lower = text.toLowerCase();
50
+ return PRE_ANN_KEYWORDS.some((kw) => lower.includes(kw));
51
+ }
52
+ function formatDateIso(epoch) {
53
+ const d = new Date(epoch * 1000);
54
+ const y = d.getFullYear();
55
+ const m = String(d.getMonth() + 1).padStart(2, "0");
56
+ const day = String(d.getDate()).padStart(2, "0");
57
+ return `${y}-${m}-${day}`;
58
+ }
59
+ function round3(n) {
60
+ return Math.round(n * 1000) / 1000;
61
+ }
62
+ // ── Fetching ─────────────────────────────────────────────────────
63
+ async function fetchSubredditPosts(subreddit, query, cutoffEpoch) {
64
+ const url = REDDIT_SEARCH_JSON
65
+ .replace("{subreddit}", subreddit)
66
+ .replace("{query}", encodeURIComponent(query));
67
+ try {
68
+ const resp = await fetchWithDelay(url, {
69
+ delay: REQUEST_DELAY_S,
70
+ userAgent: DEFAULT_USER_AGENT,
71
+ headers: { Accept: "application/json" },
72
+ });
73
+ if (!resp.ok) {
74
+ console.error(`[WARN] Reddit r/${subreddit} returned HTTP ${resp.status}`);
75
+ return [];
76
+ }
77
+ const listing = (await resp.json());
78
+ const children = listing.data?.children ?? [];
79
+ const posts = [];
80
+ for (const child of children) {
81
+ if (child.kind !== "t3")
82
+ continue;
83
+ const d = child.data;
84
+ const created = d.created_utc ?? 0;
85
+ if (created < cutoffEpoch)
86
+ continue;
87
+ const title = d.title ?? "";
88
+ const selftext = d.selftext ?? "";
89
+ const combined = `${title} ${selftext}`;
90
+ posts.push({
91
+ post_id: d.id ?? "",
92
+ date: formatDateIso(created),
93
+ subreddit: d.subreddit ?? subreddit,
94
+ author: d.author ?? "[deleted]",
95
+ title,
96
+ text_snip: truncate(selftext || title),
97
+ sentiment_score: round3(sentimentScore(combined)),
98
+ sentiment_label: sentimentLabel(sentimentScore(combined)),
99
+ rumor_score: round3(computeRumorScore(combined, DEFAULT_RUMOR_KEYWORDS)),
100
+ pre_ann_flag: hasPreAnnSignal(combined),
101
+ url: d.permalink
102
+ ? `https://reddit.com${d.permalink}`
103
+ : "",
104
+ score: d.score ?? 0,
105
+ num_comments: d.num_comments ?? 0,
106
+ });
107
+ }
108
+ return posts;
109
+ }
110
+ catch (err) {
111
+ const msg = err instanceof Error ? err.message : String(err);
112
+ console.error(`[WARN] Reddit r/${subreddit} scrape failed: ${msg}`);
113
+ return [];
114
+ }
115
+ }
116
+ // ── Main ─────────────────────────────────────────────────────────
117
+ export async function scrapeAsxReddit(opts) {
118
+ const ticker = normalizeTicker(opts.ticker);
119
+ const subreddits = opts.subreddits ?? DEFAULT_SUBREDDITS;
120
+ const days = opts.days ?? 14;
121
+ const keywords = opts.keywords ?? DEFAULT_RUMOR_KEYWORDS;
122
+ const cutoffEpoch = Math.floor((Date.now() - days * 24 * 60 * 60 * 1000) / 1000);
123
+ const allPosts = [];
124
+ for (const sub of subreddits) {
125
+ const posts = await fetchSubredditPosts(sub, ticker, cutoffEpoch);
126
+ for (const p of posts) {
127
+ p.rumor_score = round3(computeRumorScore(`${p.title} ${p.text_snip}`, keywords));
128
+ }
129
+ allPosts.push(...posts);
130
+ }
131
+ const seen = new Set();
132
+ const unique = allPosts.filter((p) => {
133
+ if (seen.has(p.post_id))
134
+ return false;
135
+ seen.add(p.post_id);
136
+ return true;
137
+ });
138
+ unique.sort((a, b) => b.date.localeCompare(a.date));
139
+ const scores = unique.map((p) => p.sentiment_score);
140
+ const overall = scores.length > 0
141
+ ? round3(scores.reduce((a, b) => a + b, 0) / scores.length)
142
+ : 0;
143
+ return {
144
+ ticker,
145
+ scraped_at: isoNow(),
146
+ subreddits,
147
+ period_days: days,
148
+ total_posts: unique.length,
149
+ posts: unique,
150
+ overall_sentiment: overall,
151
+ rumor_count: unique.filter((p) => p.rumor_score > 0.3).length,
152
+ pre_ann_count: unique.filter((p) => p.pre_ann_flag).length,
153
+ };
154
+ }
155
+ export function sampleData(ticker) {
156
+ const t = normalizeTicker(ticker);
157
+ return {
158
+ ticker: t,
159
+ scraped_at: isoNow(),
160
+ subreddits: DEFAULT_SUBREDDITS,
161
+ period_days: 14,
162
+ total_posts: 3,
163
+ posts: [
164
+ {
165
+ post_id: "1abc123",
166
+ date: "2026-02-20",
167
+ subreddit: "ASX_Bets",
168
+ author: "yolo_trader",
169
+ title: `${t} about to rocket? Insider leak before ASX open`,
170
+ text_snip: `Heard from a mate that ${t} has a massive ann dropping before market open tomorrow. NFA.`,
171
+ sentiment_score: 0.667,
172
+ sentiment_label: "bullish",
173
+ rumor_score: 0.75,
174
+ pre_ann_flag: true,
175
+ url: `https://reddit.com/r/ASX_Bets/comments/1abc123/${t.toLowerCase()}_rocket/`,
176
+ score: 42,
177
+ num_comments: 18,
178
+ },
179
+ {
180
+ post_id: "2def456",
181
+ date: "2026-02-19",
182
+ subreddit: "AusFinance",
183
+ author: "careful_investor",
184
+ title: `${t} valuation analysis — overvalued or undervalued?`,
185
+ text_snip: `Looking at the fundamentals of ${t}, the PE ratio suggests it might be undervalued relative to peers.`,
186
+ sentiment_score: 0.333,
187
+ sentiment_label: "bullish",
188
+ rumor_score: 0.0,
189
+ pre_ann_flag: false,
190
+ url: `https://reddit.com/r/AusFinance/comments/2def456/${t.toLowerCase()}_valuation/`,
191
+ score: 15,
192
+ num_comments: 7,
193
+ },
194
+ {
195
+ post_id: "3ghi789",
196
+ date: "2026-02-18",
197
+ subreddit: "AusStocks",
198
+ author: "short_seller_99",
199
+ title: `Why I'm shorting ${t} — bearish case`,
200
+ text_snip: `${t} management has been dumping shares. This is a sell signal. Avoid.`,
201
+ sentiment_score: -0.667,
202
+ sentiment_label: "bearish",
203
+ rumor_score: 0.25,
204
+ pre_ann_flag: false,
205
+ url: `https://reddit.com/r/AusStocks/comments/3ghi789/shorting_${t.toLowerCase()}/`,
206
+ score: 8,
207
+ num_comments: 23,
208
+ },
209
+ ],
210
+ overall_sentiment: 0.111,
211
+ rumor_count: 1,
212
+ pre_ann_count: 1,
213
+ };
214
+ }
215
+ //# sourceMappingURL=asx-reddit-scraper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asx-reddit-scraper.js","sourceRoot":"","sources":["../../src/investigation-tools/asx-reddit-scraper.ts"],"names":[],"mappings":"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"}
@@ -29,5 +29,10 @@ export * as documentProcessing from "./document-processing.js";
29
29
  export * as investigationAutomation from "./investigation-automation.js";
30
30
  export * as monitoringTools from "./monitoring-tools.js";
31
31
  export * as cryptoEcosystem from "./crypto-ecosystem.js";
32
+ export * as asxRedditScraper from "./asx-reddit-scraper.js";
33
+ export * as listcorpScraper from "./listcorp-scraper.js";
34
+ export * as yahooFinanceAuScraper from "./yahoo-finance-au-scraper.js";
35
+ export * as seekingAlphaAsxScraper from "./seeking-alpha-asx-scraper.js";
36
+ export * as universalForumScraper from "./universal-forum-scraper.js";
32
37
  export { TS_TOOL_REGISTRY, TS_TOOL_NAMES, runTsTool } from "./tool-registry.js";
33
38
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/investigation-tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,sBAAsB,MAAM,+BAA+B,CAAC;AACxE,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,oBAAoB,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AAGnD,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,kBAAkB,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,kBAAkB,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,uBAAuB,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/investigation-tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,sBAAsB,MAAM,+BAA+B,CAAC;AACxE,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,oBAAoB,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AAGnD,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,kBAAkB,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,kBAAkB,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,uBAAuB,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,qBAAqB,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,sBAAsB,MAAM,gCAAgC,CAAC;AACzE,OAAO,KAAK,qBAAqB,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC"}
@@ -30,5 +30,10 @@ export * as documentProcessing from "./document-processing.js";
30
30
  export * as investigationAutomation from "./investigation-automation.js";
31
31
  export * as monitoringTools from "./monitoring-tools.js";
32
32
  export * as cryptoEcosystem from "./crypto-ecosystem.js";
33
+ export * as asxRedditScraper from "./asx-reddit-scraper.js";
34
+ export * as listcorpScraper from "./listcorp-scraper.js";
35
+ export * as yahooFinanceAuScraper from "./yahoo-finance-au-scraper.js";
36
+ export * as seekingAlphaAsxScraper from "./seeking-alpha-asx-scraper.js";
37
+ export * as universalForumScraper from "./universal-forum-scraper.js";
33
38
  export { TS_TOOL_REGISTRY, TS_TOOL_NAMES, runTsTool } from "./tool-registry.js";
34
39
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/investigation-tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,sBAAsB,MAAM,+BAA+B,CAAC;AACxE,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,oBAAoB,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AAEnD,0BAA0B;AAC1B,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,kBAAkB,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,kBAAkB,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,uBAAuB,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/investigation-tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,sBAAsB,MAAM,+BAA+B,CAAC;AACxE,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,oBAAoB,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AAEnD,0BAA0B;AAC1B,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,kBAAkB,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,kBAAkB,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,uBAAuB,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,qBAAqB,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,sBAAsB,MAAM,gCAAgC,CAAC;AACzE,OAAO,KAAK,qBAAqB,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * listcorp-scraper.ts — Listcorp ASX Announcements & Comments Scraper
3
+ *
4
+ * Scrapes Listcorp (https://www.listcorp.com) for ASX company announcements
5
+ * and user comments. Flags comments posted before official ASX lodgement as
6
+ * potential pre-announcement buzz signals.
7
+ */
8
+ export interface ListcorpAnnouncement {
9
+ title: string;
10
+ date: string;
11
+ ann_type: string | null;
12
+ url: string;
13
+ is_price_sensitive: boolean;
14
+ }
15
+ export interface ListcorpComment {
16
+ author: string;
17
+ date: string;
18
+ text: string;
19
+ sentiment_score: number;
20
+ sentiment_label: string;
21
+ is_rumor: boolean;
22
+ pre_lodgement_flag: boolean;
23
+ related_announcement: string | null;
24
+ }
25
+ export interface ListcorpResult {
26
+ ticker: string;
27
+ scraped_at: string;
28
+ period_days: number;
29
+ announcements: ListcorpAnnouncement[];
30
+ comments: ListcorpComment[];
31
+ pre_lodgement_comments: number;
32
+ total_comments: number;
33
+ overall_sentiment: number;
34
+ }
35
+ export declare function scrapeListcorp(opts: {
36
+ ticker: string;
37
+ days?: number;
38
+ ann_types?: string[];
39
+ }): Promise<ListcorpResult>;
40
+ export declare function sampleData(ticker: string): ListcorpResult;
41
+ //# sourceMappingURL=listcorp-scraper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listcorp-scraper.d.ts","sourceRoot":"","sources":["../../src/investigation-tools/listcorp-scraper.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA2BH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,oBAAoB,EAAE,CAAC;IACtC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AA0ID,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,GAAG,OAAO,CAAC,cAAc,CAAC,CAyC1B;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAgDzD"}
@@ -0,0 +1,204 @@
1
+ /**
2
+ * listcorp-scraper.ts — Listcorp ASX Announcements & Comments Scraper
3
+ *
4
+ * Scrapes Listcorp (https://www.listcorp.com) for ASX company announcements
5
+ * and user comments. Flags comments posted before official ASX lodgement as
6
+ * potential pre-announcement buzz signals.
7
+ */
8
+ import { fetchHtml, normalizeTicker, parseDate, sentimentScore, sentimentLabel, isRumor, isoNow, } from "./shared.js";
9
+ // ── Constants ────────────────────────────────────────────────────
10
+ const LISTCORP_BASE = "https://www.listcorp.com/asx/{ticker}";
11
+ const REQUEST_DELAY_S = 1.5;
12
+ const MAX_TEXT_LEN = 500;
13
+ const ANN_TYPE_KEYWORDS = {
14
+ "3Y": ["appendix 3y", "change of director", "director's interest"],
15
+ "4C": ["appendix 4c", "quarterly cash flow", "quarterly cashflow", "quarterly activities"],
16
+ "3B": ["appendix 3b", "issue of securities", "new issue"],
17
+ };
18
+ // ── Helpers ──────────────────────────────────────────────────────
19
+ function truncate(text, maxLen = MAX_TEXT_LEN) {
20
+ if (text.length <= maxLen)
21
+ return text;
22
+ const cut = text.slice(0, maxLen);
23
+ const sp = cut.lastIndexOf(" ");
24
+ return (sp > 0 ? cut.slice(0, sp) : cut) + "…";
25
+ }
26
+ function classifyAnnType(title) {
27
+ const lower = title.toLowerCase();
28
+ for (const [type, keywords] of Object.entries(ANN_TYPE_KEYWORDS)) {
29
+ if (keywords.some((kw) => lower.includes(kw)))
30
+ return type;
31
+ }
32
+ return null;
33
+ }
34
+ function formatDateIso(d) {
35
+ const y = d.getFullYear();
36
+ const m = String(d.getMonth() + 1).padStart(2, "0");
37
+ const day = String(d.getDate()).padStart(2, "0");
38
+ return `${y}-${m}-${day}`;
39
+ }
40
+ function round3(n) {
41
+ return Math.round(n * 1000) / 1000;
42
+ }
43
+ // ── Scraping ─────────────────────────────────────────────────────
44
+ async function fetchListcorpPage(ticker) {
45
+ const url = LISTCORP_BASE.replace("{ticker}", ticker.toLowerCase());
46
+ try {
47
+ return await fetchHtml(url, { delay: REQUEST_DELAY_S });
48
+ }
49
+ catch (err) {
50
+ const msg = err instanceof Error ? err.message : String(err);
51
+ console.error(`[WARN] Listcorp page fetch failed for ${ticker}: ${msg}`);
52
+ return null;
53
+ }
54
+ }
55
+ function parseAnnouncements($, cutoff) {
56
+ const anns = [];
57
+ $("table tr, .announcement-row, .ann-item, [class*='announcement']").each((_i, el) => {
58
+ const row = $(el);
59
+ const link = row.find("a").first();
60
+ const title = link.text().trim() || row.find("td").eq(1).text().trim();
61
+ if (!title)
62
+ return;
63
+ const href = link.attr("href") ?? "";
64
+ const dateText = row.find("time").attr("datetime") ??
65
+ row.find("td").first().text().trim() ??
66
+ row.find(".date").text().trim();
67
+ const date = parseDate(dateText);
68
+ if (!date || date < cutoff)
69
+ return;
70
+ const priceSensitive = row.text().toLowerCase().includes("price sensitive") ||
71
+ row.find("[class*='sensitive']").length > 0;
72
+ anns.push({
73
+ title,
74
+ date: formatDateIso(date),
75
+ ann_type: classifyAnnType(title),
76
+ url: href.startsWith("http") ? href : `https://www.listcorp.com${href}`,
77
+ is_price_sensitive: priceSensitive,
78
+ });
79
+ });
80
+ return anns;
81
+ }
82
+ function parseComments($, announcements, cutoff) {
83
+ const comments = [];
84
+ const earliestAnnDate = announcements.length > 0
85
+ ? announcements.reduce((min, a) => (a.date < min ? a.date : min), announcements[0].date)
86
+ : null;
87
+ $(".comment, [class*='comment'], .user-post, .discussion-item").each((_i, el) => {
88
+ const node = $(el);
89
+ const author = node.find(".author, .username, [class*='user']").first().text().trim() || "anonymous";
90
+ const dateText = node.find("time").attr("datetime") ??
91
+ node.find(".date, .timestamp, [class*='date']").first().text().trim();
92
+ const text = truncate(node.find(".body, .text, .content, [class*='body']").first().text().trim() ||
93
+ node.text().trim());
94
+ if (!text)
95
+ return;
96
+ const date = parseDate(dateText);
97
+ if (!date || date < cutoff)
98
+ return;
99
+ const dateStr = formatDateIso(date);
100
+ const score = sentimentScore(text);
101
+ let preLodgement = false;
102
+ let relatedAnn = null;
103
+ for (const ann of announcements) {
104
+ if (dateStr < ann.date) {
105
+ preLodgement = true;
106
+ relatedAnn = ann.title;
107
+ break;
108
+ }
109
+ }
110
+ comments.push({
111
+ author,
112
+ date: dateStr,
113
+ text,
114
+ sentiment_score: round3(score),
115
+ sentiment_label: sentimentLabel(score),
116
+ is_rumor: isRumor(text),
117
+ pre_lodgement_flag: preLodgement,
118
+ related_announcement: relatedAnn,
119
+ });
120
+ });
121
+ return comments;
122
+ }
123
+ // ── Main ─────────────────────────────────────────────────────────
124
+ export async function scrapeListcorp(opts) {
125
+ const ticker = normalizeTicker(opts.ticker);
126
+ const days = opts.days ?? 30;
127
+ const annTypeFilter = opts.ann_types ?? null;
128
+ const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000);
129
+ const $ = await fetchListcorpPage(ticker);
130
+ let announcements = [];
131
+ let comments = [];
132
+ if ($) {
133
+ announcements = parseAnnouncements($, cutoff);
134
+ if (annTypeFilter && annTypeFilter.length > 0) {
135
+ const filterSet = new Set(annTypeFilter.map((t) => t.toUpperCase()));
136
+ announcements = announcements.filter((a) => a.ann_type !== null && filterSet.has(a.ann_type));
137
+ }
138
+ comments = parseComments($, announcements, cutoff);
139
+ }
140
+ const scores = comments.map((c) => c.sentiment_score);
141
+ const overall = scores.length > 0
142
+ ? round3(scores.reduce((a, b) => a + b, 0) / scores.length)
143
+ : 0;
144
+ return {
145
+ ticker,
146
+ scraped_at: isoNow(),
147
+ period_days: days,
148
+ announcements,
149
+ comments,
150
+ pre_lodgement_comments: comments.filter((c) => c.pre_lodgement_flag).length,
151
+ total_comments: comments.length,
152
+ overall_sentiment: overall,
153
+ };
154
+ }
155
+ export function sampleData(ticker) {
156
+ const t = normalizeTicker(ticker);
157
+ return {
158
+ ticker: t,
159
+ scraped_at: isoNow(),
160
+ period_days: 30,
161
+ announcements: [
162
+ {
163
+ title: "Appendix 4C - Quarterly Cashflow Report",
164
+ date: "2026-02-15",
165
+ ann_type: "4C",
166
+ url: `https://www.listcorp.com/asx/${t.toLowerCase()}/announcements/4c-report`,
167
+ is_price_sensitive: false,
168
+ },
169
+ {
170
+ title: "Appendix 3Y - Change of Director's Interest Notice",
171
+ date: "2026-02-10",
172
+ ann_type: "3Y",
173
+ url: `https://www.listcorp.com/asx/${t.toLowerCase()}/announcements/3y-notice`,
174
+ is_price_sensitive: true,
175
+ },
176
+ ],
177
+ comments: [
178
+ {
179
+ author: "eagleeye",
180
+ date: "2026-02-09",
181
+ text: "Something big is coming for this stock. Insider sources say announcement imminent.",
182
+ sentiment_score: 0.667,
183
+ sentiment_label: "bullish",
184
+ is_rumor: true,
185
+ pre_lodgement_flag: true,
186
+ related_announcement: "Appendix 3Y - Change of Director's Interest Notice",
187
+ },
188
+ {
189
+ author: "analyst42",
190
+ date: "2026-02-16",
191
+ text: "4C looks solid. Cash burn rate improving quarter over quarter.",
192
+ sentiment_score: 0.333,
193
+ sentiment_label: "bullish",
194
+ is_rumor: false,
195
+ pre_lodgement_flag: false,
196
+ related_announcement: null,
197
+ },
198
+ ],
199
+ pre_lodgement_comments: 1,
200
+ total_comments: 2,
201
+ overall_sentiment: 0.5,
202
+ };
203
+ }
204
+ //# sourceMappingURL=listcorp-scraper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listcorp-scraper.js","sourceRoot":"","sources":["../../src/investigation-tools/listcorp-scraper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * seeking-alpha-asx-scraper.ts — Seeking Alpha ASX Article & Comment Scraper
3
+ *
4
+ * Scrapes Seeking Alpha for articles and comments about ASX-listed
5
+ * companies. Extracts sentiment, rumor flags, and author credibility data.
6
+ *
7
+ * NOTE: Seeking Alpha uses bare US tickers (not .AX suffix).
8
+ * Dual-listed companies like BHP, RIO work directly. ASX-only tickers
9
+ * (e.g. MGU, S32) may not exist on SA or may use OTC ADR symbols.
10
+ * The scraper attempts bare ticker first, then common OTC suffixes.
11
+ *
12
+ * SA also employs aggressive bot protection (PerimeterX). Scraping may
13
+ * be blocked; the tool degrades gracefully and returns empty results
14
+ * with an appropriate warning.
15
+ */
16
+ export interface SeekingAlphaArticle {
17
+ article_id: string;
18
+ title: string;
19
+ date: string;
20
+ author: string;
21
+ summary: string;
22
+ sentiment_score: number;
23
+ sentiment_label: string;
24
+ is_rumor: boolean;
25
+ url: string;
26
+ comment_count: number;
27
+ }
28
+ export interface SeekingAlphaComment {
29
+ comment_id: string;
30
+ date: string;
31
+ author: string;
32
+ text: string;
33
+ sentiment_score: number;
34
+ sentiment_label: string;
35
+ is_rumor: boolean;
36
+ likes: number;
37
+ }
38
+ export interface SeekingAlphaResult {
39
+ ticker: string;
40
+ scraped_at: string;
41
+ period_days: number;
42
+ total_articles: number;
43
+ total_comments: number;
44
+ articles: SeekingAlphaArticle[];
45
+ comments: SeekingAlphaComment[];
46
+ overall_sentiment: number;
47
+ rumor_count: number;
48
+ }
49
+ export declare function scrapeSeekingAlphaAsx(opts: {
50
+ ticker: string;
51
+ days?: number;
52
+ pages?: number;
53
+ }): Promise<SeekingAlphaResult>;
54
+ export declare function sampleData(ticker: string): SeekingAlphaResult;
55
+ //# sourceMappingURL=seeking-alpha-asx-scraper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seeking-alpha-asx-scraper.d.ts","sourceRoot":"","sources":["../../src/investigation-tools/seeking-alpha-asx-scraper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA0BH,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAuJD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkD9B;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAiD7D"}