@openhealth/oht-custom-parser-lib 0.5.51 → 0.5.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -3
- package/dist/index.js +2 -9
- package/dist/index.js.map +1 -1
- package/dist/service/auxiliaryFunctions.service.d.ts +8 -1
- package/dist/service/auxiliaryFunctions.service.js +11 -40
- package/dist/service/auxiliaryFunctions.service.js.map +1 -1
- package/dist/service/ohtReportMeasurementsExtractor.service.d.ts +4 -2
- package/dist/service/ohtReportMeasurementsExtractor.service.js +63 -49
- package/dist/service/ohtReportMeasurementsExtractor.service.js.map +1 -1
- package/dist/service/processingLogger.service.d.ts +0 -5
- package/dist/service/processingLogger.service.js +1 -52
- package/dist/service/processingLogger.service.js.map +1 -1
- package/dist/service/reportCreator.service.js +55 -5
- package/dist/service/reportCreator.service.js.map +1 -1
- package/dist/types/error.types.d.ts +0 -104
- package/dist/types/error.types.js +1 -240
- package/dist/types/error.types.js.map +1 -1
- package/dist/util-ts/dataUtils.d.ts +0 -1
- package/dist/util-ts/dataUtils.js +1 -15
- package/dist/util-ts/dataUtils.js.map +1 -1
- package/dist/util-ts/mapperUtils.d.ts +1 -2
- package/dist/util-ts/mapperUtils.js +3 -12
- package/dist/util-ts/mapperUtils.js.map +1 -1
- package/package.json +40 -40
- package/readme.md +115 -115
- package/dist/service/ohtAgnosticMeasurementsExtractor.service.d.ts +0 -59
- package/dist/service/ohtAgnosticMeasurementsExtractor.service.js +0 -603
- package/dist/service/ohtAgnosticMeasurementsExtractor.service.js.map +0 -1
- package/dist/service/parsingErrorService.service.d.ts +0 -40
- package/dist/service/parsingErrorService.service.js +0 -251
- package/dist/service/parsingErrorService.service.js.map +0 -1
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Request-scoped parsing error collector for agnostic-parser.
|
|
3
|
-
*
|
|
4
|
-
* Layer 1 (local): in-memory errors → ingestion notes, Slack, processingLogger.
|
|
5
|
-
* Layer 2 (Core): grouped profiles flushed at end of run via runWithContextAsync finally.
|
|
6
|
-
*
|
|
7
|
-
* Call sites use record() only — do not duplicate processingLogger.addWarning/addError.
|
|
8
|
-
*/
|
|
9
|
-
import { LocalParsingError, ErrorProfilePayload, ParsingErrorType, RecordParsingErrorDetails, RecordParsingErrorOptions } from '../types/error.types';
|
|
10
|
-
import { ProcessingContext } from './processingLogger.service';
|
|
11
|
-
declare class ParsingErrorService {
|
|
12
|
-
/** Called from runWithContextAsync — do not use directly in parsers. */
|
|
13
|
-
initRequestState(requestId: string): void;
|
|
14
|
-
clearRequestState(requestId: string): void;
|
|
15
|
-
/**
|
|
16
|
-
* Single entry point for parsing issues.
|
|
17
|
-
* Resolves message/clientMessage from catalog + details, stores Layer 1, syncs logger once.
|
|
18
|
-
*/
|
|
19
|
-
record(errorType: ParsingErrorType, details?: RecordParsingErrorDetails, options?: RecordParsingErrorOptions): LocalParsingError;
|
|
20
|
-
getLocalErrors(): LocalParsingError[];
|
|
21
|
-
getAggregatedNotes(): string;
|
|
22
|
-
getAggregatedSlack(): string;
|
|
23
|
-
sendSlackIfNeeded(ohapiUrl: string, partnerName: string, fileUploadId: string): Promise<void>;
|
|
24
|
-
/**
|
|
25
|
-
* Groups local errors by (errorType, contextKey).
|
|
26
|
-
* Technical message → occurrence snapshot; clientMessage → profile message.
|
|
27
|
-
*/
|
|
28
|
-
buildCorePayloads(ctx: ProcessingContext): ErrorProfilePayload[];
|
|
29
|
-
/**
|
|
30
|
-
* POST grouped profiles to Core. Called from runWithContextAsync finally.
|
|
31
|
-
* No-op when empty, preview, or missing partner/api key. Never throws.
|
|
32
|
-
*/
|
|
33
|
-
flushToCoreSafe(): Promise<void>;
|
|
34
|
-
clear(): void;
|
|
35
|
-
}
|
|
36
|
-
export declare const parsingErrorService: ParsingErrorService;
|
|
37
|
-
/** Lifecycle hooks used by processingLogger.runWithContextAsync. */
|
|
38
|
-
export declare function initParsingErrorRequestState(context: ProcessingContext): string;
|
|
39
|
-
export declare function clearParsingErrorRequestState(requestId: string): void;
|
|
40
|
-
export {};
|
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parsingErrorService = void 0;
|
|
4
|
-
exports.initParsingErrorRequestState = initParsingErrorRequestState;
|
|
5
|
-
exports.clearParsingErrorRequestState = clearParsingErrorRequestState;
|
|
6
|
-
/**
|
|
7
|
-
* Request-scoped parsing error collector for agnostic-parser.
|
|
8
|
-
*
|
|
9
|
-
* Layer 1 (local): in-memory errors → ingestion notes, Slack, processingLogger.
|
|
10
|
-
* Layer 2 (Core): grouped profiles flushed at end of run via runWithContextAsync finally.
|
|
11
|
-
*
|
|
12
|
-
* Call sites use record() only — do not duplicate processingLogger.addWarning/addError.
|
|
13
|
-
*/
|
|
14
|
-
const error_types_1 = require("../types/error.types");
|
|
15
|
-
const dataUtils_1 = require("../util-ts/dataUtils");
|
|
16
|
-
const processingLogger_service_1 = require("./processingLogger.service");
|
|
17
|
-
const errorHandling_service_1 = require("./errorHandling.service");
|
|
18
|
-
const slackMessages_service_1 = require("./slackMessages.service");
|
|
19
|
-
// One state bag per request — keyed by the same id as processingLogger (ALS).
|
|
20
|
-
const parsingErrorStateRegistry = new Map();
|
|
21
|
-
function createEmptyParsingErrorState() {
|
|
22
|
-
return { localErrors: [] };
|
|
23
|
-
}
|
|
24
|
-
const SEVERITY_RANK = {
|
|
25
|
-
warning: 1,
|
|
26
|
-
error: 2,
|
|
27
|
-
critical: 3,
|
|
28
|
-
};
|
|
29
|
-
function maxParsingErrorSeverity(a, b) {
|
|
30
|
-
return SEVERITY_RANK[a] >= SEVERITY_RANK[b] ? a : b;
|
|
31
|
-
}
|
|
32
|
-
function getMutableState() {
|
|
33
|
-
const requestId = (0, processingLogger_service_1.getCurrentRequestId)();
|
|
34
|
-
if (requestId == null) {
|
|
35
|
-
return createEmptyParsingErrorState();
|
|
36
|
-
}
|
|
37
|
-
const state = parsingErrorStateRegistry.get(requestId);
|
|
38
|
-
if (state === undefined) {
|
|
39
|
-
return createEmptyParsingErrorState();
|
|
40
|
-
}
|
|
41
|
-
return state;
|
|
42
|
-
}
|
|
43
|
-
/** Maps a LocalParsingError to a single processingLogger call (severity → warning/error). */
|
|
44
|
-
function syncToProcessingLogger(localError) {
|
|
45
|
-
const catalog = error_types_1.PARSING_ERROR_CATALOG[localError.errorType];
|
|
46
|
-
if (localError.severity === 'critical') {
|
|
47
|
-
const rejectReason = localError.rejectReason ?? catalog.rejectReason;
|
|
48
|
-
processingLogger_service_1.processingLogger.addError(new Error(localError.message), localError.pipelineStep, {
|
|
49
|
-
rejectReason,
|
|
50
|
-
errorCode: localError.errorType,
|
|
51
|
-
});
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
const warningSeverity = localError.severity === 'error' ? 'degraded' : 'info';
|
|
55
|
-
processingLogger_service_1.processingLogger.addWarning(localError.message, localError.pipelineStep, {
|
|
56
|
-
warningType: catalog.warningType ?? 'parsing_error',
|
|
57
|
-
warningCategory: catalog.warningCategory ?? 'general',
|
|
58
|
-
warningSeverity,
|
|
59
|
-
data: localError.errorTrace,
|
|
60
|
-
warningCode: localError.errorType,
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
/** Adapts Layer 1 errors to legacy aggregateMessages() shape for notes/Slack. */
|
|
64
|
-
function localErrorsToErrorMessages(localErrors, channel) {
|
|
65
|
-
return localErrors
|
|
66
|
-
.filter((error) => error.destinations[channel])
|
|
67
|
-
.map((error) => ({
|
|
68
|
-
destination: error.destinations,
|
|
69
|
-
message: error.message,
|
|
70
|
-
item: error.item,
|
|
71
|
-
}));
|
|
72
|
-
}
|
|
73
|
-
class ParsingErrorService {
|
|
74
|
-
/** Called from runWithContextAsync — do not use directly in parsers. */
|
|
75
|
-
initRequestState(requestId) {
|
|
76
|
-
parsingErrorStateRegistry.set(requestId, createEmptyParsingErrorState());
|
|
77
|
-
}
|
|
78
|
-
clearRequestState(requestId) {
|
|
79
|
-
parsingErrorStateRegistry.delete(requestId);
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Single entry point for parsing issues.
|
|
83
|
-
* Resolves message/clientMessage from catalog + details, stores Layer 1, syncs logger once.
|
|
84
|
-
*/
|
|
85
|
-
record(errorType, details, options) {
|
|
86
|
-
const catalog = error_types_1.PARSING_ERROR_CATALOG[errorType];
|
|
87
|
-
const severity = details?.severity ?? catalog.severity;
|
|
88
|
-
const pipelineStep = details?.pipelineStep ?? catalog.pipelineStep;
|
|
89
|
-
const contextKey = (0, error_types_1.resolveParsingErrorContextKey)(catalog.contextKey, details);
|
|
90
|
-
const message = (0, error_types_1.buildParsingErrorMessage)(catalog.message, details);
|
|
91
|
-
const rejectReason = details?.rejectReason ?? catalog.rejectReason;
|
|
92
|
-
const destinations = {
|
|
93
|
-
slack: options?.notifySlack ?? details?.destinations?.slack ?? catalog.destinations.slack,
|
|
94
|
-
notes: options?.notifyNotes ?? details?.destinations?.notes ?? catalog.destinations.notes,
|
|
95
|
-
bi: options?.notifyBi ?? details?.destinations?.bi ?? catalog.destinations.bi,
|
|
96
|
-
};
|
|
97
|
-
const localError = {
|
|
98
|
-
errorType,
|
|
99
|
-
severity,
|
|
100
|
-
message,
|
|
101
|
-
clientMessage: catalog.clientMessage,
|
|
102
|
-
pipelineStep,
|
|
103
|
-
contextKey,
|
|
104
|
-
item: details?.item,
|
|
105
|
-
destinations,
|
|
106
|
-
rejectReason,
|
|
107
|
-
biomarkerId: details?.biomarkerId,
|
|
108
|
-
biomarkerName: details?.biomarkerName,
|
|
109
|
-
errorTrace: details?.errorTrace,
|
|
110
|
-
ohtExam: details?.ohtExam,
|
|
111
|
-
originalExam: details?.originalExam,
|
|
112
|
-
timestamp: new Date(),
|
|
113
|
-
};
|
|
114
|
-
getMutableState().localErrors.push(localError);
|
|
115
|
-
syncToProcessingLogger(localError);
|
|
116
|
-
return localError;
|
|
117
|
-
}
|
|
118
|
-
getLocalErrors() {
|
|
119
|
-
return [...getMutableState().localErrors];
|
|
120
|
-
}
|
|
121
|
-
// --- Layer 1 outputs (not persisted to Core) ---
|
|
122
|
-
getAggregatedNotes() {
|
|
123
|
-
return (0, errorHandling_service_1.aggregateMessages)(localErrorsToErrorMessages(getMutableState().localErrors, 'notes'), 'notes');
|
|
124
|
-
}
|
|
125
|
-
getAggregatedSlack() {
|
|
126
|
-
return (0, errorHandling_service_1.aggregateMessages)(localErrorsToErrorMessages(getMutableState().localErrors, 'slack'), 'slack');
|
|
127
|
-
}
|
|
128
|
-
async sendSlackIfNeeded(ohapiUrl, partnerName, fileUploadId) {
|
|
129
|
-
const slackText = this.getAggregatedSlack();
|
|
130
|
-
if (!slackText.trim()) {
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
const fileUrl = `${ohapiUrl}/data-import/file-uploads/${fileUploadId}`;
|
|
134
|
-
const slackMsg = (0, slackMessages_service_1.getSlackFileIssueNotificationMessage)(slackText, `AgnosticParser [${partnerName}]`, fileUrl);
|
|
135
|
-
if (slackMsg.blocks[3].text.text.trim() !== '') {
|
|
136
|
-
await (0, slackMessages_service_1.sendMessageToSlack)(slackMsg);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
// --- Layer 2: bulk payload for oht-core PartnerErrorProfiles ---
|
|
140
|
-
/**
|
|
141
|
-
* Groups local errors by (errorType, contextKey).
|
|
142
|
-
* Technical message → occurrence snapshot; clientMessage → profile message.
|
|
143
|
-
*/
|
|
144
|
-
buildCorePayloads(ctx) {
|
|
145
|
-
const localErrors = getMutableState().localErrors;
|
|
146
|
-
if (localErrors.length === 0) {
|
|
147
|
-
return [];
|
|
148
|
-
}
|
|
149
|
-
const groups = new Map();
|
|
150
|
-
for (const error of localErrors) {
|
|
151
|
-
const key = `${error.errorType}::${error.contextKey}`;
|
|
152
|
-
const group = groups.get(key);
|
|
153
|
-
if (group) {
|
|
154
|
-
group.push(error);
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
groups.set(key, [error]);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
const fileUploadId = ctx.fileUploadId ?? '000000000000000000000001';
|
|
161
|
-
const payloads = [];
|
|
162
|
-
for (const group of groups.values()) {
|
|
163
|
-
const representative = group[group.length - 1];
|
|
164
|
-
const severity = group.reduce((max, error) => maxParsingErrorSeverity(max, error.severity), group[0].severity);
|
|
165
|
-
const snapshots = group.map((error) => ({
|
|
166
|
-
dataImportFileUploadId: fileUploadId,
|
|
167
|
-
message: error.message,
|
|
168
|
-
pipelineStep: error.pipelineStep,
|
|
169
|
-
severity: error.severity,
|
|
170
|
-
rejectReason: error.rejectReason ?? null,
|
|
171
|
-
errorTrace: error.errorTrace,
|
|
172
|
-
occurredAt: error.timestamp.toISOString(),
|
|
173
|
-
}));
|
|
174
|
-
const payload = {
|
|
175
|
-
contextKey: representative.contextKey,
|
|
176
|
-
issueType: representative.errorType,
|
|
177
|
-
severity,
|
|
178
|
-
message: representative.clientMessage,
|
|
179
|
-
pipelineStep: representative.pipelineStep,
|
|
180
|
-
rejectReason: representative.rejectReason ?? null,
|
|
181
|
-
biomarkerId: representative.biomarkerId,
|
|
182
|
-
biomarkerName: representative.biomarkerName,
|
|
183
|
-
errorTrace: representative.errorTrace,
|
|
184
|
-
ohtExam: representative.ohtExam,
|
|
185
|
-
originalExam: representative.originalExam,
|
|
186
|
-
source: 'AgnosticParser',
|
|
187
|
-
uploadedByUserId: ctx.uploadedByUserId,
|
|
188
|
-
};
|
|
189
|
-
if (group.length === 1) {
|
|
190
|
-
payload.occurrence = snapshots[0];
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
payload.occurrences = snapshots;
|
|
194
|
-
payload.occurrencesCount = group.length;
|
|
195
|
-
}
|
|
196
|
-
payloads.push(payload);
|
|
197
|
-
}
|
|
198
|
-
return payloads;
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* POST grouped profiles to Core. Called from runWithContextAsync finally.
|
|
202
|
-
* No-op when empty, preview, or missing partner/api key. Never throws.
|
|
203
|
-
*/
|
|
204
|
-
async flushToCoreSafe() {
|
|
205
|
-
const state = getMutableState();
|
|
206
|
-
if (state.localErrors.length === 0) {
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
const loggerState = processingLogger_service_1.processingLogger.getState();
|
|
210
|
-
const partnerId = loggerState.partnerId;
|
|
211
|
-
const isPreview = loggerState.isPreview ?? false;
|
|
212
|
-
if (!partnerId || isPreview) {
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
|
-
const apiKey = process.env.OHT_CORE_AGNOSTIC_PARSER_API_KEY;
|
|
216
|
-
if (!apiKey) {
|
|
217
|
-
processingLogger_service_1.processingLogger.logError('Missing OHT_CORE_AGNOSTIC_PARSER_API_KEY; skipping parsing error profile flush', undefined, { partner_id: partnerId });
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
const ctx = {
|
|
221
|
-
fileUploadId: loggerState.fileUploadId,
|
|
222
|
-
partnerId,
|
|
223
|
-
uploadedByUserId: loggerState.uploadedByUserId,
|
|
224
|
-
isPreview,
|
|
225
|
-
};
|
|
226
|
-
try {
|
|
227
|
-
const payloads = this.buildCorePayloads(ctx);
|
|
228
|
-
if (payloads.length === 0) {
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
await (0, dataUtils_1.bulkUpsertCustomParserErrorProfiles)(partnerId, payloads, apiKey);
|
|
232
|
-
}
|
|
233
|
-
catch (error) {
|
|
234
|
-
processingLogger_service_1.processingLogger.logError('Failed to flush parsing error profiles to Core', error instanceof Error ? error : undefined, { partner_id: partnerId });
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
clear() {
|
|
238
|
-
getMutableState().localErrors.length = 0;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
exports.parsingErrorService = new ParsingErrorService();
|
|
242
|
-
/** Lifecycle hooks used by processingLogger.runWithContextAsync. */
|
|
243
|
-
function initParsingErrorRequestState(context) {
|
|
244
|
-
const requestId = (0, processingLogger_service_1.getRequestIdFromContext)(context);
|
|
245
|
-
exports.parsingErrorService.initRequestState(requestId);
|
|
246
|
-
return requestId;
|
|
247
|
-
}
|
|
248
|
-
function clearParsingErrorRequestState(requestId) {
|
|
249
|
-
exports.parsingErrorService.clearRequestState(requestId);
|
|
250
|
-
}
|
|
251
|
-
//# sourceMappingURL=parsingErrorService.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parsingErrorService.service.js","sourceRoot":"","sources":["../../service/parsingErrorService.service.ts"],"names":[],"mappings":";;;AAiUA,oEAIC;AAED,sEAEC;AAzUD;;;;;;;GAOG;AACH,sDAY8B;AAC9B,oDAA2E;AAC3E,yEAKoC;AAEpC,mEAA4D;AAC5D,mEAGiC;AAMjC,8EAA8E;AAC9E,MAAM,yBAAyB,GAAG,IAAI,GAAG,EAA6B,CAAC;AAEvE,SAAS,4BAA4B;IACnC,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,aAAa,GAAyC;IAC1D,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;IACR,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF,SAAS,uBAAuB,CAC9B,CAAuB,EACvB,CAAuB;IAEvB,OAAO,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,SAAS,GAAG,IAAA,8CAAmB,GAAE,CAAC;IACxC,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACtB,OAAO,4BAA4B,EAAE,CAAC;IACxC,CAAC;IACD,MAAM,KAAK,GAAG,yBAAyB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,4BAA4B,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6FAA6F;AAC7F,SAAS,sBAAsB,CAAC,UAA6B;IAC3D,MAAM,OAAO,GAAG,mCAAqB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC5D,IAAI,UAAU,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACvC,MAAM,YAAY,GAAG,UAAU,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC;QACrE,2CAAgB,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,YAAY,EAAE;YAChF,YAAY;YACZ,SAAS,EAAE,UAAU,CAAC,SAAS;SAChC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,eAAe,GAAG,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9E,2CAAgB,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,YAAY,EAAE;QACvE,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,eAAe;QACnD,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,SAAS;QACrD,eAAe;QACf,IAAI,EAAE,UAAU,CAAC,UAAU;QAC3B,WAAW,EAAE,UAAU,CAAC,SAAS;KAClC,CAAC,CAAC;AACL,CAAC;AAED,iFAAiF;AACjF,SAAS,0BAA0B,CACjC,WAAgC,EAChC,OAAiC;IAEjC,OAAO,WAAW;SACf,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;SAC9C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACf,WAAW,EAAE,KAAK,CAAC,YAAY;QAC/B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC,CAAC,CAAC;AACR,CAAC;AAED,MAAM,mBAAmB;IACvB,wEAAwE;IACxE,gBAAgB,CAAC,SAAiB;QAChC,yBAAyB,CAAC,GAAG,CAAC,SAAS,EAAE,4BAA4B,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,iBAAiB,CAAC,SAAiB;QACjC,yBAAyB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACH,MAAM,CACJ,SAA2B,EAC3B,OAAmC,EACnC,OAAmC;QAEnC,MAAM,OAAO,GAAG,mCAAqB,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;QACvD,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC;QACnE,MAAM,UAAU,GAAG,IAAA,2CAA6B,EAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9E,MAAM,OAAO,GAAG,IAAA,sCAAwB,EAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnE,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC;QAEnE,MAAM,YAAY,GAAgB;YAChC,KAAK,EAAE,OAAO,EAAE,WAAW,IAAI,OAAO,EAAE,YAAY,EAAE,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC,KAAK;YACzF,KAAK,EAAE,OAAO,EAAE,WAAW,IAAI,OAAO,EAAE,YAAY,EAAE,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC,KAAK;YACzF,EAAE,EAAE,OAAO,EAAE,QAAQ,IAAI,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,OAAO,CAAC,YAAY,CAAC,EAAE;SAC9E,CAAC;QAEF,MAAM,UAAU,GAAsB;YACpC,SAAS;YACT,QAAQ;YACR,OAAO;YACP,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,YAAY;YACZ,UAAU;YACV,IAAI,EAAE,OAAO,EAAE,IAAI;YACnB,YAAY;YACZ,YAAY;YACZ,WAAW,EAAE,OAAO,EAAE,WAAW;YACjC,aAAa,EAAE,OAAO,EAAE,aAAa;YACrC,UAAU,EAAE,OAAO,EAAE,UAAU;YAC/B,OAAO,EAAE,OAAO,EAAE,OAAO;YACzB,YAAY,EAAE,OAAO,EAAE,YAAY;YACnC,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC;QAEF,eAAe,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/C,sBAAsB,CAAC,UAAU,CAAC,CAAC;QACnC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,cAAc;QACZ,OAAO,CAAC,GAAG,eAAe,EAAE,CAAC,WAAW,CAAC,CAAC;IAC5C,CAAC;IAED,kDAAkD;IAElD,kBAAkB;QAChB,OAAO,IAAA,yCAAiB,EAAC,0BAA0B,CAAC,eAAe,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACxG,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAA,yCAAiB,EAAC,0BAA0B,CAAC,eAAe,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACxG,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,QAAgB,EAAE,WAAmB,EAAE,YAAoB;QACjF,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5C,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,QAAQ,6BAA6B,YAAY,EAAE,CAAC;QACvE,MAAM,QAAQ,GAAG,IAAA,4DAAoC,EACnD,SAAS,EACT,mBAAmB,WAAW,GAAG,EACjC,OAAO,CACR,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC/C,MAAM,IAAA,0CAAkB,EAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,kEAAkE;IAElE;;;OAGG;IACH,iBAAiB,CAAC,GAAsB;QACtC,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC,WAAW,CAAC;QAClD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAA+B,CAAC;QACtD,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,UAAU,EAAE,CAAC;YACtD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,IAAI,0BAA0B,CAAC;QACpE,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAE3C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACpC,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAC3B,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,uBAAuB,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,EAC5D,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAClB,CAAC;YACF,MAAM,SAAS,GAAqC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACxE,sBAAsB,EAAE,YAAY;gBACpC,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,IAAI;gBACxC,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;aAC1C,CAAC,CAAC,CAAC;YAEJ,MAAM,OAAO,GAAwB;gBACnC,UAAU,EAAE,cAAc,CAAC,UAAU;gBACrC,SAAS,EAAE,cAAc,CAAC,SAAS;gBACnC,QAAQ;gBACR,OAAO,EAAE,cAAc,CAAC,aAAa;gBACrC,YAAY,EAAE,cAAc,CAAC,YAAY;gBACzC,YAAY,EAAE,cAAc,CAAC,YAAY,IAAI,IAAI;gBACjD,WAAW,EAAE,cAAc,CAAC,WAAW;gBACvC,aAAa,EAAE,cAAc,CAAC,aAAa;gBAC3C,UAAU,EAAE,cAAc,CAAC,UAAU;gBACrC,OAAO,EAAE,cAAc,CAAC,OAAO;gBAC/B,YAAY,EAAE,cAAc,CAAC,YAAY;gBACzC,MAAM,EAAE,gBAAgB;gBACxB,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;aACvC,CAAC;YAEF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;gBAChC,OAAO,CAAC,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC;YAC1C,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe;QACnB,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,2CAAgB,CAAC,QAAQ,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;QACxC,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,IAAI,KAAK,CAAC;QACjD,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC;QAC5D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,2CAAgB,CAAC,QAAQ,CACvB,gFAAgF,EAChF,SAAS,EACT,EAAE,UAAU,EAAE,SAAS,EAAE,CAC1B,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAsB;YAC7B,YAAY,EAAE,WAAW,CAAC,YAAY;YACtC,SAAS;YACT,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;YAC9C,SAAS;SACV,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,MAAM,IAAA,+CAAmC,EAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,2CAAgB,CAAC,QAAQ,CACvB,gDAAgD,EAChD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAC1C,EAAE,UAAU,EAAE,SAAS,EAAE,CAC1B,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK;QACH,eAAe,EAAE,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3C,CAAC;CACF;AAEY,QAAA,mBAAmB,GAAG,IAAI,mBAAmB,EAAE,CAAC;AAE7D,oEAAoE;AACpE,SAAgB,4BAA4B,CAAC,OAA0B;IACrE,MAAM,SAAS,GAAG,IAAA,kDAAuB,EAAC,OAAO,CAAC,CAAC;IACnD,2BAAmB,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAChD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,6BAA6B,CAAC,SAAiB;IAC7D,2BAAmB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACnD,CAAC"}
|