@cyanheads/whois-mcp-server 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +349 -0
- package/CLAUDE.md +349 -0
- package/Dockerfile +99 -0
- package/LICENSE +201 -0
- package/README.md +316 -0
- package/changelog/0.1.x/0.1.1.md +32 -0
- package/changelog/template.md +127 -0
- package/dist/config/server-config.d.ts +16 -0
- package/dist/config/server-config.d.ts.map +1 -0
- package/dist/config/server-config.js +30 -0
- package/dist/config/server-config.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/tools/definitions/_fqdn.d.ts +7 -0
- package/dist/mcp-server/tools/definitions/_fqdn.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/_fqdn.js +18 -0
- package/dist/mcp-server/tools/definitions/_fqdn.js.map +1 -0
- package/dist/mcp-server/tools/definitions/whois-check-availability.tool.d.ts +26 -0
- package/dist/mcp-server/tools/definitions/whois-check-availability.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/whois-check-availability.tool.js +102 -0
- package/dist/mcp-server/tools/definitions/whois-check-availability.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/whois-get-dns.tool.d.ts +49 -0
- package/dist/mcp-server/tools/definitions/whois-get-dns.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/whois-get-dns.tool.js +97 -0
- package/dist/mcp-server/tools/definitions/whois-get-dns.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/whois-get-dossier.tool.d.ts +41 -0
- package/dist/mcp-server/tools/definitions/whois-get-dossier.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/whois-get-dossier.tool.js +332 -0
- package/dist/mcp-server/tools/definitions/whois-get-dossier.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/whois-lookup-asn.tool.d.ts +30 -0
- package/dist/mcp-server/tools/definitions/whois-lookup-asn.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/whois-lookup-asn.tool.js +83 -0
- package/dist/mcp-server/tools/definitions/whois-lookup-asn.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/whois-lookup-domain.tool.d.ts +40 -0
- package/dist/mcp-server/tools/definitions/whois-lookup-domain.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/whois-lookup-domain.tool.js +124 -0
- package/dist/mcp-server/tools/definitions/whois-lookup-domain.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/whois-lookup-ip.tool.d.ts +39 -0
- package/dist/mcp-server/tools/definitions/whois-lookup-ip.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/whois-lookup-ip.tool.js +111 -0
- package/dist/mcp-server/tools/definitions/whois-lookup-ip.tool.js.map +1 -0
- package/dist/services/doh/doh-service.d.ts +30 -0
- package/dist/services/doh/doh-service.d.ts.map +1 -0
- package/dist/services/doh/doh-service.js +114 -0
- package/dist/services/doh/doh-service.js.map +1 -0
- package/dist/services/doh/types.d.ts +45 -0
- package/dist/services/doh/types.d.ts.map +1 -0
- package/dist/services/doh/types.js +17 -0
- package/dist/services/doh/types.js.map +1 -0
- package/dist/services/rdap/rdap-service.d.ts +54 -0
- package/dist/services/rdap/rdap-service.d.ts.map +1 -0
- package/dist/services/rdap/rdap-service.js +609 -0
- package/dist/services/rdap/rdap-service.js.map +1 -0
- package/dist/services/rdap/types.d.ts +140 -0
- package/dist/services/rdap/types.d.ts.map +1 -0
- package/dist/services/rdap/types.js +6 -0
- package/dist/services/rdap/types.js.map +1 -0
- package/package.json +103 -0
- package/server.json +161 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview DNS-over-HTTPS service — Cloudflare primary (1.1.1.1), Google fallback (8.8.8.8).
|
|
3
|
+
* CAA records always use Google DoH because Cloudflare returns raw hex wire format for them.
|
|
4
|
+
* @module services/doh/doh-service
|
|
5
|
+
*/
|
|
6
|
+
import { fetchWithTimeout, withRetry } from '@cyanheads/mcp-ts-core/utils';
|
|
7
|
+
import { getServerConfig } from '../../config/server-config.js';
|
|
8
|
+
import { DNS_TYPE_NUMBERS } from './types.js';
|
|
9
|
+
const CLOUDFLARE_DOH = 'https://cloudflare-dns.com/dns-query';
|
|
10
|
+
const GOOGLE_DOH = 'https://dns.google/resolve';
|
|
11
|
+
/** Map numeric type to DnsRecordType string */
|
|
12
|
+
const TYPE_NUM_TO_NAME = Object.fromEntries(Object.entries(DNS_TYPE_NUMBERS).map(([k, v]) => [v, k]));
|
|
13
|
+
export class DohService {
|
|
14
|
+
/** Fetch DNS records for one type from a single DoH endpoint */
|
|
15
|
+
fetchSingleType(domain, type, baseUrl, timeoutMs, ctx, source) {
|
|
16
|
+
const url = `${baseUrl}?name=${encodeURIComponent(domain)}&type=${encodeURIComponent(type)}`;
|
|
17
|
+
const reqCtx = { requestId: ctx.requestId, tenantId: ctx.tenantId, timestamp: ctx.timestamp };
|
|
18
|
+
return withRetry(async () => {
|
|
19
|
+
const response = await fetchWithTimeout(url, timeoutMs, reqCtx, {
|
|
20
|
+
headers: {
|
|
21
|
+
Accept: 'application/dns-json',
|
|
22
|
+
},
|
|
23
|
+
signal: ctx.signal,
|
|
24
|
+
});
|
|
25
|
+
return response.json();
|
|
26
|
+
}, {
|
|
27
|
+
operation: `doh.fetchSingleType.${source}`,
|
|
28
|
+
context: reqCtx,
|
|
29
|
+
maxRetries: getServerConfig().dohMaxRetries,
|
|
30
|
+
baseDelayMs: 500,
|
|
31
|
+
signal: ctx.signal,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Look up one or more DNS record types for a domain.
|
|
36
|
+
* CAA always uses Google DoH (Cloudflare returns raw hex).
|
|
37
|
+
* Falls back to Google if Cloudflare fails for any type.
|
|
38
|
+
* Returns `nxdomain: true` when NXDOMAIN (Status 3) is returned.
|
|
39
|
+
*/
|
|
40
|
+
async lookup(domain, types, ctx) {
|
|
41
|
+
const config = getServerConfig();
|
|
42
|
+
const records = [];
|
|
43
|
+
let nxdomain = false;
|
|
44
|
+
// Track actual resolvers used: cloudflare = at least one non-CAA type used Cloudflare primary;
|
|
45
|
+
// google = all types used Google (either CAA-primary or Cloudflare-fallback)
|
|
46
|
+
let usedCloudflare = false;
|
|
47
|
+
await Promise.all(types.map(async (type) => {
|
|
48
|
+
// CAA always via Google; everything else Cloudflare first
|
|
49
|
+
const primaryUrl = type === 'CAA' ? GOOGLE_DOH : CLOUDFLARE_DOH;
|
|
50
|
+
const primarySource = type === 'CAA' ? 'google' : 'cloudflare';
|
|
51
|
+
let resp;
|
|
52
|
+
try {
|
|
53
|
+
resp = await this.fetchSingleType(domain, type, primaryUrl, config.dohTimeoutMs, ctx, primarySource);
|
|
54
|
+
// Only count as cloudflare when we successfully used Cloudflare (not CAA)
|
|
55
|
+
if (type !== 'CAA')
|
|
56
|
+
usedCloudflare = true;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Fallback to Google for non-CAA types
|
|
60
|
+
resp = await this.fetchSingleType(domain, type, GOOGLE_DOH, config.dohTimeoutMs, ctx, 'google');
|
|
61
|
+
}
|
|
62
|
+
if (resp.Status === 3) {
|
|
63
|
+
// NXDOMAIN — domain does not exist in DNS
|
|
64
|
+
nxdomain = true;
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
for (const answer of resp.Answer ?? []) {
|
|
68
|
+
const typeName = TYPE_NUM_TO_NAME[answer.type];
|
|
69
|
+
if (!typeName)
|
|
70
|
+
continue; // unknown numeric type — skip
|
|
71
|
+
records.push({
|
|
72
|
+
type: typeName,
|
|
73
|
+
name: answer.name,
|
|
74
|
+
ttl: answer.TTL,
|
|
75
|
+
data: answer.data,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}));
|
|
79
|
+
const source = usedCloudflare ? 'cloudflare' : 'google';
|
|
80
|
+
return { domain, nxdomain, records, source };
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Perform a reverse DNS (PTR) lookup for an IP address.
|
|
84
|
+
* IPv4: reverses octets + .in-addr.arpa
|
|
85
|
+
* IPv6: reverses nibbles + .ip6.arpa
|
|
86
|
+
* Returns null if the PTR lookup fails or returns no answer.
|
|
87
|
+
*/
|
|
88
|
+
async ptrLookup(ptrName, ctx) {
|
|
89
|
+
try {
|
|
90
|
+
const result = await this.lookup(ptrName, ['PTR'], ctx);
|
|
91
|
+
if (result.nxdomain || result.records.length === 0)
|
|
92
|
+
return null;
|
|
93
|
+
const first = result.records[0];
|
|
94
|
+
if (!first)
|
|
95
|
+
return null;
|
|
96
|
+
return first.data.replace(/\.$/, '') || null;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// ─── Init/accessor pattern ────────────────────────────────────────────────────
|
|
104
|
+
let _service;
|
|
105
|
+
export function initDohService(_config, _storage) {
|
|
106
|
+
_service = new DohService();
|
|
107
|
+
}
|
|
108
|
+
export function getDohService() {
|
|
109
|
+
if (!_service) {
|
|
110
|
+
throw new Error('DohService not initialized — call initDohService() in setup()');
|
|
111
|
+
}
|
|
112
|
+
return _service;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=doh-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doh-service.js","sourceRoot":"","sources":["../../../src/services/doh/doh-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview DNS-over-HTTPS service types — raw upstream and normalized shapes.
|
|
3
|
+
* @module services/doh/types
|
|
4
|
+
*/
|
|
5
|
+
/** DNS record types supported by the server */
|
|
6
|
+
export type DnsRecordType = 'A' | 'AAAA' | 'MX' | 'TXT' | 'NS' | 'CNAME' | 'SOA' | 'CAA' | 'PTR';
|
|
7
|
+
/** DNS type numeric codes */
|
|
8
|
+
export declare const DNS_TYPE_NUMBERS: Record<DnsRecordType, number>;
|
|
9
|
+
/** Raw DNS answer from DoH JSON API */
|
|
10
|
+
export interface DohAnswer {
|
|
11
|
+
data: string;
|
|
12
|
+
name: string;
|
|
13
|
+
TTL: number;
|
|
14
|
+
type: number;
|
|
15
|
+
}
|
|
16
|
+
/** Raw DoH JSON response */
|
|
17
|
+
export interface DohResponse {
|
|
18
|
+
AD?: boolean;
|
|
19
|
+
Answer?: DohAnswer[];
|
|
20
|
+
Authority?: DohAnswer[];
|
|
21
|
+
CD?: boolean;
|
|
22
|
+
Question?: Array<{
|
|
23
|
+
name: string;
|
|
24
|
+
type: number;
|
|
25
|
+
}>;
|
|
26
|
+
RA?: boolean;
|
|
27
|
+
RD?: boolean;
|
|
28
|
+
Status: number;
|
|
29
|
+
TC?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/** A single normalized DNS record */
|
|
32
|
+
export interface NormalizedDnsRecord {
|
|
33
|
+
data: string;
|
|
34
|
+
name: string;
|
|
35
|
+
ttl: number;
|
|
36
|
+
type: DnsRecordType;
|
|
37
|
+
}
|
|
38
|
+
/** Result of a multi-type DNS lookup */
|
|
39
|
+
export interface DnsLookupResult {
|
|
40
|
+
domain: string;
|
|
41
|
+
nxdomain: boolean;
|
|
42
|
+
records: NormalizedDnsRecord[];
|
|
43
|
+
source: 'cloudflare' | 'google';
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/doh/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+CAA+C;AAC/C,MAAM,MAAM,aAAa,GAAG,GAAG,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAEjG,6BAA6B;AAC7B,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAU1D,CAAC;AAEF,uCAAuC;AACvC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,4BAA4B;AAC5B,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC;IACxB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,OAAO,CAAC;CACd;AAED,qCAAqC;AACrC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,wCAAwC;AACxC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,MAAM,EAAE,YAAY,GAAG,QAAQ,CAAC;CACjC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview DNS-over-HTTPS service types — raw upstream and normalized shapes.
|
|
3
|
+
* @module services/doh/types
|
|
4
|
+
*/
|
|
5
|
+
/** DNS type numeric codes */
|
|
6
|
+
export const DNS_TYPE_NUMBERS = {
|
|
7
|
+
A: 1,
|
|
8
|
+
NS: 2,
|
|
9
|
+
CNAME: 5,
|
|
10
|
+
SOA: 6,
|
|
11
|
+
PTR: 12,
|
|
12
|
+
MX: 15,
|
|
13
|
+
TXT: 16,
|
|
14
|
+
AAAA: 28,
|
|
15
|
+
CAA: 257,
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/doh/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,6BAA6B;AAC7B,MAAM,CAAC,MAAM,gBAAgB,GAAkC;IAC7D,CAAC,EAAE,CAAC;IACJ,EAAE,EAAE,CAAC;IACL,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,EAAE;IACP,EAAE,EAAE,EAAE;IACN,GAAG,EAAE,EAAE;IACP,IAAI,EAAE,EAAE;IACR,GAAG,EAAE,GAAG;CACT,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview RDAP service — IANA bootstrap-driven domain, IP, and ASN lookups.
|
|
3
|
+
* Caches the IANA bootstrap JSON for 24 hours to avoid a bootstrap hop on every query.
|
|
4
|
+
* @module services/rdap/rdap-service
|
|
5
|
+
*/
|
|
6
|
+
import type { Context } from '@cyanheads/mcp-ts-core';
|
|
7
|
+
import type { AppConfig } from '@cyanheads/mcp-ts-core/config';
|
|
8
|
+
import type { StorageService } from '@cyanheads/mcp-ts-core/storage';
|
|
9
|
+
import type { NormalizedAsn, NormalizedDomain, NormalizedIpNetwork } from './types.js';
|
|
10
|
+
/** Validate an IP address or CIDR notation */
|
|
11
|
+
export declare function validateIp(ip: string): {
|
|
12
|
+
valid: boolean;
|
|
13
|
+
isIpv6: boolean;
|
|
14
|
+
hasCidr: boolean;
|
|
15
|
+
};
|
|
16
|
+
/** Build reverse PTR query name from an IPv4 address */
|
|
17
|
+
export declare function ipv4ToPtr(ip: string): string;
|
|
18
|
+
/** Build reverse PTR query name from an IPv6 address */
|
|
19
|
+
export declare function ipv6ToPtr(ip: string): string;
|
|
20
|
+
export declare class RdapService {
|
|
21
|
+
private bootstrapCache;
|
|
22
|
+
private reqCtx;
|
|
23
|
+
/** Fetch and cache a bootstrap JSON from IANA */
|
|
24
|
+
private fetchBootstrap;
|
|
25
|
+
/** Find the RDAP server URL for a domain's TLD via IANA bootstrap */
|
|
26
|
+
findDomainRdapServer(domain: string, ctx: Context): Promise<string | null>;
|
|
27
|
+
/** Find the RDAP server URL for an IP address via IANA bootstrap */
|
|
28
|
+
findIpRdapServer(ip: string, isIpv6: boolean, ctx: Context): Promise<string | null>;
|
|
29
|
+
/** Find the RDAP server URL for an ASN via IANA bootstrap */
|
|
30
|
+
findAsnRdapServer(asnNum: number, ctx: Context): Promise<string | null>;
|
|
31
|
+
/** Look up a domain registration record via RDAP */
|
|
32
|
+
lookupDomain(domain: string, ctx: Context): Promise<NormalizedDomain>;
|
|
33
|
+
/**
|
|
34
|
+
* Check domain availability via RDAP.
|
|
35
|
+
* Returns `{ available: true }` on 404, normalized record on 200,
|
|
36
|
+
* or `{ available: null }` when TLD has no RDAP coverage.
|
|
37
|
+
*/
|
|
38
|
+
checkAvailability(domain: string, ctx: Context): Promise<{
|
|
39
|
+
available: true;
|
|
40
|
+
} | {
|
|
41
|
+
available: false;
|
|
42
|
+
record: NormalizedDomain;
|
|
43
|
+
} | {
|
|
44
|
+
available: null;
|
|
45
|
+
rdap_coverage: false;
|
|
46
|
+
}>;
|
|
47
|
+
/** Look up an IP address or CIDR via RIR RDAP */
|
|
48
|
+
lookupIp(ip: string, ctx: Context): Promise<NormalizedIpNetwork>;
|
|
49
|
+
/** Look up an ASN via RIR RDAP */
|
|
50
|
+
lookupAsn(asn: string, ctx: Context): Promise<NormalizedAsn>;
|
|
51
|
+
}
|
|
52
|
+
export declare function initRdapService(_config: AppConfig, _storage: StorageService): void;
|
|
53
|
+
export declare function getRdapService(): RdapService;
|
|
54
|
+
//# sourceMappingURL=rdap-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rdap-service.d.ts","sourceRoot":"","sources":["../../../src/services/rdap/rdap-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGrE,OAAO,KAAK,EAEV,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EAMpB,MAAM,YAAY,CAAC;AA+DpB,8CAA8C;AAC9C,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAoB5F;AAED,wDAAwD;AACxD,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE5C;AAiBD,wDAAwD;AACxD,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAiB5C;AAkLD,qBAAa,WAAW;IACtB,OAAO,CAAC,cAAc,CAAsE;IAE5F,OAAO,CAAC,MAAM;IAId,iDAAiD;YACnC,cAAc;IAiB5B,qEAAqE;IAC/D,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiBhF,oEAAoE;IAC9D,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAmDzF,6DAA6D;IACvD,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiB7E,oDAAoD;IAC9C,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA+D3E;;;;OAIG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,OAAO,GACX,OAAO,CACN;QAAE,SAAS,EAAE,IAAI,CAAA;KAAE,GACnB;QAAE,SAAS,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAE,GAC9C;QAAE,SAAS,EAAE,IAAI,CAAC;QAAC,aAAa,EAAE,KAAK,CAAA;KAAE,CAC5C;IAuDD,iDAAiD;IAC3C,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAmDtE,kCAAkC;IAC5B,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;CA4CnE;AAMD,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAElF;AAED,wBAAgB,cAAc,IAAI,WAAW,CAK5C"}
|