0
# Data Models and Types
1
2
Comprehensive data structures for representing extracted document content, model metadata, and operation results across both legacy Form Recognizer API and modern Document Intelligence API.
3
4
## Core Types and Utilities
5
6
Fundamental types for representing spatial information, document layout, and SDK utilities.
7
8
```python { .api }
9
class Point:
10
"""Coordinate point in document space."""
11
x: float # X-coordinate
12
y: float # Y-coordinate
13
14
class BoundingRegion:
15
"""Bounding region with page reference."""
16
page_number: int # Page number (1-based)
17
polygon: List[float] # Polygon coordinates [x1, y1, x2, y2, ...]
18
19
# Long-running operation support
20
class LROPoller:
21
"""Long-running operation poller for tracking async operations."""
22
def result(self, timeout: Optional[int] = None) -> Any: ...
23
def status(self) -> str: ...
24
def done(self) -> bool: ...
25
def wait(self, timeout: Optional[int] = None) -> None: ...
26
def cancel(self) -> None: ...
27
28
class DocumentModelAdministrationLROPoller(LROPoller):
29
"""Specialized LRO poller for model administration operations."""
30
31
# Paging support for list operations
32
class ItemPaged:
33
"""Paged collection for list operations."""
34
def __iter__(self): ...
35
def by_page(self): ...
36
37
class AsyncItemPaged:
38
"""Async paged collection for list operations."""
39
def __aiter__(self): ...
40
def by_page(self): ...
41
42
# Async LRO Pollers
43
class AsyncLROPoller:
44
"""Async long-running operation poller."""
45
async def result(self, timeout: Optional[int] = None) -> Any: ...
46
def status(self) -> str: ...
47
def done(self) -> bool: ...
48
async def wait(self, timeout: Optional[int] = None) -> None: ...
49
async def cancel(self) -> None: ...
50
51
class AsyncDocumentModelAdministrationLROPoller(AsyncLROPoller):
52
"""Specialized async LRO poller for model administration operations."""
53
54
# Authentication types (from azure.core.credentials and azure.identity)
55
class TokenCredential:
56
"""Token-based credential for Azure Active Directory authentication."""
57
58
class AsyncTokenCredential:
59
"""Async token-based credential for Azure Active Directory authentication."""
60
61
class AzureKeyCredential:
62
"""API key-based credential for authentication."""
63
def __init__(self, key: str): ...
64
def update(self, key: str) -> None: ...
65
```
66
67
## Legacy Form Recognition Models
68
69
Data structures used by Form Recognizer API v2.1 and below for representing form analysis results.
70
71
### Form Analysis Results
72
73
```python { .api }
74
class RecognizedForm:
75
"""Result of form recognition operation."""
76
form_type: str # Type of form recognized
77
form_type_confidence: Optional[float] # Confidence in form type prediction
78
fields: Dict[str, FormField] # Extracted fields by name
79
pages: List[FormPage] # Page-level information
80
page_range: FormPageRange # Range of pages analyzed
81
82
class FormField:
83
"""Extracted field from form."""
84
value: Any # Extracted value (text, number, date, etc.)
85
value_type: FieldValueType # Type of extracted value
86
label_data: Optional[FieldData] # Information about field label
87
value_data: Optional[FieldData] # Information about field value
88
confidence: Optional[float] # Confidence score (0-1)
89
90
class FieldData:
91
"""Spatial and content information for form elements."""
92
page_number: int # Page number (1-based)
93
text: str # Text content
94
bounding_box: List[Point] # Bounding box coordinates
95
field_elements: Optional[List[FormElement]] # Constituent elements
96
```
97
98
### Page Structure
99
100
```python { .api }
101
class FormPage:
102
"""Page-level information from form analysis."""
103
page_number: int # Page number (1-based)
104
text_angle: Optional[float] # Text angle in radians
105
width: float # Page width
106
height: float # Page height
107
unit: LengthUnit # Unit of measurement (pixel, inch)
108
tables: Optional[List[FormTable]] # Tables found on page
109
lines: Optional[List[FormLine]] # Text lines on page
110
words: Optional[List[FormWord]] # Individual words on page
111
selection_marks: Optional[List[FormSelectionMark]] # Selection marks on page
112
113
class FormLine:
114
"""Text line in document."""
115
text: str # Line text content
116
bounding_box: List[Point] # Line bounding box
117
words: List[FormWord] # Words in the line
118
appearance: Optional[TextAppearance] # Text styling information
119
120
class FormWord:
121
"""Individual word in document."""
122
text: str # Word text
123
bounding_box: List[Point] # Word bounding box
124
confidence: Optional[float] # Recognition confidence
125
page_number: Optional[int] # Page number
126
127
class FormSelectionMark:
128
"""Selection mark (checkbox, radio button) in document."""
129
state: str # "selected", "unselected"
130
bounding_box: List[Point] # Mark bounding box
131
confidence: Optional[float] # Recognition confidence
132
page_number: Optional[int] # Page number
133
```
134
135
### Table Structures
136
137
```python { .api }
138
class FormTable:
139
"""Table structure in form."""
140
row_count: int # Number of rows
141
column_count: int # Number of columns
142
cells: List[FormTableCell] # Table cells
143
bounding_box: Optional[List[Point]] # Table bounding box
144
page_number: Optional[int] # Page number
145
146
class FormTableCell:
147
"""Cell within a form table."""
148
text: str # Cell text content
149
row_index: int # Row index (0-based)
150
column_index: int # Column index (0-based)
151
row_span: Optional[int] # Number of rows spanned
152
column_span: Optional[int] # Number of columns spanned
153
bounding_box: List[Point] # Cell bounding box
154
confidence: Optional[float] # Recognition confidence
155
field_elements: Optional[List[FormElement]] # Constituent elements
156
is_header: Optional[bool] # Whether cell is a header
157
is_footer: Optional[bool] # Whether cell is a footer
158
page_number: Optional[int] # Page number
159
```
160
161
### Model Information
162
163
```python { .api }
164
class CustomFormModel:
165
"""Information about a custom trained model."""
166
model_id: str # Unique model identifier
167
status: CustomFormModelStatus # Model status (Creating, Ready, Invalid)
168
training_started_on: datetime # Training start time
169
training_completed_on: Optional[datetime] # Training completion time
170
submodels: List[CustomFormSubmodel] # Model subcomponents
171
errors: Optional[List[FormRecognizerError]] # Training errors
172
training_documents: Optional[List[TrainingDocumentInfo]] # Training data info
173
properties: Optional[CustomFormModelProperties] # Additional properties
174
model_name: Optional[str] # User-assigned model name
175
176
class CustomFormSubmodel:
177
"""Submodel within a custom form model."""
178
form_type: str # Form type identifier
179
accuracy: Optional[float] # Model accuracy
180
fields: Optional[Dict[str, CustomFormModelField]] # Field definitions
181
model_id: Optional[str] # Associated model ID
182
183
class CustomFormModelField:
184
"""Field definition in custom model."""
185
field_name: str # Field name
186
label: Optional[str] # Field label
187
accuracy: Optional[float] # Field extraction accuracy
188
189
class CustomFormModelInfo:
190
"""Summary information about custom model."""
191
model_id: str # Model identifier
192
status: CustomFormModelStatus # Current model status
193
training_started_on: datetime # Training start time
194
training_completed_on: Optional[datetime] # Training completion time
195
properties: Optional[CustomFormModelProperties] # Model properties
196
model_name: Optional[str] # User-assigned name
197
198
class TrainingDocumentInfo:
199
"""Information about training document."""
200
name: str # Document name
201
status: TrainingStatus # Training status for this document
202
page_count: int # Number of pages
203
errors: Optional[List[FormRecognizerError]] # Document-specific errors
204
model_id: Optional[str] # Associated model ID
205
206
class AccountProperties:
207
"""Form Recognizer account information."""
208
custom_model_count: int # Current number of custom models
209
custom_model_limit: int # Maximum allowed custom models
210
```
211
212
## Modern Document Analysis Models
213
214
Data structures used by Document Intelligence API 2022-08-31 and later for advanced document analysis.
215
216
### Analysis Results
217
218
```python { .api }
219
class AnalyzeResult:
220
"""Complete document analysis result."""
221
api_version: str # API version used
222
model_id: str # Model used for analysis
223
content: str # Extracted text content
224
pages: Optional[List[DocumentPage]] # Page-level information
225
paragraphs: Optional[List[DocumentParagraph]] # Paragraph information
226
tables: Optional[List[DocumentTable]] # Table structures
227
key_value_pairs: Optional[List[DocumentKeyValuePair]] # Key-value pairs
228
entities: Optional[List[Any]] # Named entities (not fully typed)
229
styles: Optional[List[DocumentStyle]] # Text styling information
230
languages: Optional[List[DocumentLanguage]] # Language information
231
documents: Optional[List[AnalyzedDocument]] # Structured documents
232
warnings: Optional[List[Any]] # Analysis warnings
233
234
class AnalyzedDocument:
235
"""Structured document within analysis result."""
236
doc_type: str # Document type
237
bounding_regions: Optional[List[BoundingRegion]] # Document boundaries
238
spans: Optional[List[DocumentSpan]] # Text spans
239
fields: Optional[Dict[str, DocumentField]] # Extracted fields
240
confidence: Optional[float] # Document type confidence
241
```
242
243
### Document Structure
244
245
```python { .api }
246
class DocumentPage:
247
"""Page-level document information."""
248
page_number: int # Page number (1-based)
249
angle: Optional[float] # Page rotation angle
250
width: Optional[float] # Page width
251
height: Optional[float] # Page height
252
unit: Optional[str] # Unit of measurement
253
spans: Optional[List[DocumentSpan]] # Text spans on page
254
words: Optional[List[DocumentWord]] # Words on page
255
selection_marks: Optional[List[DocumentSelectionMark]] # Selection marks
256
lines: Optional[List[DocumentLine]] # Text lines
257
barcodes: Optional[List[DocumentBarcode]] # Barcodes (API v2023-07-31)
258
formulas: Optional[List[DocumentFormula]] # Formulas (API v2023-07-31)
259
260
class DocumentWord:
261
"""Individual word in document."""
262
content: str # Word text
263
polygon: Optional[List[float]] # Word boundary polygon
264
span: DocumentSpan # Text span reference
265
confidence: Optional[float] # Recognition confidence
266
267
class DocumentLine:
268
"""Text line in document."""
269
content: str # Line text
270
polygon: Optional[List[float]] # Line boundary polygon
271
spans: Optional[List[DocumentSpan]] # Text spans
272
273
class DocumentParagraph:
274
"""Paragraph in document."""
275
role: Optional[str] # Paragraph role (title, sectionHeading, etc.)
276
content: str # Paragraph text
277
bounding_regions: Optional[List[BoundingRegion]] # Paragraph boundaries
278
spans: List[DocumentSpan] # Text spans
279
280
class DocumentSpan:
281
"""Text span reference."""
282
offset: int # Character offset in content
283
length: int # Span length in characters
284
```
285
286
### Enhanced Content (API v2023-07-31)
287
288
```python { .api }
289
class DocumentBarcode:
290
"""Barcode information extracted from document."""
291
kind: str # Barcode type (QRCode, PDF417, UPCA, etc.)
292
value: str # Decoded barcode value
293
polygon: Optional[List[float]] # Barcode boundary
294
span: DocumentSpan # Text span reference
295
confidence: Optional[float] # Detection confidence
296
page_number: int # Page number
297
298
class DocumentFormula:
299
"""Mathematical formula in document."""
300
kind: str # Formula type (inline, display)
301
value: str # Formula expression (LaTeX format)
302
polygon: Optional[List[float]] # Formula boundary
303
span: DocumentSpan # Text span reference
304
confidence: Optional[float] # Detection confidence
305
page_number: int # Page number
306
```
307
308
### Field Types and Values
309
310
```python { .api }
311
class DocumentField:
312
"""Extracted field from document."""
313
value_type: str # Field value type
314
value: Any # Extracted value (varies by type)
315
content: Optional[str] # Raw text content
316
bounding_regions: Optional[List[BoundingRegion]] # Field boundaries
317
spans: Optional[List[DocumentSpan]] # Text spans
318
confidence: Optional[float] # Extraction confidence
319
320
class AddressValue:
321
"""Structured address value."""
322
house_number: Optional[str] # House number
323
po_box: Optional[str] # PO Box
324
road: Optional[str] # Street name
325
city: Optional[str] # City name
326
state: Optional[str] # State/province
327
postal_code: Optional[str] # Postal/ZIP code
328
country_region: Optional[str] # Country
329
street_address: Optional[str] # Full street address
330
unit: Optional[str] # Unit/apartment number
331
city_district: Optional[str] # City district
332
state_district: Optional[str] # State district
333
suburb: Optional[str] # Suburb
334
house: Optional[str] # House name
335
level: Optional[str] # Floor level
336
337
class CurrencyValue:
338
"""Currency amount value."""
339
amount: float # Numeric amount
340
symbol: Optional[str] # Currency symbol ($, €, etc.)
341
code: Optional[str] # Currency code (USD, EUR, etc.)
342
```
343
344
### Table Structures
345
346
```python { .api }
347
class DocumentTable:
348
"""Table structure in document."""
349
row_count: int # Number of rows
350
column_count: int # Number of columns
351
cells: List[DocumentTableCell] # Table cells
352
bounding_regions: Optional[List[BoundingRegion]] # Table boundaries
353
spans: Optional[List[DocumentSpan]] # Text spans
354
caption: Optional[str] # Table caption
355
356
class DocumentTableCell:
357
"""Cell within document table."""
358
kind: Optional[str] # Cell kind (content, rowHeader, columnHeader, etc.)
359
row_index: int # Row index (0-based)
360
column_index: int # Column index (0-based)
361
row_span: Optional[int] # Rows spanned
362
column_span: Optional[int] # Columns spanned
363
content: str # Cell text content
364
bounding_regions: Optional[List[BoundingRegion]] # Cell boundaries
365
spans: Optional[List[DocumentSpan]] # Text spans
366
elements: Optional[List[str]] # References to constituent elements
367
```
368
369
### Key-Value Pairs
370
371
```python { .api }
372
class DocumentKeyValuePair:
373
"""Key-value pair extracted from document."""
374
key: DocumentKeyValueElement # Key element
375
value: Optional[DocumentKeyValueElement] # Value element
376
confidence: Optional[float] # Extraction confidence
377
378
class DocumentKeyValueElement:
379
"""Element of key-value pair."""
380
content: str # Text content
381
bounding_regions: Optional[List[BoundingRegion]] # Element boundaries
382
spans: Optional[List[DocumentSpan]] # Text spans
383
```
384
385
### Language and Styling
386
387
```python { .api }
388
class DocumentLanguage:
389
"""Language information for document content."""
390
locale: str # Language locale (e.g., "en-US")
391
spans: List[DocumentSpan] # Text spans in this language
392
confidence: Optional[float] # Language detection confidence
393
394
class DocumentStyle:
395
"""Text styling information."""
396
is_handwritten: Optional[bool] # Whether text is handwritten
397
similar_font_family: Optional[str] # Similar font family name
398
font_style: Optional[str] # Font style (normal, italic)
399
font_weight: Optional[str] # Font weight (normal, bold)
400
color: Optional[str] # Text color (hex format)
401
background_color: Optional[str] # Background color (hex format)
402
spans: List[DocumentSpan] # Text spans with this style
403
confidence: Optional[float] # Style detection confidence
404
405
class DocumentSelectionMark:
406
"""Selection mark in document."""
407
state: str # Selection state ("selected", "unselected")
408
polygon: Optional[List[float]] # Mark boundary
409
span: DocumentSpan # Text span reference
410
confidence: Optional[float] # Detection confidence
411
```
412
413
## Model Administration Models
414
415
Data structures for model lifecycle management and operation monitoring.
416
417
### Model Information
418
419
```python { .api }
420
class DocumentModelDetails:
421
"""Detailed information about document model."""
422
model_id: str # Model identifier
423
description: Optional[str] # Model description
424
created_date_time: datetime # Creation timestamp
425
api_version: str # API version used to create model
426
tags: Optional[Dict[str, str]] # Custom tags
427
doc_types: Optional[Dict[str, DocumentTypeDetails]] # Supported document types
428
expires_date_time: Optional[datetime] # Model expiration time
429
430
class DocumentModelSummary:
431
"""Summary information about document model."""
432
model_id: str # Model identifier
433
description: Optional[str] # Model description
434
created_date_time: datetime # Creation timestamp
435
api_version: str # API version
436
tags: Optional[Dict[str, str]] # Custom tags
437
expires_date_time: Optional[datetime] # Expiration time
438
439
class DocumentTypeDetails:
440
"""Details about document type supported by model."""
441
description: Optional[str] # Document type description
442
build_mode: Optional[str] # Build mode used (template, neural)
443
field_schema: Optional[Dict[str, Any]] # Field schema definition
444
field_confidence: Optional[Dict[str, float]] # Field confidence scores
445
```
446
447
### Classifier Information
448
449
```python { .api }
450
class DocumentClassifierDetails:
451
"""Information about document classifier."""
452
classifier_id: str # Classifier identifier
453
description: Optional[str] # Classifier description
454
created_date_time: datetime # Creation timestamp
455
api_version: str # API version
456
doc_types: Dict[str, ClassifierDocumentTypeDetails] # Document types
457
expires_date_time: Optional[datetime] # Expiration time
458
459
class ClassifierDocumentTypeDetails:
460
"""Document type details for classifier."""
461
source_kind: Optional[str] # Training data source type
462
azure_blob_source: Optional[BlobSource] # Blob storage source
463
azure_blob_file_list_source: Optional[BlobFileListSource] # File list source
464
465
class BlobSource:
466
"""Azure Blob Storage source configuration."""
467
container_url: str # Container URL with SAS token
468
prefix: Optional[str] # File prefix filter
469
470
class BlobFileListSource:
471
"""Azure Blob Storage file list source."""
472
container_url: str # Container URL with SAS token
473
file_list: str # JSON file with file list
474
475
class DocumentModelBuildOperationDetails:
476
"""Details for document model build operations."""
477
operation_id: str # Operation identifier
478
status: str # Current status
479
percent_completed: Optional[int] # Completion percentage
480
created_date_time: datetime # Creation time
481
last_updated_date_time: datetime # Last update time
482
kind: str # Operation type
483
resource_location: Optional[str] # Resource location
484
api_version: Optional[str] # API version
485
tags: Optional[Dict[str, str]] # Operation tags
486
error: Optional[DocumentAnalysisError] # Error information if failed
487
result: Optional[DocumentModelDetails] # Operation result if succeeded
488
```
489
490
### Operations and Resources
491
492
```python { .api }
493
class OperationSummary:
494
"""Summary of long-running operation."""
495
operation_id: str # Operation identifier
496
status: str # Operation status (notStarted, running, succeeded, failed)
497
percent_completed: Optional[int] # Completion percentage
498
created_date_time: datetime # Operation start time
499
last_updated_date_time: datetime # Last update time
500
kind: str # Operation kind (documentModelBuild, documentModelCompose, etc.)
501
resource_location: Optional[str] # Location of created resource
502
503
class OperationDetails:
504
"""Detailed information about operation."""
505
operation_id: str # Operation identifier
506
status: str # Current status
507
percent_completed: Optional[int] # Completion percentage
508
created_date_time: datetime # Creation time
509
last_updated_date_time: datetime # Last update time
510
kind: str # Operation type
511
resource_location: Optional[str] # Resource location
512
api_version: Optional[str] # API version
513
tags: Optional[Dict[str, str]] # Operation tags
514
error: Optional[DocumentAnalysisError] # Error information if failed
515
result: Optional[Any] # Operation result if succeeded
516
517
class ResourceDetails:
518
"""Information about Form Recognizer resource."""
519
custom_document_models: CustomDocumentModelsDetails # Custom model info
520
neural_document_model_quota: QuotaDetails # Neural model quota
521
522
class CustomDocumentModelsDetails:
523
"""Custom document model quota information."""
524
count: int # Current number of custom models
525
limit: int # Maximum allowed custom models
526
527
class QuotaDetails:
528
"""Quota information for specific resource type."""
529
used: int # Currently used quota
530
quota: int # Total available quota
531
quota_resets_on: Optional[datetime] # Quota reset time
532
533
class TargetAuthorization:
534
"""Authorization for model copying."""
535
target_resource_id: str # Target resource identifier
536
target_resource_region: str # Target resource region
537
target_model_id: str # Target model identifier
538
target_model_location: str # Target model location URL
539
access_token: str # Access token for copying
540
expiration_date_time: datetime # Token expiration time
541
```
542
543
## Enums and Constants
544
545
```python { .api }
546
class FieldValueType(str, Enum):
547
"""Types of field values that can be extracted."""
548
STRING = "string"
549
DATE = "date"
550
TIME = "time"
551
PHONE_NUMBER = "phoneNumber"
552
NUMBER = "number" # Legacy - use FLOAT for new code
553
FLOAT = "float"
554
INTEGER = "integer"
555
SELECTION_MARK = "selectionMark"
556
COUNTRY_REGION = "countryRegion"
557
SIGNATURE = "signature"
558
ARRAY = "array" # Legacy - use LIST for new code
559
LIST = "list"
560
OBJECT = "object" # Legacy - use DICTIONARY for new code
561
DICTIONARY = "dictionary"
562
CURRENCY = "currency"
563
ADDRESS = "address"
564
565
class LengthUnit(str, Enum):
566
"""Units of measurement for dimensions."""
567
PIXEL = "pixel"
568
INCH = "inch"
569
570
class TrainingStatus(str, Enum):
571
"""Status of training operations."""
572
SUCCEEDED = "succeeded"
573
PARTIALLY_SUCCEEDED = "partiallySucceeded"
574
FAILED = "failed"
575
576
class CustomFormModelStatus(str, Enum):
577
"""Status of custom form models."""
578
CREATING = "creating"
579
READY = "ready"
580
INVALID = "invalid"
581
582
class ModelBuildMode(str, Enum):
583
"""Model building approaches."""
584
TEMPLATE = "template" # Fast, structured documents
585
NEURAL = "neural" # Slower, better for varied layouts
586
587
class AnalysisFeature(str, Enum):
588
"""Enhanced analysis features."""
589
OCR_HIGH_RESOLUTION = "ocrHighResolution"
590
LANGUAGES = "languages"
591
BARCODES = "barcodes"
592
FORMULAS = "formulas"
593
KEY_VALUE_PAIRS = "keyValuePairs"
594
STYLE_FONT = "styleFont"
595
```
596
597
## Error Models
598
599
```python { .api }
600
class FormRecognizerError:
601
"""Error information from Form Recognizer API."""
602
error_code: str # Error code
603
message: str # Error message
604
605
class DocumentAnalysisError:
606
"""Error information from Document Intelligence API."""
607
code: str # Error code
608
message: str # Error message
609
target: Optional[str] # Error target
610
details: Optional[List['DocumentAnalysisError']] # Nested errors
611
innererror: Optional['DocumentAnalysisInnerError'] # Inner error details
612
613
class DocumentAnalysisInnerError:
614
"""Inner error details."""
615
code: str # Inner error code
616
message: str # Inner error message
617
innererror: Optional['DocumentAnalysisInnerError'] # Nested inner error
618
```
619
620
## Usage Examples
621
622
### Accessing Extracted Data
623
624
```python
625
# Legacy API - access form fields
626
for form in recognized_forms:
627
vendor_name = form.fields.get("VendorName")
628
if vendor_name and vendor_name.value:
629
print(f"Vendor: {vendor_name.value}")
630
print(f"Confidence: {vendor_name.confidence}")
631
632
# Access spatial information
633
if vendor_name.value_data:
634
print(f"Location: Page {vendor_name.value_data.page_number}")
635
bbox = vendor_name.value_data.bounding_box
636
print(f"Bounding box: {[(p.x, p.y) for p in bbox]}")
637
638
# Modern API - access document fields
639
for document in analyze_result.documents:
640
vendor_name = document.fields.get("VendorName")
641
if vendor_name and vendor_name.value:
642
print(f"Vendor: {vendor_name.value}")
643
print(f"Confidence: {vendor_name.confidence}")
644
645
# Access spatial information
646
if vendor_name.bounding_regions:
647
for region in vendor_name.bounding_regions:
648
print(f"Page {region.page_number}: {region.polygon}")
649
```
650
651
### Working with Tables
652
653
```python
654
# Legacy API tables
655
for table in form_page.tables:
656
print(f"Table: {table.row_count}x{table.column_count}")
657
for cell in table.cells:
658
print(f"Cell [{cell.row_index}, {cell.column_index}]: {cell.text}")
659
660
# Modern API tables
661
for table in analyze_result.tables:
662
print(f"Table: {table.row_count}x{table.column_count}")
663
if table.caption:
664
print(f"Caption: {table.caption}")
665
666
for cell in table.cells:
667
kind = cell.kind or "content"
668
print(f"{kind.title()} [{cell.row_index}, {cell.column_index}]: {cell.content}")
669
```