borsajs 0.1.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.
Files changed (109) hide show
  1. package/LICENSE +201 -0
  2. package/README.en.md +209 -0
  3. package/README.md +57 -0
  4. package/dist/cache.d.ts +24 -0
  5. package/dist/cache.d.ts.map +1 -0
  6. package/dist/cache.js +40 -0
  7. package/dist/cache.js.map +1 -0
  8. package/dist/crypto.d.ts +17 -0
  9. package/dist/crypto.d.ts.map +1 -0
  10. package/dist/crypto.js +25 -0
  11. package/dist/crypto.js.map +1 -0
  12. package/dist/exceptions.d.ts +34 -0
  13. package/dist/exceptions.d.ts.map +1 -0
  14. package/dist/exceptions.js +70 -0
  15. package/dist/exceptions.js.map +1 -0
  16. package/dist/fund.d.ts +28 -0
  17. package/dist/fund.d.ts.map +1 -0
  18. package/dist/fund.js +29 -0
  19. package/dist/fund.js.map +1 -0
  20. package/dist/fx.d.ts +16 -0
  21. package/dist/fx.d.ts.map +1 -0
  22. package/dist/fx.js +22 -0
  23. package/dist/fx.js.map +1 -0
  24. package/dist/index-class.d.ts +21 -0
  25. package/dist/index-class.d.ts.map +1 -0
  26. package/dist/index-class.js +31 -0
  27. package/dist/index-class.js.map +1 -0
  28. package/dist/index.d.ts +26 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +16 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/inflation.d.ts +12 -0
  33. package/dist/inflation.d.ts.map +1 -0
  34. package/dist/inflation.js +28 -0
  35. package/dist/inflation.js.map +1 -0
  36. package/dist/market.d.ts +7 -0
  37. package/dist/market.d.ts.map +1 -0
  38. package/dist/market.js +7 -0
  39. package/dist/market.js.map +1 -0
  40. package/dist/multi.d.ts +26 -0
  41. package/dist/multi.d.ts.map +1 -0
  42. package/dist/multi.js +46 -0
  43. package/dist/multi.js.map +1 -0
  44. package/dist/providers/base.d.ts +24 -0
  45. package/dist/providers/base.d.ts.map +1 -0
  46. package/dist/providers/base.js +28 -0
  47. package/dist/providers/base.js.map +1 -0
  48. package/dist/providers/btcturk.d.ts +43 -0
  49. package/dist/providers/btcturk.d.ts.map +1 -0
  50. package/dist/providers/btcturk.js +94 -0
  51. package/dist/providers/btcturk.js.map +1 -0
  52. package/dist/providers/dovizcom.d.ts +42 -0
  53. package/dist/providers/dovizcom.d.ts.map +1 -0
  54. package/dist/providers/dovizcom.js +105 -0
  55. package/dist/providers/dovizcom.js.map +1 -0
  56. package/dist/providers/index.d.ts +20 -0
  57. package/dist/providers/index.d.ts.map +1 -0
  58. package/dist/providers/index.js +12 -0
  59. package/dist/providers/index.js.map +1 -0
  60. package/dist/providers/kap.d.ts +37 -0
  61. package/dist/providers/kap.d.ts.map +1 -0
  62. package/dist/providers/kap.js +110 -0
  63. package/dist/providers/kap.js.map +1 -0
  64. package/dist/providers/paratic.d.ts +41 -0
  65. package/dist/providers/paratic.d.ts.map +1 -0
  66. package/dist/providers/paratic.js +85 -0
  67. package/dist/providers/paratic.js.map +1 -0
  68. package/dist/providers/tcmb.d.ts +49 -0
  69. package/dist/providers/tcmb.d.ts.map +1 -0
  70. package/dist/providers/tcmb.js +99 -0
  71. package/dist/providers/tcmb.js.map +1 -0
  72. package/dist/providers/tefas.d.ts +51 -0
  73. package/dist/providers/tefas.d.ts.map +1 -0
  74. package/dist/providers/tefas.js +89 -0
  75. package/dist/providers/tefas.js.map +1 -0
  76. package/dist/providers/viop.d.ts +35 -0
  77. package/dist/providers/viop.d.ts.map +1 -0
  78. package/dist/providers/viop.js +140 -0
  79. package/dist/providers/viop.js.map +1 -0
  80. package/dist/ticker.d.ts +18 -0
  81. package/dist/ticker.d.ts.map +1 -0
  82. package/dist/ticker.js +23 -0
  83. package/dist/ticker.js.map +1 -0
  84. package/dist/viop.d.ts +19 -0
  85. package/dist/viop.d.ts.map +1 -0
  86. package/dist/viop.js +31 -0
  87. package/dist/viop.js.map +1 -0
  88. package/package.json +52 -0
  89. package/src/cache.ts +42 -0
  90. package/src/crypto.ts +30 -0
  91. package/src/exceptions.ts +77 -0
  92. package/src/fund.ts +37 -0
  93. package/src/fx.ts +26 -0
  94. package/src/index-class.ts +39 -0
  95. package/src/index.ts +38 -0
  96. package/src/inflation.ts +31 -0
  97. package/src/market.ts +7 -0
  98. package/src/multi.ts +46 -0
  99. package/src/providers/base.ts +35 -0
  100. package/src/providers/btcturk.ts +100 -0
  101. package/src/providers/dovizcom.ts +98 -0
  102. package/src/providers/kap.ts +98 -0
  103. package/src/providers/paratic.ts +95 -0
  104. package/src/providers/tcmb.ts +96 -0
  105. package/src/providers/tefas.ts +85 -0
  106. package/src/ticker.ts +30 -0
  107. package/src/viop.ts +35 -0
  108. package/test/demo.ts +99 -0
  109. package/tsconfig.json +34 -0
@@ -0,0 +1,49 @@
1
+ import { BaseProvider, ProviderOptions } from './base.js';
2
+ export interface InflationLatest {
3
+ date: string;
4
+ yearMonth: string;
5
+ yearlyInflation: number;
6
+ monthlyInflation: number;
7
+ type: string;
8
+ }
9
+ export interface InflationData {
10
+ date: Date;
11
+ yearMonth: string;
12
+ yearlyInflation: number;
13
+ monthlyInflation: number;
14
+ }
15
+ export interface InflationCalculation {
16
+ startDate: string;
17
+ endDate: string;
18
+ initialValue: number;
19
+ finalValue: number;
20
+ totalYears: number;
21
+ totalMonths: number;
22
+ totalChange: number;
23
+ avgYearlyInflation: number;
24
+ startCpi: number;
25
+ endCpi: number;
26
+ }
27
+ export interface InflationDataOptions {
28
+ start?: string;
29
+ end?: string;
30
+ limit?: number;
31
+ }
32
+ export declare class TcmbProvider extends BaseProvider {
33
+ private static readonly BASE_URL;
34
+ private static readonly CALC_API_URL;
35
+ private static readonly INFLATION_PATHS;
36
+ constructor(options?: ProviderOptions);
37
+ getLatest(inflationType?: string): Promise<InflationLatest>;
38
+ getData(inflationType: string, options?: InflationDataOptions): Promise<InflationData[]>;
39
+ calculateInflation(options: {
40
+ startYear: number;
41
+ startMonth: number;
42
+ endYear: number;
43
+ endMonth: number;
44
+ basketValue: number;
45
+ }): Promise<InflationCalculation>;
46
+ private parseInflationTable;
47
+ }
48
+ export declare function getTcmbProvider(): TcmbProvider;
49
+ //# sourceMappingURL=tcmb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcmb.d.ts","sourceRoot":"","sources":["../../src/providers/tcmb.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAI1D,MAAM,WAAW,eAAe;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AACtI,MAAM,WAAW,aAAa;IAAG,IAAI,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;CAAE;AACpH,MAAM,WAAW,oBAAoB;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;CAAE;AACnP,MAAM,WAAW,oBAAoB;IAAG,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CAAE;AAIvF,qBAAa,YAAa,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAC7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAwD;IAC5F,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAA+M;gBAE1O,OAAO,CAAC,EAAE,eAAe;IAE/B,SAAS,CAAC,aAAa,GAAE,MAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAOnE,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAuB5F,kBAAkB,CAAC,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;KAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAgBpK,OAAO,CAAC,mBAAmB;CAwB9B;AAGD,wBAAgB,eAAe,IAAI,YAAY,CAAmE"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * TCMB provider for Turkish inflation data.
3
+ */
4
+ import * as cheerio from 'cheerio';
5
+ import { BaseProvider } from './base.js';
6
+ import { TTL } from '../cache.js';
7
+ import { APIError, DataNotAvailableError } from '../exceptions.js';
8
+ export class TcmbProvider extends BaseProvider {
9
+ static BASE_URL = 'https://www.tcmb.gov.tr';
10
+ static CALC_API_URL = 'https://appg.tcmb.gov.tr/KIMENFH/enflasyon/hesapla';
11
+ static INFLATION_PATHS = { tufe: '/wps/wcm/connect/tr/tcmb+tr/main+menu/istatistikler/enflasyon+verileri', ufe: '/wps/wcm/connect/TR/TCMB+TR/Main+Menu/Istatistikler/Enflasyon+Verileri/Uretici+Fiyatlari' };
12
+ constructor(options) { super(options); }
13
+ async getLatest(inflationType = 'tufe') {
14
+ const data = await this.getData(inflationType, { limit: 1 });
15
+ if (data.length === 0)
16
+ throw new DataNotAvailableError('No inflation data available');
17
+ const latest = data[0];
18
+ return { date: latest.date.toISOString().split('T')[0], yearMonth: latest.yearMonth, yearlyInflation: latest.yearlyInflation, monthlyInflation: latest.monthlyInflation, type: inflationType.toUpperCase() };
19
+ }
20
+ async getData(inflationType, options = {}) {
21
+ const { start, end, limit } = options;
22
+ const type = inflationType.toLowerCase();
23
+ if (!TcmbProvider.INFLATION_PATHS[type])
24
+ throw new Error(`Invalid type: ${type}. Use 'tufe' or 'ufe'`);
25
+ const cacheKey = `tcmb:data:${type}`;
26
+ let cached = this.cacheGet(cacheKey);
27
+ if (!cached) {
28
+ try {
29
+ const response = await this.get(TcmbProvider.BASE_URL + TcmbProvider.INFLATION_PATHS[type], { responseType: 'text', headers: { 'Accept': 'text/html', 'Accept-Language': 'tr-TR,tr;q=0.9' } });
30
+ cached = this.parseInflationTable(response.data);
31
+ this.cacheSet(cacheKey, cached, TTL.FX_RATES);
32
+ }
33
+ catch (error) {
34
+ throw new APIError(`Failed to fetch inflation data: ${error}`);
35
+ }
36
+ }
37
+ if (!cached?.length)
38
+ throw new DataNotAvailableError(`No data available for ${type}`);
39
+ let result = [...cached];
40
+ if (start)
41
+ result = result.filter(d => d.date >= new Date(start));
42
+ if (end)
43
+ result = result.filter(d => d.date <= new Date(end));
44
+ if (limit && limit > 0)
45
+ result = result.slice(0, limit);
46
+ return result;
47
+ }
48
+ async calculateInflation(options) {
49
+ const { startYear, startMonth, endYear, endMonth, basketValue } = options;
50
+ const cacheKey = `tcmb:calc:${startYear}-${startMonth}:${endYear}-${endMonth}:${basketValue}`;
51
+ const cached = this.cacheGet(cacheKey);
52
+ if (cached)
53
+ return cached;
54
+ try {
55
+ const response = await this.post(TcmbProvider.CALC_API_URL, { baslangicYil: String(startYear), baslangicAy: String(startMonth), bitisYil: String(endYear), bitisAy: String(endMonth), malSepeti: String(basketValue) }, { headers: { 'Accept': '*/*', 'Content-Type': 'application/json', 'Origin': 'https://herkesicin.tcmb.gov.tr', 'Referer': 'https://herkesicin.tcmb.gov.tr/' } });
56
+ const data = response.data;
57
+ const parseFloat = (v) => { const c = String(v || '').replace(/,/g, ''); const n = Number.parseFloat(c); return isNaN(n) ? 0 : n; };
58
+ const result = { startDate: `${startYear}-${String(startMonth).padStart(2, '0')}`, endDate: `${endYear}-${String(endMonth).padStart(2, '0')}`, initialValue: basketValue, finalValue: parseFloat(data?.yeniSepetDeger ?? ''), totalYears: data?.toplamYil ?? 0, totalMonths: data?.toplamAy ?? 0, totalChange: parseFloat(data?.toplamDegisim ?? ''), avgYearlyInflation: parseFloat(data?.ortalamaYillikEnflasyon ?? ''), startCpi: parseFloat(data?.ilkYilTufe ?? ''), endCpi: parseFloat(data?.sonYilTufe ?? '') };
59
+ this.cacheSet(cacheKey, result, TTL.INFLATION_DATA);
60
+ return result;
61
+ }
62
+ catch (error) {
63
+ throw new APIError(`Failed to calculate inflation: ${error}`);
64
+ }
65
+ }
66
+ parseInflationTable(html) {
67
+ const $ = cheerio.load(html);
68
+ const inflationData = [];
69
+ const tables = $('table').toArray();
70
+ for (const table of tables) {
71
+ const headerText = $(table).find('tr').first().text().toLowerCase();
72
+ if (!headerText.includes('tüfe') && !headerText.includes('üfe') && !headerText.includes('enflasyon') && !headerText.includes('yıllık'))
73
+ continue;
74
+ $(table).find('tr').slice(1).each((_, row) => {
75
+ const cells = $(row).find('td, th').map((_, c) => $(c).text().trim()).get();
76
+ if (cells.length < 3 || !cells[0])
77
+ return;
78
+ const [dateStr, yearlyStr, monthlyStr] = cells.length >= 5 ? [cells[0], cells[2], cells[4] || ''] : [cells[0], cells[1], cells[2]];
79
+ const match = dateStr.replace(/[.,]/g, '').match(/(\d{1,2})-(\d{4})/);
80
+ if (!match)
81
+ return;
82
+ const [, month, year] = match;
83
+ const date = new Date(parseInt(year), parseInt(month) - 1, 1);
84
+ const yearly = parseFloat(yearlyStr.replace('%', '').replace(',', '.').replace(/[^\d.-]/g, ''));
85
+ const monthly = parseFloat(monthlyStr.replace('%', '').replace(',', '.').replace(/[^\d.-]/g, '')) || 0;
86
+ if (!isNaN(yearly))
87
+ inflationData.push({ date, yearMonth: dateStr, yearlyInflation: yearly, monthlyInflation: monthly });
88
+ });
89
+ if (inflationData.length > 0)
90
+ break;
91
+ }
92
+ inflationData.sort((a, b) => b.date.getTime() - a.date.getTime());
93
+ return inflationData;
94
+ }
95
+ }
96
+ let provider = null;
97
+ export function getTcmbProvider() { if (!provider)
98
+ provider = new TcmbProvider(); return provider; }
99
+ //# sourceMappingURL=tcmb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcmb.js","sourceRoot":"","sources":["../../src/providers/tcmb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { BaseProvider, ProviderOptions } from './base.js';
2
+ export interface FundInfo {
3
+ fundCode: string;
4
+ name: string;
5
+ date: string;
6
+ price: number;
7
+ fundSize: number;
8
+ investorCount: number;
9
+ founder?: string;
10
+ manager?: string;
11
+ fundType?: string;
12
+ category?: string;
13
+ riskValue?: number;
14
+ dailyReturn?: number;
15
+ return1m?: number;
16
+ return3m?: number;
17
+ return6m?: number;
18
+ returnYtd?: number;
19
+ return1y?: number;
20
+ return3y?: number;
21
+ return5y?: number;
22
+ }
23
+ export interface FundHistoryData {
24
+ date: Date;
25
+ price: number;
26
+ fundSize: number;
27
+ investors: number;
28
+ }
29
+ export interface HistoryOptions {
30
+ period?: string;
31
+ start?: Date;
32
+ end?: Date;
33
+ }
34
+ export interface SearchResult {
35
+ fundCode: string;
36
+ name: string;
37
+ fundType?: string;
38
+ return1y?: number;
39
+ }
40
+ export declare class TefasProvider extends BaseProvider {
41
+ private static readonly BASE_URL;
42
+ private static readonly PERIOD_DAYS;
43
+ private unsafeClient;
44
+ constructor(options?: ProviderOptions);
45
+ private formatDate;
46
+ getFundDetail(fundCode: string): Promise<FundInfo>;
47
+ getHistory(fundCode: string, options?: HistoryOptions): Promise<FundHistoryData[]>;
48
+ search(query: string, limit?: number): Promise<SearchResult[]>;
49
+ }
50
+ export declare function getTefasProvider(): TefasProvider;
51
+ //# sourceMappingURL=tefas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tefas.d.ts","sourceRoot":"","sources":["../../src/providers/tefas.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAI1D,MAAM,WAAW,QAAQ;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAAE;AAC7X,MAAM,WAAW,eAAe;IAAG,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;CAAE;AACpG,MAAM,WAAW,cAAc;IAAG,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAC;CAAE;AAC9E,MAAM,WAAW,YAAY;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAAE;AAMvG,qBAAa,aAAc,SAAQ,YAAY;IAC3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IACrE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAA6F;IAChI,OAAO,CAAC,YAAY,CAAgB;gBAExB,OAAO,CAAC,EAAE,eAAe;IAKrC,OAAO,CAAC,UAAU;IAEZ,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAiBlD,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAqBtF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAa3E;AAGD,wBAAgB,gBAAgB,IAAI,aAAa,CAAoE"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * TEFAS provider for mutual fund data.
3
+ */
4
+ import axios from 'axios';
5
+ import https from 'https';
6
+ import { BaseProvider } from './base.js';
7
+ import { TTL } from '../cache.js';
8
+ import { APIError, DataNotAvailableError } from '../exceptions.js';
9
+ export class TefasProvider extends BaseProvider {
10
+ static BASE_URL = 'https://www.tefas.gov.tr/api/DB';
11
+ static PERIOD_DAYS = { '1d': 1, '5d': 5, '1mo': 30, '3mo': 90, '6mo': 180, '1y': 365 };
12
+ unsafeClient;
13
+ constructor(options) {
14
+ super(options);
15
+ this.unsafeClient = axios.create({ timeout: 30000, httpsAgent: new https.Agent({ rejectUnauthorized: false }), headers: { 'User-Agent': 'Mozilla/5.0' } });
16
+ }
17
+ formatDate(date) { return `${String(date.getDate()).padStart(2, '0')}.${String(date.getMonth() + 1).padStart(2, '0')}.${date.getFullYear()}`; }
18
+ async getFundDetail(fundCode) {
19
+ fundCode = fundCode.toUpperCase();
20
+ const cacheKey = `tefas:detail:${fundCode}`;
21
+ const cached = this.cacheGet(cacheKey);
22
+ if (cached)
23
+ return cached;
24
+ try {
25
+ const response = await this.unsafeClient.post(`${TefasProvider.BASE_URL}/GetAllFundAnalyzeData`, new URLSearchParams({ dil: 'TR', fonkod: fundCode }).toString(), { headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' } });
26
+ const data = response.data;
27
+ if (!data?.fundInfo?.length)
28
+ throw new DataNotAvailableError(`No data for fund: ${fundCode}`);
29
+ const fi = data.fundInfo[0];
30
+ const fr = data.fundReturn?.[0] ?? {};
31
+ const result = { fundCode, name: fi.FONUNVAN ?? '', date: fi.TARIH ?? '', price: Number(fi.SONFIYAT) || 0, fundSize: Number(fi.PORTBUYUKLUK) || 0, investorCount: Number(fi.YATIRIMCISAYI) || 0, founder: fi.KURUCU, manager: fi.YONETICI, fundType: fi.FONTUR, category: fi.FONKATEGORI, riskValue: fi.RISKDEGERI, dailyReturn: fi.GUNLUKGETIRI, return1m: fr.GETIRI1A, return3m: fr.GETIRI3A, return6m: fr.GETIRI6A, returnYtd: fr.GETIRIYB, return1y: fr.GETIRI1Y, return3y: fr.GETIRI3Y, return5y: fr.GETIRI5Y };
32
+ this.cacheSet(cacheKey, result, TTL.FUND_DATA);
33
+ return result;
34
+ }
35
+ catch (error) {
36
+ if (error instanceof DataNotAvailableError)
37
+ throw error;
38
+ throw new APIError(`Failed to fetch fund detail for ${fundCode}: ${error}`);
39
+ }
40
+ }
41
+ async getHistory(fundCode, options = {}) {
42
+ fundCode = fundCode.toUpperCase();
43
+ const { period = '1mo', start, end } = options;
44
+ const endDt = end ?? new Date();
45
+ const startDt = start ?? new Date(endDt.getTime() - (TefasProvider.PERIOD_DAYS[period] ?? 30) * 24 * 60 * 60 * 1000);
46
+ const cacheKey = `tefas:history:${fundCode}:${startDt.toISOString()}:${endDt.toISOString()}`;
47
+ const cached = this.cacheGet(cacheKey);
48
+ if (cached)
49
+ return cached;
50
+ try {
51
+ const formData = new URLSearchParams({ fontip: 'YAT', sfontur: '', fonkod: fundCode, fongrup: '', bastarih: this.formatDate(startDt), bittarih: this.formatDate(endDt), fonturkod: '', fonunvantip: '', kurucukod: '' });
52
+ const response = await this.unsafeClient.post(`${TefasProvider.BASE_URL}/BindHistoryInfo`, formData.toString(), { headers: { 'Accept': 'application/json', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Origin': 'https://www.tefas.gov.tr', 'X-Requested-With': 'XMLHttpRequest' } });
53
+ const data = response.data?.data;
54
+ if (!data?.length)
55
+ throw new DataNotAvailableError(`No history for fund: ${fundCode}`);
56
+ const records = data.filter(i => i.TARIH && i.TARIH > 0).map(i => ({ date: new Date(i.TARIH), price: Number(i.FIYAT) || 0, fundSize: Number(i.PORTFOYBUYUKLUK) || 0, investors: Number(i.KISISAYISI) || 0 }));
57
+ records.sort((a, b) => a.date.getTime() - b.date.getTime());
58
+ this.cacheSet(cacheKey, records, TTL.FUND_DATA);
59
+ return records;
60
+ }
61
+ catch (error) {
62
+ if (error instanceof DataNotAvailableError)
63
+ throw error;
64
+ throw new APIError(`Failed to fetch history for ${fundCode}: ${error}`);
65
+ }
66
+ }
67
+ async search(query, limit = 20) {
68
+ const cacheKey = `tefas:search:${query}:${limit}`;
69
+ const cached = this.cacheGet(cacheKey);
70
+ if (cached)
71
+ return cached;
72
+ try {
73
+ const formData = new URLSearchParams({ calismatipi: '2', fontip: 'YAT', sfontur: 'Tümü', kurucukod: '', fongrup: '', bastarih: 'Başlangıç', bittarih: 'Bitiş', fonturkod: '', fonunvantip: '', strperiod: '1,1,1,1,1,1,1', islemdurum: '1' });
74
+ const response = await this.unsafeClient.post(`${TefasProvider.BASE_URL}/BindComparisonFundReturns`, formData.toString(), { headers: { 'Accept': 'application/json', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'X-Requested-With': 'XMLHttpRequest' } });
75
+ const allFunds = response.data?.data ?? [];
76
+ const queryLower = query.toLowerCase();
77
+ const matching = allFunds.filter(f => (f.FONKODU ?? '').toLowerCase().includes(queryLower) || (f.FONUNVAN ?? '').toLowerCase().includes(queryLower)).slice(0, limit).map(f => ({ fundCode: f.FONKODU ?? '', name: f.FONUNVAN ?? '', fundType: f.FONTURACIKLAMA, return1y: f.GETIRI1Y }));
78
+ this.cacheSet(cacheKey, matching, TTL.FUND_DATA);
79
+ return matching;
80
+ }
81
+ catch {
82
+ return [];
83
+ }
84
+ }
85
+ }
86
+ let provider = null;
87
+ export function getTefasProvider() { if (!provider)
88
+ provider = new TefasProvider(); return provider; }
89
+ //# sourceMappingURL=tefas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tefas.js","sourceRoot":"","sources":["../../src/providers/tefas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * VİOP provider for Turkish derivatives market data.
3
+ */
4
+ import { BaseProvider, ProviderOptions } from './base.js';
5
+ export interface ContractData {
6
+ code: string;
7
+ contract: string;
8
+ price: number;
9
+ change: number;
10
+ volumeTl: number;
11
+ volumeQty: number;
12
+ category: string;
13
+ }
14
+ export type ContractCategory = 'all' | 'stock' | 'index' | 'currency' | 'commodity';
15
+ /**
16
+ * Provider for VİOP (derivatives market) data from İş Yatırım.
17
+ */
18
+ export declare class ViopProvider extends BaseProvider {
19
+ private static readonly BASE_URL;
20
+ constructor(options?: ProviderOptions);
21
+ /**
22
+ * Get futures contracts.
23
+ */
24
+ getFutures(category?: ContractCategory): Promise<ContractData[]>;
25
+ /**
26
+ * Get options contracts.
27
+ */
28
+ getOptions(category?: 'all' | 'stock' | 'index'): Promise<ContractData[]>;
29
+ private parseNumber;
30
+ }
31
+ /**
32
+ * Get singleton provider instance.
33
+ */
34
+ export declare function getViopProvider(): ViopProvider;
35
+ //# sourceMappingURL=viop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viop.d.ts","sourceRoot":"","sources":["../../src/providers/viop.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAI1D,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,CAAC;AAEpF;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAuE;gBAE3F,OAAO,CAAC,EAAE,eAAe;IAIrC;;OAEG;IACG,UAAU,CAAC,QAAQ,GAAE,gBAAwB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA0D7E;;OAEG;IACG,UAAU,CAAC,QAAQ,GAAE,KAAK,GAAG,OAAO,GAAG,OAAe,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAsDtF,OAAO,CAAC,WAAW;CAQtB;AAKD;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAK9C"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * VİOP provider for Turkish derivatives market data.
3
+ */
4
+ import * as cheerio from 'cheerio';
5
+ import { BaseProvider } from './base.js';
6
+ import { TTL } from '../cache.js';
7
+ import { APIError } from '../exceptions.js';
8
+ /**
9
+ * Provider for VİOP (derivatives market) data from İş Yatırım.
10
+ */
11
+ export class ViopProvider extends BaseProvider {
12
+ static BASE_URL = 'https://www.isyatirim.com.tr/tr-tr/analiz/Sayfalar/viop-akis.aspx';
13
+ constructor(options) {
14
+ super(options);
15
+ }
16
+ /**
17
+ * Get futures contracts.
18
+ */
19
+ async getFutures(category = 'all') {
20
+ const cacheKey = `viop:futures:${category}`;
21
+ const cached = this.cacheGet(cacheKey);
22
+ if (cached) {
23
+ return cached;
24
+ }
25
+ try {
26
+ const response = await this.get(ViopProvider.BASE_URL, {
27
+ responseType: 'text',
28
+ });
29
+ const html = response.data;
30
+ const $ = cheerio.load(html);
31
+ const contracts = [];
32
+ // Parse futures table
33
+ $('table.dataTable tbody tr').each((_, row) => {
34
+ const cells = $(row).find('td');
35
+ if (cells.length < 6)
36
+ return;
37
+ const code = $(cells[0]).text().trim();
38
+ const contract = $(cells[1]).text().trim();
39
+ // Determine category from code
40
+ let contractCategory = 'stock';
41
+ if (code.includes('XU') || code.includes('XLBNK')) {
42
+ contractCategory = 'index';
43
+ }
44
+ else if (code.includes('USD') || code.includes('EUR')) {
45
+ contractCategory = 'currency';
46
+ }
47
+ else if (code.includes('GAU') || code.includes('XAU')) {
48
+ contractCategory = 'commodity';
49
+ }
50
+ // Filter by category
51
+ if (category !== 'all' && contractCategory !== category) {
52
+ return;
53
+ }
54
+ contracts.push({
55
+ code,
56
+ contract,
57
+ price: this.parseNumber($(cells[2]).text()),
58
+ change: this.parseNumber($(cells[3]).text()),
59
+ volumeTl: this.parseNumber($(cells[4]).text()),
60
+ volumeQty: this.parseNumber($(cells[5]).text()),
61
+ category: contractCategory,
62
+ });
63
+ });
64
+ this.cacheSet(cacheKey, contracts, TTL.VIOP);
65
+ return contracts;
66
+ }
67
+ catch (error) {
68
+ throw new APIError(`Failed to fetch futures: ${error}`);
69
+ }
70
+ }
71
+ /**
72
+ * Get options contracts.
73
+ */
74
+ async getOptions(category = 'all') {
75
+ const cacheKey = `viop:options:${category}`;
76
+ const cached = this.cacheGet(cacheKey);
77
+ if (cached) {
78
+ return cached;
79
+ }
80
+ try {
81
+ const response = await this.get(ViopProvider.BASE_URL, {
82
+ responseType: 'text',
83
+ });
84
+ const html = response.data;
85
+ const $ = cheerio.load(html);
86
+ const contracts = [];
87
+ // Parse options table (similar structure)
88
+ $('table.optionsTable tbody tr').each((_, row) => {
89
+ const cells = $(row).find('td');
90
+ if (cells.length < 6)
91
+ return;
92
+ const code = $(cells[0]).text().trim();
93
+ const contract = $(cells[1]).text().trim();
94
+ // Determine category from code
95
+ let contractCategory = 'stock';
96
+ if (code.includes('XU') || code.includes('XLBNK')) {
97
+ contractCategory = 'index';
98
+ }
99
+ // Filter by category
100
+ if (category !== 'all' && contractCategory !== category) {
101
+ return;
102
+ }
103
+ contracts.push({
104
+ code,
105
+ contract,
106
+ price: this.parseNumber($(cells[2]).text()),
107
+ change: this.parseNumber($(cells[3]).text()),
108
+ volumeTl: this.parseNumber($(cells[4]).text()),
109
+ volumeQty: this.parseNumber($(cells[5]).text()),
110
+ category: contractCategory,
111
+ });
112
+ });
113
+ this.cacheSet(cacheKey, contracts, TTL.VIOP);
114
+ return contracts;
115
+ }
116
+ catch (error) {
117
+ throw new APIError(`Failed to fetch options: ${error}`);
118
+ }
119
+ }
120
+ parseNumber(text) {
121
+ // Remove thousands separator and convert decimal separator
122
+ const cleaned = text
123
+ .replace(/\./g, '')
124
+ .replace(',', '.')
125
+ .replace(/[^\d.-]/g, '');
126
+ return parseFloat(cleaned) || 0;
127
+ }
128
+ }
129
+ // Singleton instance
130
+ let provider = null;
131
+ /**
132
+ * Get singleton provider instance.
133
+ */
134
+ export function getViopProvider() {
135
+ if (!provider) {
136
+ provider = new ViopProvider();
137
+ }
138
+ return provider;
139
+ }
140
+ //# sourceMappingURL=viop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viop.js","sourceRoot":"","sources":["../../src/providers/viop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Ticker class for stock data.
3
+ */
4
+ import { QuoteData, OHLCVData, HistoryOptions } from './providers/paratic.js';
5
+ export interface TickerInfo extends QuoteData {
6
+ type: 'stock';
7
+ }
8
+ export declare class Ticker {
9
+ private readonly _symbol;
10
+ private _infoCache;
11
+ constructor(symbol: string);
12
+ get symbol(): string;
13
+ getInfo(): Promise<TickerInfo>;
14
+ getFastInfo(): Promise<TickerInfo>;
15
+ getHistory(options?: HistoryOptions): Promise<OHLCVData[]>;
16
+ toString(): string;
17
+ }
18
+ //# sourceMappingURL=ticker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticker.d.ts","sourceRoot":"","sources":["../src/ticker.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAsB,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAElG,MAAM,WAAW,UAAW,SAAQ,SAAS;IAAG,IAAI,EAAE,OAAO,CAAC;CAAE;AAEhE,qBAAa,MAAM;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,UAAU,CAA2B;gBAEjC,MAAM,EAAE,MAAM;IAC1B,IAAI,MAAM,IAAI,MAAM,CAAyB;IAEvC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;IAQ9B,WAAW,IAAI,OAAO,CAAC,UAAU,CAAC;IAElC,UAAU,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAIpE,QAAQ,IAAI,MAAM;CACrB"}
package/dist/ticker.js ADDED
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Ticker class for stock data.
3
+ */
4
+ import { getParaticProvider } from './providers/paratic.js';
5
+ export class Ticker {
6
+ _symbol;
7
+ _infoCache = null;
8
+ constructor(symbol) { this._symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', ''); }
9
+ get symbol() { return this._symbol; }
10
+ async getInfo() {
11
+ if (!this._infoCache) {
12
+ const quote = await getParaticProvider().getQuote(this._symbol);
13
+ this._infoCache = { ...quote, type: 'stock' };
14
+ }
15
+ return this._infoCache;
16
+ }
17
+ async getFastInfo() { return this.getInfo(); }
18
+ async getHistory(options = {}) {
19
+ return getParaticProvider().getHistory(this._symbol, options);
20
+ }
21
+ toString() { return `Ticker('${this._symbol}')`; }
22
+ }
23
+ //# sourceMappingURL=ticker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticker.js","sourceRoot":"","sources":["../src/ticker.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,kBAAkB,EAAwC,MAAM,wBAAwB,CAAC;AAIlG,MAAM,OAAO,MAAM;IACE,OAAO,CAAS;IACzB,UAAU,GAAsB,IAAI,CAAC;IAE7C,YAAY,MAAc,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACzG,IAAI,MAAM,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAE7C,KAAK,CAAC,OAAO;QACT,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,MAAM,kBAAkB,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChE,IAAI,CAAC,UAAU,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,WAAW,KAA0B,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAEnE,KAAK,CAAC,UAAU,CAAC,UAA0B,EAAE;QACzC,OAAO,kBAAkB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,QAAQ,KAAa,OAAO,WAAW,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;CAC7D"}
package/dist/viop.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * VIOP class for Turkish derivatives market data.
3
+ */
4
+ import { ContractData } from './providers/kap.js';
5
+ export declare class VIOP {
6
+ private _futuresCache;
7
+ private _optionsCache;
8
+ getFutures(): Promise<ContractData[]>;
9
+ getStockFutures(): Promise<ContractData[]>;
10
+ getIndexFutures(): Promise<ContractData[]>;
11
+ getCurrencyFutures(): Promise<ContractData[]>;
12
+ getCommodityFutures(): Promise<ContractData[]>;
13
+ getOptions(): Promise<ContractData[]>;
14
+ getStockOptions(): Promise<ContractData[]>;
15
+ getIndexOptions(): Promise<ContractData[]>;
16
+ getBySymbol(symbol: string): Promise<ContractData[]>;
17
+ toString(): string;
18
+ }
19
+ //# sourceMappingURL=viop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viop.d.ts","sourceRoot":"","sources":["../src/viop.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAmB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEnE,qBAAa,IAAI;IACb,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,aAAa,CAA+B;IAE9C,UAAU,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAKrC,eAAe,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAC1C,eAAe,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAC1C,kBAAkB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAC7C,mBAAmB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAE9C,UAAU,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAKrC,eAAe,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAC1C,eAAe,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAE1C,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAM1D,QAAQ,IAAI,MAAM;CACrB"}
package/dist/viop.js ADDED
@@ -0,0 +1,31 @@
1
+ /**
2
+ * VIOP class for Turkish derivatives market data.
3
+ */
4
+ import { getViopProvider } from './providers/kap.js';
5
+ export class VIOP {
6
+ _futuresCache = null;
7
+ _optionsCache = null;
8
+ async getFutures() {
9
+ if (!this._futuresCache)
10
+ this._futuresCache = await getViopProvider().getFutures('all');
11
+ return this._futuresCache;
12
+ }
13
+ async getStockFutures() { return getViopProvider().getFutures('stock'); }
14
+ async getIndexFutures() { return getViopProvider().getFutures('index'); }
15
+ async getCurrencyFutures() { return getViopProvider().getFutures('currency'); }
16
+ async getCommodityFutures() { return getViopProvider().getFutures('commodity'); }
17
+ async getOptions() {
18
+ if (!this._optionsCache)
19
+ this._optionsCache = await getViopProvider().getOptions('all');
20
+ return this._optionsCache;
21
+ }
22
+ async getStockOptions() { return getViopProvider().getOptions('stock'); }
23
+ async getIndexOptions() { return getViopProvider().getOptions('index'); }
24
+ async getBySymbol(symbol) {
25
+ symbol = symbol.toUpperCase();
26
+ const [futures, options] = await Promise.all([this.getFutures(), this.getOptions()]);
27
+ return [...futures, ...options].filter(i => i.contract.toUpperCase().includes(symbol) || i.code.toUpperCase().includes(symbol));
28
+ }
29
+ toString() { return 'VIOP()'; }
30
+ }
31
+ //# sourceMappingURL=viop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viop.js","sourceRoot":"","sources":["../src/viop.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,eAAe,EAAgB,MAAM,oBAAoB,CAAC;AAEnE,MAAM,OAAO,IAAI;IACL,aAAa,GAA0B,IAAI,CAAC;IAC5C,aAAa,GAA0B,IAAI,CAAC;IAEpD,KAAK,CAAC,UAAU;QACZ,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,aAAa,GAAG,MAAM,eAAe,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACxF,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,eAAe,KAA8B,OAAO,eAAe,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClG,KAAK,CAAC,eAAe,KAA8B,OAAO,eAAe,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClG,KAAK,CAAC,kBAAkB,KAA8B,OAAO,eAAe,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACxG,KAAK,CAAC,mBAAmB,KAA8B,OAAO,eAAe,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAE1G,KAAK,CAAC,UAAU;QACZ,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,aAAa,GAAG,MAAM,eAAe,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACxF,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,eAAe,KAA8B,OAAO,eAAe,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClG,KAAK,CAAC,eAAe,KAA8B,OAAO,eAAe,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAElG,KAAK,CAAC,WAAW,CAAC,MAAc;QAC5B,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACpI,CAAC;IAED,QAAQ,KAAa,OAAO,QAAQ,CAAC,CAAC,CAAC;CAC1C"}