@memberjunction/content-autotagging 2.43.0 → 2.45.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.
- package/README.md +249 -93
- package/dist/src/CloudStorage/providers/AutotagAzureBlob.d.ts +1 -0
- package/dist/src/CloudStorage/providers/AutotagAzureBlob.d.ts.map +1 -1
- package/dist/src/Engine/generic/AutotagBaseEngine.d.ts +1 -0
- package/dist/src/Engine/generic/AutotagBaseEngine.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @memberjunction/content-autotagging
|
|
2
2
|
|
|
3
|
-
A powerful package for automatically processing and tagging content from various sources
|
|
3
|
+
A powerful AI-driven package for automatically processing, analyzing, and tagging content from various sources including RSS feeds, websites, local files, and cloud storage.
|
|
4
4
|
|
|
5
5
|
## Overview
|
|
6
6
|
|
|
7
|
-
The `@memberjunction/content-autotagging` package
|
|
7
|
+
The `@memberjunction/content-autotagging` package provides an extensible framework for ingesting content from diverse sources and leveraging AI models to extract meaningful tags, summaries, and metadata. Built on the MemberJunction platform, it helps organizations automatically organize and categorize their content for improved searchability and insights.
|
|
8
|
+
|
|
9
|
+
## Features
|
|
10
|
+
|
|
11
|
+
- **Multiple Content Sources**: Support for RSS feeds, websites, local file systems, and cloud storage (Azure Blob)
|
|
12
|
+
- **AI-Powered Processing**: Integrates with various AI models to generate tags, summaries, and metadata
|
|
13
|
+
- **Extensible Architecture**: Easy to add new content sources and processing strategies
|
|
14
|
+
- **Smart Content Detection**: Validates content types and filters out irrelevant content
|
|
15
|
+
- **Incremental Processing**: Only processes new or modified content since last run
|
|
16
|
+
- **File Format Support**: Handles PDFs, Office documents, HTML, and plain text
|
|
17
|
+
- **Chunking Strategy**: Intelligently chunks large content to fit within AI model token limits
|
|
8
18
|
|
|
9
19
|
## Installation
|
|
10
20
|
|
|
@@ -14,130 +24,276 @@ npm install @memberjunction/content-autotagging
|
|
|
14
24
|
|
|
15
25
|
## Dependencies
|
|
16
26
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
- `@memberjunction/
|
|
20
|
-
- `@memberjunction/
|
|
21
|
-
- `@memberjunction/core` -
|
|
22
|
-
- `@memberjunction/
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
- `
|
|
27
|
-
- `
|
|
28
|
-
- `
|
|
29
|
-
- `
|
|
30
|
-
- `
|
|
31
|
-
- `
|
|
27
|
+
### MemberJunction Dependencies
|
|
28
|
+
- `@memberjunction/ai` (2.43.0) - AI model integration
|
|
29
|
+
- `@memberjunction/aiengine` (2.43.0) - AI processing pipeline
|
|
30
|
+
- `@memberjunction/core` (2.43.0) - Core MemberJunction functionality
|
|
31
|
+
- `@memberjunction/core-entities` (2.43.0) - Entity models
|
|
32
|
+
- `@memberjunction/global` (2.43.0) - Global utilities
|
|
33
|
+
|
|
34
|
+
### External Dependencies
|
|
35
|
+
- `axios` - HTTP requests
|
|
36
|
+
- `cheerio` - HTML parsing and web scraping
|
|
37
|
+
- `pdf-parse` - PDF document parsing
|
|
38
|
+
- `officeparser` - Microsoft Office document parsing
|
|
39
|
+
- `rss-parser` - RSS feed parsing
|
|
40
|
+
- `date-fns` & `date-fns-tz` - Date manipulation and timezone handling
|
|
41
|
+
- `openai` - OpenAI API integration
|
|
42
|
+
- `xml2js` - XML parsing
|
|
43
|
+
- `crypto` - Checksum generation
|
|
32
44
|
|
|
33
45
|
## Architecture
|
|
34
46
|
|
|
35
|
-
The package follows a modular
|
|
47
|
+
The package follows a modular architecture with these key components:
|
|
36
48
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
49
|
+
### Core Classes
|
|
50
|
+
|
|
51
|
+
1. **AutotagBase** - Abstract base class defining the autotagging interface
|
|
52
|
+
2. **AutotagBaseEngine** - Central processing engine handling AI interactions and content processing
|
|
53
|
+
3. **Content Source Implementations**:
|
|
54
|
+
- `AutotagRSSFeed` - RSS feed processing
|
|
55
|
+
- `AutotagWebsite` - Website crawling and processing
|
|
56
|
+
- `AutotagLocalFileSystem` - Local file processing
|
|
57
|
+
- `AutotagAzureBlob` - Azure Blob Storage integration
|
|
41
58
|
|
|
42
59
|
## Usage
|
|
43
60
|
|
|
44
|
-
###
|
|
61
|
+
### RSS Feed Processing
|
|
45
62
|
|
|
46
63
|
```typescript
|
|
47
|
-
import {
|
|
64
|
+
import { AutotagRSSFeed } from '@memberjunction/content-autotagging';
|
|
65
|
+
import { UserInfo } from '@memberjunction/core';
|
|
48
66
|
|
|
49
|
-
|
|
50
|
-
const
|
|
67
|
+
const rssTagger = new AutotagRSSFeed();
|
|
68
|
+
const userContext: UserInfo = { /* your user context */ };
|
|
51
69
|
|
|
52
|
-
// Process
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
await processor.processLocalDocument('/path/to/document.pdf');
|
|
62
|
-
}
|
|
70
|
+
// Process all configured RSS feeds
|
|
71
|
+
await rssTagger.Autotag(userContext);
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Website Content Processing
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
import { AutotagWebsite } from '@memberjunction/content-autotagging';
|
|
78
|
+
import { UserInfo } from '@memberjunction/core';
|
|
63
79
|
|
|
64
|
-
|
|
80
|
+
const websiteTagger = new AutotagWebsite();
|
|
81
|
+
const userContext: UserInfo = { /* your user context */ };
|
|
82
|
+
|
|
83
|
+
// Process all configured websites with crawling options
|
|
84
|
+
await websiteTagger.Autotag(userContext);
|
|
65
85
|
```
|
|
66
86
|
|
|
67
|
-
###
|
|
87
|
+
### Local File System Processing
|
|
68
88
|
|
|
69
89
|
```typescript
|
|
70
|
-
import {
|
|
71
|
-
|
|
72
|
-
AzureBlobStorageAdapter
|
|
73
|
-
} from '@memberjunction/content-autotagging';
|
|
74
|
-
|
|
75
|
-
// Create storage adapter
|
|
76
|
-
const storageAdapter = new AzureBlobStorageAdapter({
|
|
77
|
-
connectionString: process.env.AZURE_STORAGE_CONNECTION_STRING,
|
|
78
|
-
containerName: 'content'
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
// Initialize processor with storage adapter
|
|
82
|
-
const processor = new ContentAutotaggingProcessor({ storageAdapter });
|
|
83
|
-
|
|
84
|
-
// Process documents from cloud storage
|
|
85
|
-
async function processCloudDocuments() {
|
|
86
|
-
await processor.processCloudDocuments();
|
|
87
|
-
}
|
|
90
|
+
import { AutotagLocalFileSystem } from '@memberjunction/content-autotagging';
|
|
91
|
+
import { UserInfo } from '@memberjunction/core';
|
|
88
92
|
|
|
89
|
-
|
|
93
|
+
const fileTagger = new AutotagLocalFileSystem();
|
|
94
|
+
const userContext: UserInfo = { /* your user context */ };
|
|
95
|
+
|
|
96
|
+
// Process files from configured local directories
|
|
97
|
+
await fileTagger.Autotag(userContext);
|
|
90
98
|
```
|
|
91
99
|
|
|
92
|
-
|
|
100
|
+
### Azure Blob Storage Processing
|
|
93
101
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
4. **Storage** - Processed content with its AI-generated tags is stored in the MemberJunction database
|
|
98
|
-
5. **Notification** - Optional notifications are sent upon completion (if configured)
|
|
102
|
+
```typescript
|
|
103
|
+
import { AutotagAzureBlob } from '@memberjunction/content-autotagging';
|
|
104
|
+
import { UserInfo } from '@memberjunction/core';
|
|
99
105
|
|
|
100
|
-
|
|
106
|
+
const blobTagger = new AutotagAzureBlob(
|
|
107
|
+
process.env.AZURE_STORAGE_CONNECTION_STRING,
|
|
108
|
+
'your-container-name'
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
await blobTagger.Authenticate();
|
|
112
|
+
await blobTagger.Autotag(userContext);
|
|
113
|
+
```
|
|
101
114
|
|
|
102
|
-
###
|
|
115
|
+
### Direct Engine Usage
|
|
103
116
|
|
|
104
|
-
|
|
117
|
+
For more control over the processing pipeline:
|
|
105
118
|
|
|
106
119
|
```typescript
|
|
107
|
-
import {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
120
|
+
import { AutotagBaseEngine } from '@memberjunction/content-autotagging';
|
|
121
|
+
import { ContentItemEntity } from '@memberjunction/core-entities';
|
|
122
|
+
|
|
123
|
+
const engine = AutotagBaseEngine.Instance;
|
|
124
|
+
|
|
125
|
+
// Process specific content items
|
|
126
|
+
const contentItems: ContentItemEntity[] = [ /* your content items */ ];
|
|
127
|
+
await engine.ExtractTextAndProcessWithLLM(contentItems, userContext);
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Content Processing Pipeline
|
|
131
|
+
|
|
132
|
+
1. **Content Source Discovery**: Retrieves configured content sources from the database
|
|
133
|
+
2. **Content Acquisition**: Fetches content from each source (RSS, web, files, etc.)
|
|
134
|
+
3. **Change Detection**: Compares checksums to identify new or modified content
|
|
135
|
+
4. **Text Extraction**: Extracts text from various formats (HTML, PDF, Office docs)
|
|
136
|
+
5. **AI Processing**:
|
|
137
|
+
- Chunks content to fit model token limits
|
|
138
|
+
- Validates content type
|
|
139
|
+
- Generates title, summary, and keywords
|
|
140
|
+
- Extracts custom attributes based on content type
|
|
141
|
+
6. **Storage**: Saves results to MemberJunction entities:
|
|
142
|
+
- Content Items
|
|
143
|
+
- Content Item Tags
|
|
144
|
+
- Content Item Attributes
|
|
145
|
+
|
|
146
|
+
## Configuration
|
|
147
|
+
|
|
148
|
+
### Content Source Configuration
|
|
149
|
+
|
|
150
|
+
Content sources are configured in the MemberJunction database with these key fields:
|
|
151
|
+
- `Name`: Display name
|
|
152
|
+
- `URL`: Source location (RSS URL, website URL, file path, etc.)
|
|
153
|
+
- `ContentTypeID`: Type of content (article, blog post, etc.)
|
|
154
|
+
- `ContentSourceTypeID`: Source type (RSS Feed, Website, etc.)
|
|
155
|
+
- `ContentFileTypeID`: Expected file format
|
|
156
|
+
|
|
157
|
+
### AI Model Configuration
|
|
158
|
+
|
|
159
|
+
The package uses AI models configured in MemberJunction. Key parameters:
|
|
160
|
+
- `modelID`: Specific AI model to use
|
|
161
|
+
- `minTags`: Minimum number of tags to generate
|
|
162
|
+
- `maxTags`: Maximum number of tags to generate
|
|
163
|
+
- Token limits are automatically handled based on model configuration
|
|
164
|
+
|
|
165
|
+
### Website Crawling Options
|
|
166
|
+
|
|
167
|
+
For website sources, these parameters can be configured:
|
|
168
|
+
- `CrawlOtherSitesInTopLevelDomain`: Whether to crawl other subdomains
|
|
169
|
+
- `CrawlSitesInLowerLevelDomain`: Whether to crawl child paths
|
|
170
|
+
- `MaxDepth`: Maximum crawl depth
|
|
171
|
+
- `RootURL`: Base URL for crawling
|
|
172
|
+
- `URLPattern`: Regex pattern for URL filtering
|
|
173
|
+
|
|
174
|
+
## Extending the Package
|
|
175
|
+
|
|
176
|
+
### Creating a Custom Content Source
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
import { AutotagBase } from '@memberjunction/content-autotagging';
|
|
180
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
181
|
+
import { ContentSourceEntity, ContentItemEntity } from '@memberjunction/core-entities';
|
|
182
|
+
import { UserInfo } from '@memberjunction/core';
|
|
183
|
+
|
|
184
|
+
@RegisterClass(AutotagBase, 'AutotagCustomSource')
|
|
185
|
+
export class AutotagCustomSource extends AutotagBase {
|
|
186
|
+
public async SetContentItemsToProcess(
|
|
187
|
+
contentSources: ContentSourceEntity[]
|
|
188
|
+
): Promise<ContentItemEntity[]> {
|
|
189
|
+
// Implement logic to fetch and create content items
|
|
190
|
+
const contentItems: ContentItemEntity[] = [];
|
|
191
|
+
|
|
192
|
+
// Your custom source logic here
|
|
193
|
+
|
|
194
|
+
return contentItems;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
public async Autotag(contextUser: UserInfo): Promise<void> {
|
|
198
|
+
// Set up content source type
|
|
199
|
+
const contentSourceTypeID = await this.engine.setSubclassContentSourceType(
|
|
200
|
+
'Custom Source',
|
|
201
|
+
contextUser
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
// Get configured sources
|
|
205
|
+
const contentSources = await this.engine.getAllContentSources(
|
|
206
|
+
contextUser,
|
|
207
|
+
contentSourceTypeID
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
// Process content
|
|
211
|
+
const contentItems = await this.SetContentItemsToProcess(contentSources);
|
|
212
|
+
await this.engine.ExtractTextAndProcessWithLLM(contentItems, contextUser);
|
|
123
213
|
}
|
|
124
214
|
}
|
|
125
215
|
```
|
|
126
216
|
|
|
127
|
-
|
|
217
|
+
### Custom Content Type Attributes
|
|
218
|
+
|
|
219
|
+
Add custom prompts for specific content types by creating Content Type Attributes in the database. These will be automatically included in the AI processing prompts.
|
|
220
|
+
|
|
221
|
+
## API Reference
|
|
222
|
+
|
|
223
|
+
### AutotagBase (Abstract)
|
|
224
|
+
|
|
225
|
+
```typescript
|
|
226
|
+
abstract class AutotagBase {
|
|
227
|
+
abstract SetContentItemsToProcess(
|
|
228
|
+
contentSources: ContentSourceEntity[]
|
|
229
|
+
): Promise<ContentItemEntity[]>;
|
|
230
|
+
|
|
231
|
+
abstract Autotag(contextUser: UserInfo): Promise<void>;
|
|
232
|
+
}
|
|
233
|
+
```
|
|
128
234
|
|
|
129
|
-
|
|
235
|
+
### AutotagBaseEngine
|
|
130
236
|
|
|
131
237
|
```typescript
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
238
|
+
class AutotagBaseEngine extends AIEngine {
|
|
239
|
+
// Process content items with AI
|
|
240
|
+
async ExtractTextAndProcessWithLLM(
|
|
241
|
+
contentItems: ContentItemEntity[],
|
|
242
|
+
contextUser: UserInfo
|
|
243
|
+
): Promise<void>;
|
|
244
|
+
|
|
245
|
+
// Process individual content item text
|
|
246
|
+
async ProcessContentItemText(
|
|
247
|
+
params: ContentItemProcessParams,
|
|
248
|
+
contextUser: UserInfo
|
|
249
|
+
): Promise<void>;
|
|
250
|
+
|
|
251
|
+
// Get all content sources for a type
|
|
252
|
+
async getAllContentSources(
|
|
253
|
+
contextUser: UserInfo,
|
|
254
|
+
contentSourceTypeID: string
|
|
255
|
+
): Promise<ContentSourceEntity[]>;
|
|
256
|
+
}
|
|
139
257
|
```
|
|
140
258
|
|
|
259
|
+
## Environment Variables
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
# For Azure Blob Storage
|
|
263
|
+
AZURE_STORAGE_CONNECTION_STRING=your_connection_string
|
|
264
|
+
|
|
265
|
+
# AI Model API Keys (handled by @memberjunction/ai)
|
|
266
|
+
OPENAI_API_KEY=your_openai_key
|
|
267
|
+
# Other AI provider keys as needed
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Error Handling
|
|
271
|
+
|
|
272
|
+
The package includes comprehensive error handling:
|
|
273
|
+
- Invalid content detection with automatic cleanup
|
|
274
|
+
- Checksum-based duplicate detection
|
|
275
|
+
- Graceful handling of parsing failures
|
|
276
|
+
- Token limit management with automatic chunking
|
|
277
|
+
- Network retry logic for external sources
|
|
278
|
+
|
|
279
|
+
## Performance Considerations
|
|
280
|
+
|
|
281
|
+
- **Incremental Processing**: Only new/modified content is processed
|
|
282
|
+
- **Parallel Processing**: Content items can be processed in parallel
|
|
283
|
+
- **Chunking**: Large documents are automatically chunked for AI processing
|
|
284
|
+
- **Caching**: Processed content checksums prevent reprocessing
|
|
285
|
+
|
|
286
|
+
## Database Schema
|
|
287
|
+
|
|
288
|
+
The package works with these MemberJunction entities:
|
|
289
|
+
- `Content Sources` - Configuration for each source
|
|
290
|
+
- `Content Items` - Individual pieces of content
|
|
291
|
+
- `Content Item Tags` - Generated tags
|
|
292
|
+
- `Content Item Attributes` - Additional extracted metadata
|
|
293
|
+
- `Content Process Runs` - Processing history
|
|
294
|
+
- `Content Types` - Content categorization
|
|
295
|
+
- `Content Source Types` - Source type definitions
|
|
296
|
+
|
|
141
297
|
## License
|
|
142
298
|
|
|
143
299
|
ISC
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
3
4
|
import { CloudStorageBase } from "../generic/CloudStorageBase";
|
|
4
5
|
import { UserInfo } from "@memberjunction/core";
|
|
5
6
|
import { ContentItemEntity } from "@memberjunction/core-entities";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutotagAzureBlob.d.ts","sourceRoot":"","sources":["../../../../src/CloudStorage/providers/AutotagAzureBlob.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AutotagAzureBlob.d.ts","sourceRoot":"","sources":["../../../../src/CloudStorage/providers/AutotagAzureBlob.ts"],"names":[],"mappings":";;;AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGlE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,qBAAa,gBAAiB,SAAQ,gBAAgB;IAClD,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,aAAa,CAAS;gBAElB,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;IAW9C,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAc7B,6BAA6B,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAG,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAwC1J,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ1C,cAAc,CAAC,cAAc,EAAE,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;CAYtF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
2
3
|
import { UserInfo } from '@memberjunction/core';
|
|
3
4
|
import { ContentSourceEntity, ContentItemEntity } from '@memberjunction/core-entities';
|
|
4
5
|
import { ContentSourceParams, ContentSourceTypeParams } from './content.types';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutotagBaseEngine.d.ts","sourceRoot":"","sources":["../../../../src/Engine/generic/AutotagBaseEngine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AutotagBaseEngine.d.ts","sourceRoot":"","sources":["../../../../src/Engine/generic/AutotagBaseEngine.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAqB,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAElE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAoJ,MAAM,+BAA+B,CAAA;AACxO,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAI9E,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAKxF,OAAO,EAAE,OAAO,EAAe,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAGnD,qBACa,iBAAkB,SAAQ,QAAQ;;IAM3C,WAAkB,QAAQ,IAAI,iBAAiB,CAE9C;IAOY,4BAA4B,CAAC,YAAY,EAAE,iBAAiB,EAAE,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAgDrG,sBAAsB,CAAC,MAAM,EAAE,wBAAwB,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9F,+BAA+B,CAAC,MAAM,EAAE,wBAAwB,EAAE,WAAW,EAAE,QAAQ;IAqBvF,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAC,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA+B7I,aAAa,CAAC,MAAM,EAAE,wBAAwB,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAiCpK,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ;IAY5D,wBAAwB,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ;IAO3E,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;IAgCxD,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ;IAaxF,iCAAiC,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ;IAsC/E,oBAAoB,CAAC,WAAW,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAwBxG,4BAA4B,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBtF,sBAAsB,CAAC,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;IA6B/F,iCAAiC,CAAC,wBAAwB,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAmBlI,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG;IAiBxD,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIxC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAUnC,4BAA4B,CAAC,WAAW,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9D,2BAA2B,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B1F,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;KAAE,CAAC;IA2BnI,wBAAwB,CAAC,mBAAmB,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IA2B7F,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IA2BjF,sBAAsB,CAAC,iBAAiB,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBzF,8BAA8B,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IA6B7F,yBAAyB,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,WAAW,KAAA,GAAG,OAAO,CAAC,MAAM,CAAC;IAMjG,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOhD,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKlD,uBAAuB,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IA6BzG,cAAc,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,EAAE,QAAQ;IAiBxE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAU7C,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK9C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyBxC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAYpE"}
|